[PATCH 2/6] Teach remote.c about the remote.default configuration setting.
From: Marc Branchaud <marcnarc@xiplink.com>
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@xiplink.com>
---
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