Skip to content

Commit

Permalink
Add initial support for many promisor remotes
Browse files Browse the repository at this point in the history
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
chriscool authored and gitster committed Apr 15, 2019
1 parent c743a1b commit 5424870
Show file tree
Hide file tree
Showing 3 changed files with 109 additions and 0 deletions.
1 change: 1 addition & 0 deletions Makefile
Expand Up @@ -953,6 +953,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
Expand Down
92 changes: 92 additions & 0 deletions promisor-remote.c
@@ -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 changes: 16 additions & 0 deletions promisor-remote.h
@@ -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 */

0 comments on commit 5424870

Please sign in to comment.