@ -5,12 +5,10 @@
@@ -5,12 +5,10 @@
#include "transport.h"
#include "strvec.h"
static char *repository_format_partial_clone;
void set_repository_format_partial_clone(char *partial_clone)
{
repository_format_partial_clone = xstrdup_or_null(partial_clone);
}
struct promisor_remote_config {
struct promisor_remote *promisors;
struct promisor_remote **promisors_tail;
};
static int fetch_objects(struct repository *repo,
const char *remote_name,
@ -23,6 +21,8 @@ static int fetch_objects(struct repository *repo,
@@ -23,6 +21,8 @@ static int fetch_objects(struct repository *repo,
child.git_cmd = 1;
child.in = -1;
if (repo != the_repository)
prepare_other_repo_env(&child.env_array, repo->gitdir);
strvec_pushl(&child.args, "-c", "fetch.negotiationAlgorithm=noop",
"fetch", remote_name, "--no-tags",
"--no-write-fetch-head", "--recurse-submodules=no",
@ -45,10 +45,8 @@ static int fetch_objects(struct repository *repo,
@@ -45,10 +45,8 @@ static int fetch_objects(struct repository *repo,
return finish_command(&child) ? -1 : 0;
}
static struct promisor_remote *promisors;
static struct promisor_remote **promisors_tail = &promisors;
static struct promisor_remote *promisor_remote_new(const char *remote_name)
static struct promisor_remote *promisor_remote_new(struct promisor_remote_config *config,
const char *remote_name)
{
struct promisor_remote *r;
@ -60,18 +58,19 @@ static struct promisor_remote *promisor_remote_new(const char *remote_name)
@@ -60,18 +58,19 @@ static struct promisor_remote *promisor_remote_new(const char *remote_name)
FLEX_ALLOC_STR(r, name, remote_name);
*promisors_tail = r;
promisors_tail = &r->next;
*config->promisors_tail = r;
config->promisors_tail = &r->next;
return r;
}
static struct promisor_remote *promisor_remote_lookup(const char *remote_name,
static struct promisor_remote *promisor_remote_lookup(struct promisor_remote_config *config,
const char *remote_name,
struct promisor_remote **previous)
{
struct promisor_remote *r, *p;
for (p = NULL, r = promisors; r; p = r, r = r->next)
for (p = NULL, r = config->promisors; r; p = r, r = r->next)
if (!strcmp(r->name, remote_name)) {
if (previous)
*previous = p;
@ -81,7 +80,8 @@ static struct promisor_remote *promisor_remote_lookup(const char *remote_name,
@@ -81,7 +80,8 @@ static struct promisor_remote *promisor_remote_lookup(const char *remote_name,
return NULL;
}
static void promisor_remote_move_to_tail(struct promisor_remote *r,
static void promisor_remote_move_to_tail(struct promisor_remote_config *config,
struct promisor_remote *r,
struct promisor_remote *previous)
{
if (r->next == NULL)
@ -90,14 +90,15 @@ static void promisor_remote_move_to_tail(struct promisor_remote *r,
@@ -90,14 +90,15 @@ static void promisor_remote_move_to_tail(struct promisor_remote *r,
if (previous)
previous->next = r->next;
else
promisors = r->next ? r->next : r;
config->promisors = r->next ? r->next : r;
r->next = NULL;
*promisors_tail = r;
promisors_tail = &r->next;
*config->promisors_tail = r;
config->promisors_tail = &r->next;
}
static int promisor_remote_config(const char *var, const char *value, void *data)
{
struct promisor_remote_config *config = data;
const char *name;
size_t namelen;
const char *subkey;
@ -113,8 +114,8 @@ static int promisor_remote_config(const char *var, const char *value, void *data
@@ -113,8 +114,8 @@ static int promisor_remote_config(const char *var, const char *value, void *data
remote_name = xmemdupz(name, namelen);
if (!promisor_remote_lookup(remote_name, NULL))
promisor_remote_new(remote_name);
if (!promisor_remote_lookup(config, remote_name, NULL))
promisor_remote_new(config, remote_name);
free(remote_name);
return 0;
@ -123,9 +124,9 @@ static int promisor_remote_config(const char *var, const char *value, void *data
@@ -123,9 +124,9 @@ static int promisor_remote_config(const char *var, const char *value, void *data
struct promisor_remote *r;
char *remote_name = xmemdupz(name, namelen);
r = promisor_remote_lookup(remote_name, NULL);
r = promisor_remote_lookup(config, remote_name, NULL);
if (!r)
r = promisor_remote_new(remote_name);
r = promisor_remote_new(config, remote_name);
free(remote_name);
@ -138,59 +139,63 @@ static int promisor_remote_config(const char *var, const char *value, void *data
@@ -138,59 +139,63 @@ static int promisor_remote_config(const char *var, const char *value, void *data
return 0;
}
static int initialized;
static void promisor_remote_init(void)
static void promisor_remote_init(struct repository *r)
{
if (initialized)
struct promisor_remote_config *config;
if (r->promisor_remote_config)
return;
initialized = 1;
config = r->promisor_remote_config =
xcalloc(sizeof(*r->promisor_remote_config), 1);
config->promisors_tail = &config->promisors;
git_config(promisor_remote_config, NULL);
repo_config(r, promisor_remote_config, config);
if (repository_format_partial_clone) {
if (r->repository_format_partial_clone) {
struct promisor_remote *o, *previous;
o = promisor_remote_lookup(repository_format_partial_clone,
o = promisor_remote_lookup(config,
r->repository_format_partial_clone,
&previous);
if (o)
promisor_remote_move_to_tail(o, previous);
promisor_remote_move_to_tail(config, o, previous);
else
promisor_remote_new(repository_format_partial_clone);
promisor_remote_new(config, r->repository_format_partial_clone);
}
}
static void promisor_remote_clear(void)
void promisor_remote_clear(struct promisor_remote_config *config)
{
while (promisors) {
struct promisor_remote *r = promisors;
promisors = promisors->next;
while (config->promisors) {
struct promisor_remote *r = config->promisors;
config->promisors = config->promisors->next;
free(r);
}
promisors_tail = &promisors;
config->promisors_tail = &config->promisors;
}
void promisor_remote_reinit(void)
void repo_promisor_remote_reinit(struct repository *r)
{
initialized = 0;
promisor_remote_clear();
promisor_remote_init();
promisor_remote_clear(r->promisor_remote_config);
FREE_AND_NULL(r->promisor_remote_config);
promisor_remote_init(r);
}
struct promisor_remote *promisor_remote_find(const char *remote_name)
struct promisor_remote *repo_promisor_remote_find(struct repository *r,
const char *remote_name)
{
promisor_remote_init();
promisor_remote_init(r);
if (!remote_name)
return promisors;
return r->promisor_remote_config->promisors;
return promisor_remote_lookup(remote_name, NULL);
return promisor_remote_lookup(r->promisor_remote_config, remote_name, NULL);
}
int has_promisor_remote(void)
int repo_has_promisor_remote(struct repository *r)
{
return !!promisor_remote_find(NULL);
return !!repo_promisor_remote_find(r, NULL);
}
static int remove_fetched_oids(struct repository *repo,
@ -238,9 +243,9 @@ int promisor_remote_get_direct(struct repository *repo,
@@ -238,9 +243,9 @@ int promisor_remote_get_direct(struct repository *repo,
if (oid_nr == 0)
return 0;
promisor_remote_init();
promisor_remote_init(repo);
for (r = promisors; r; r = r->next) {
for (r = repo->promisor_remote_config->promisors; r; r = r->next) {
if (fetch_objects(repo, r->name, remaining_oids, remaining_nr) < 0) {
if (remaining_nr == 1)
continue;