Browse Source

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>
maint
Christian Couder 6 years ago committed by Junio C Hamano
parent
commit
48de315817
  1. 1
      Makefile
  2. 92
      promisor-remote.c
  3. 16
      promisor-remote.h

1
Makefile

@ -944,6 +944,7 @@ LIB_OBJS += preload-index.o @@ -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

@ -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);
}

16
promisor-remote.h

@ -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…
Cancel
Save