Browse Source
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>maint
Christian Couder
6 years ago
committed by
Junio C Hamano
3 changed files with 109 additions and 0 deletions
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
#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); |
||||
} |
@ -0,0 +1,16 @@
@@ -0,0 +1,16 @@
|
||||
#ifndef PROMISOR_REMOTE_H |
||||
#define PROMISOR_REMOTE_H |
||||
|
||||
/* |
||||
* Promisor remote linked list |
||||
* Its information come from remote.XXX config entries. |
||||
*/ |
||||
struct promisor_remote { |
||||
struct promisor_remote *next; |
||||
const char name[FLEX_ARRAY]; |
||||
}; |
||||
|
||||
extern struct promisor_remote *promisor_remote_find(const char *remote_name); |
||||
extern int has_promisor_remote(void); |
||||
|
||||
#endif /* PROMISOR_REMOTE_H */ |
Loading…
Reference in new issue