зеркало из https://github.com/microsoft/git.git
93 строки
1.7 KiB
C
93 строки
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);
|
|
}
|