diff options
Diffstat (limited to 'remote.c')
-rw-r--r-- | remote.c | 30 |
1 files changed, 27 insertions, 3 deletions
@@ -38,6 +38,7 @@ static int branches_nr; static struct branch *current_branch; static const char *default_remote_name; +static int explicit_default_remote_name; static struct rewrite **rewrite; static int rewrite_alloc; @@ -104,6 +105,16 @@ static void add_url_alias(struct remote *remote, const char *url) add_url(remote, alias_url(url)); } +static struct remote *get_remote_by_name(const char *name) +{ + int i; + for (i = 0; i < remotes_nr; i++) { + if (!strcmp(name, remotes[i]->name)) + return remotes[i]; + } + return NULL; +} + static struct remote *make_remote(const char *name, int len) { struct remote *ret; @@ -330,8 +341,10 @@ static int handle_config(const char *key, const char *value, void *cb) if (!value) return config_error_nonbool(key); branch->remote_name = xstrdup(value); - if (branch == current_branch) + if (branch == current_branch) { default_remote_name = branch->remote_name; + explicit_default_remote_name = 1; + } } else if (!strcmp(subkey, ".merge")) { if (!value) return config_error_nonbool(key); @@ -643,11 +656,22 @@ static int valid_remote_nick(const char *name) struct remote *remote_get(const char *name) { struct remote *ret; + int name_given = 0; read_config(); - if (!name) + if (name) + name_given = 1; + else { name = default_remote_name; - ret = make_remote(name, 0); + name_given = explicit_default_remote_name; + } + if (name_given) + ret = make_remote(name, 0); + else { + ret = get_remote_by_name(name); + if (!ret) + return NULL; + } if (valid_remote_nick(name)) { if (!ret->url) read_remotes_file(ret); |