Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Showing
3 changed files
with
109 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 */ |