1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-11 08:56:09 +02:00
git/promisor-remote.c
Christian Couder 48de315817 Add initial support for many promisor remotes
The promisor-remote.{c,h} files will contain functions to
manage many promisor remotes.

We expect that there will not be a lot of promisor remotes,
so it is ok to use a simple linked list to manage them.

Helped-by: Jeff King <peff@peff.net>
Helped-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-06-25 14:05:37 -07:00

93 lines
1.7 KiB
C

#include "cache.h"
#include "promisor-remote.h"
#include "config.h"
static struct promisor_remote *promisors;
static struct promisor_remote **promisors_tail = &promisors;
static struct promisor_remote *promisor_remote_new(const char *remote_name)
{
struct promisor_remote *r;
if (*remote_name == '/') {
warning(_("promisor remote name cannot begin with '/': %s"),
remote_name);
return NULL;
}
FLEX_ALLOC_STR(r, name, remote_name);
*promisors_tail = r;
promisors_tail = &r->next;
return r;
}
static struct promisor_remote *promisor_remote_lookup(const char *remote_name,
struct promisor_remote **previous)
{
struct promisor_remote *r, *p;
for (p = NULL, r = promisors; r; p = r, r = r->next)
if (!strcmp(r->name, remote_name)) {
if (previous)
*previous = p;
return r;
}
return NULL;
}
static int promisor_remote_config(const char *var, const char *value, void *data)
{
const char *name;
int namelen;
const char *subkey;
if (parse_config_key(var, "remote", &name, &namelen, &subkey) < 0)
return 0;
if (!strcmp(subkey, "promisor")) {
char *remote_name;
if (!git_config_bool(var, value))
return 0;
remote_name = xmemdupz(name, namelen);
if (!promisor_remote_lookup(remote_name, NULL))
promisor_remote_new(remote_name);
free(remote_name);
return 0;
}
return 0;
}
static void promisor_remote_init(void)
{
static int initialized;
if (initialized)
return;
initialized = 1;
git_config(promisor_remote_config, NULL);
}
struct promisor_remote *promisor_remote_find(const char *remote_name)
{
promisor_remote_init();
if (!remote_name)
return promisors;
return promisor_remote_lookup(remote_name, NULL);
}
int has_promisor_remote(void)
{
return !!promisor_remote_find(NULL);
}