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>
This commit is contained in:
parent
2e860675b6
commit
48de315817
1
Makefile
1
Makefile
@ -944,6 +944,7 @@ LIB_OBJS += preload-index.o
|
||||
LIB_OBJS += pretty.o
|
||||
LIB_OBJS += prio-queue.o
|
||||
LIB_OBJS += progress.o
|
||||
LIB_OBJS += promisor-remote.o
|
||||
LIB_OBJS += prompt.o
|
||||
LIB_OBJS += protocol.o
|
||||
LIB_OBJS += quote.o
|
||||
|
92
promisor-remote.c
Normal file
92
promisor-remote.c
Normal file
@ -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);
|
||||
}
|
16
promisor-remote.h
Normal file
16
promisor-remote.h
Normal file
@ -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
Block a user