Add an int that allows for a way of setting a fetch order for remotes, mainly for the use case of "git remote update" which updates every remote. This way, users can set local mirrors of repositories first to quickly get a bunch of objects, and later the upstream repo to make sure that they pulled the latest commit. Signed-off-by: Guido Martínez <mtzguido@xxxxxxxxx> --- Documentation/config.txt | 5 +++++ builtin/fetch.c | 2 +- remote.c | 43 +++++++++++++++++++++++++++++++++++++++---- remote.h | 2 ++ 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 42d2b50..5ca199c 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -2489,6 +2489,11 @@ remote.<name>.fetch:: The default set of "refspec" for linkgit:git-fetch[1]. See linkgit:git-fetch[1]. +remote.<name>.fetchprio:: + Set a priority for fetching this remote, to allow you to set + a custom order when doing "git fetch --all" (thus also when + running "git remote update"). Default value is 50. + remote.<name>.push:: The default set of "refspec" for linkgit:git-push[1]. See linkgit:git-push[1]. diff --git a/builtin/fetch.c b/builtin/fetch.c index f8455bd..44f42bf 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -1187,7 +1187,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) die(_("fetch --all does not take a repository argument")); else if (argc > 1) die(_("fetch --all does not make sense with refspecs")); - (void) for_each_remote(get_one_remote_for_fetch, &list); + (void) for_each_sorted_remote(get_one_remote_for_fetch, &list); result = fetch_multiple(&list); } else if (argc == 0) { /* No arguments -- use default remote */ diff --git a/remote.c b/remote.c index 28fd676..3b9f20a 100644 --- a/remote.c +++ b/remote.c @@ -168,6 +168,7 @@ static struct remote *make_remote(const char *name, int len) ALLOC_GROW(remotes, remotes_nr + 1, remotes_alloc); remotes[remotes_nr++] = ret; ret->name = xstrndup(name, len); + ret->fetch_prio = 50; hashmap_entry_init(ret, lookup_entry.hash); replaced = hashmap_put(&remotes_hash, ret); @@ -375,6 +376,8 @@ static int handle_config(const char *key, const char *value, void *cb) remote->mirror = git_config_bool(key, value); else if (!strcmp(subkey, "skipdefaultupdate")) remote->skip_default_update = git_config_bool(key, value); + else if (!strcmp(subkey, "fetchprio")) + remote->fetch_prio = git_config_int(key, value); else if (!strcmp(subkey, "skipfetchall")) remote->skip_default_update = git_config_bool(key, value); else if (!strcmp(subkey, "prune")) @@ -719,12 +722,12 @@ int remote_is_configured(struct remote *remote) return remote && remote->origin; } -int for_each_remote(each_remote_fn fn, void *priv) +static int for_each_remote_do(struct remote **rlist, int len, + each_remote_fn fn, void *priv) { int i, result = 0; - read_config(); - for (i = 0; i < remotes_nr && !result; i++) { - struct remote *r = remotes[i]; + for (i = 0; i < len && !result; i++) { + struct remote *r = rlist[i]; if (!r) continue; if (!r->fetch) @@ -738,6 +741,38 @@ int for_each_remote(each_remote_fn fn, void *priv) return result; } +int for_each_remote(each_remote_fn fn, void *priv) +{ + read_config(); + return for_each_remote_do(remotes, remotes_nr, fn, priv); +} + +int compare_fetch_prio(const void *p, const void *q) +{ + const struct remote *pp = *(struct remote**)p; + const struct remote *qq = *(struct remote**)q; + + return pp->fetch_prio - qq->fetch_prio; +} + +int for_each_sorted_remote(each_remote_fn fn, void *priv) +{ + struct remote **sr; + int i, rc; + + read_config(); + + sr = xmalloc(sizeof (struct remote*) * remotes_nr); + for (i = 0; i < remotes_nr; i++) + sr[i] = remotes[i]; + + qsort(sr, remotes_nr, sizeof (struct remote*), compare_fetch_prio); + + rc = for_each_remote_do(sr, remotes_nr, fn, priv); + free(sr); + return rc; +} + static void handle_duplicate(struct ref *ref1, struct ref *ref2) { if (strcmp(ref1->name, ref2->name)) { diff --git a/remote.h b/remote.h index c21fd37..09b48e4 100644 --- a/remote.h +++ b/remote.h @@ -47,6 +47,7 @@ struct remote { int skip_default_update; int mirror; int prune; + int fetch_prio; const char *receivepack; const char *uploadpack; @@ -64,6 +65,7 @@ int remote_is_configured(struct remote *remote); typedef int each_remote_fn(struct remote *remote, void *priv); int for_each_remote(each_remote_fn fn, void *priv); +int for_each_sorted_remote(each_remote_fn fn, void *priv); int remote_has_url(struct remote *remote, const char *url); -- 2.8.1.281.g0994585 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html