From: Marc Branchaud <marcnarc@xxxxxxxxxxx> The code now has a default_remote_name and an effective_remote_name: - default_remote_name is set by remote.default in the config, or is "origin" if remote.default doesn't exist ("origin" was the fallback value before this change). - effective_remote_name is the name of the remote tracked by the current branch, or is default_remote_name if the current branch doesn't have a remote. Also add two new helper functions for other code modules to use: - remote_get_default_name() returns default_remote_name. - remote_count() returns the number of remotes. Signed-off-by: Marc Branchaud <marcnarc@xxxxxxxxxxx> --- remote.c | 27 ++++++++++++++++++++++++--- remote.h | 2 ++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/remote.c b/remote.c index 6f371e0..ccada0d 100644 --- a/remote.c +++ b/remote.c @@ -47,6 +47,7 @@ static int branches_alloc; static int branches_nr; static struct branch *current_branch; +static const char *default_remote_name; static const char *effective_remote_name; static int explicit_effective_remote_name; @@ -390,6 +391,7 @@ static int handle_config(const char *key, const char *value, void *cb) } if (prefixcmp(key, "remote.")) return 0; + name = key + 7; if (*name == '/') { warning("Config remote shorthand cannot begin with '/': %s", @@ -397,8 +399,12 @@ static int handle_config(const char *key, const char *value, void *cb) return 0; } subkey = strrchr(name, '.'); - if (!subkey) + if (!subkey) { + /* Look for remote.default */ + if (!strcmp(name, "default")) + default_remote_name = xstrdup(value); return 0; + } remote = make_remote(name, subkey - name); remote->origin = REMOTE_CONFIG; if (!strcmp(subkey, ".mirror")) @@ -481,9 +487,8 @@ static void read_config(void) unsigned char sha1[20]; const char *head_ref; int flag; - if (effective_remote_name) /* did this already */ + if (default_remote_name) /* did this already */ return; - effective_remote_name = xstrdup("origin"); current_branch = NULL; head_ref = resolve_ref_unsafe("HEAD", sha1, 0, &flag); if (head_ref && (flag & REF_ISSYMREF) && @@ -492,6 +497,10 @@ static void read_config(void) make_branch(head_ref + strlen("refs/heads/"), 0); } git_config(handle_config, NULL); + if (!default_remote_name) + default_remote_name = "origin"; + if (!effective_remote_name) + effective_remote_name = default_remote_name; alias_all_urls(); } @@ -671,6 +680,18 @@ static int valid_remote_nick(const char *name) return !strchr(name, '/'); /* no slash */ } +const char *remote_get_default_name() +{ + read_config(); + return default_remote_name; +} + +int remote_count() +{ + read_config(); + return remotes_nr; +} + struct remote *remote_get(const char *name) { struct remote *ret; diff --git a/remote.h b/remote.h index 251d8fd..f9aac87 100644 --- a/remote.h +++ b/remote.h @@ -52,6 +52,8 @@ struct remote { struct remote *remote_get(const char *name); int remote_is_configured(const char *name); +const char *remote_get_default_name(); +int remote_count(); typedef int each_remote_fn(struct remote *remote, void *priv); int for_each_remote(each_remote_fn fn, void *priv); -- 1.7.11.1 -- 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