diff options
author | Jeff King <peff@peff.net> | 2014-01-08 04:35:31 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2014-01-09 15:22:30 -0800 |
commit | 7819d1c731de1b7f98ffbb411b4c8a4ab52a044a (patch) | |
tree | fe45e39fb159735d09240502f24e0909370dad1b | |
parent | 30dc84c2f19355d735a67f0b23087e21d079fc52 (diff) | |
download | git-7819d1c731de1b7f98ffbb411b4c8a4ab52a044a.tar.gz |
branch_get: provide per-branch pushremote pointers
When a caller uses branch_get to retrieve a "struct branch",
they get the per-branch remote name and a pointer to the
remote struct. However, they have no way of knowing about
the per-branch pushremote from this interface.
Let's expose that information via fields similar to
"remote" and "remote_name".
We have to do a little refactoring around the configuration
reading here. Instead of pushremote_name being its own
allocated string, it instead becomes a pointer to one of:
1. The pushremote_name of the current branch, if
configured.
2. The globally configured remote.pushdefault, which we
store separately as pushremote_config_default.
We can then set the branch's "pushremote" field by doing the
normal sequence of config fallback.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | remote.c | 24 | ||||
-rw-r--r-- | remote.h | 2 |
2 files changed, 22 insertions, 4 deletions
@@ -50,6 +50,7 @@ static int branches_nr; static struct branch *current_branch; static const char *default_remote_name; static const char *pushremote_name; +static const char *pushremote_config_default; static int explicit_default_remote_name; static struct rewrites rewrites; @@ -351,9 +352,10 @@ static int handle_config(const char *key, const char *value, void *cb) explicit_default_remote_name = 1; } } else if (!strcmp(subkey, ".pushremote")) { + if (git_config_string(&branch->pushremote_name, key, value)) + return -1; if (branch == current_branch) - if (git_config_string(&pushremote_name, key, value)) - return -1; + pushremote_name = branch->pushremote_name; } else if (!strcmp(subkey, ".merge")) { if (!value) return config_error_nonbool(key); @@ -385,8 +387,12 @@ static int handle_config(const char *key, const char *value, void *cb) name = key + 7; /* Handle remote.* variables */ - if (!strcmp(name, "pushdefault")) - return git_config_string(&pushremote_name, key, value); + if (!strcmp(name, "pushdefault")) { + if (git_config_string(&pushremote_config_default, key, value) < 0) + return -1; + pushremote_name = pushremote_config_default; + return 0; + } /* Handle remote.<name>.* variables */ if (*name == '/') { @@ -1560,6 +1566,16 @@ struct branch *branch_get(const char *name) } } } + + if (ret->pushremote_name) + ret->pushremote = remote_get(ret->pushremote_name); + else if (pushremote_config_default) + ret->pushremote = remote_get(pushremote_config_default); + else if (ret->remote_name) + ret->pushremote = remote_get(ret->remote_name); + else + ret->pushremote = remote_get(NULL); + return ret; } @@ -200,6 +200,8 @@ struct branch { const char *remote_name; struct remote *remote; + const char *pushremote_name; + struct remote *pushremote; const char **merge_name; struct refspec **merge; |