[PATCH 2/6] Add concept of 'publish' branch
The upstream branch is: branch.$name.remote branch.$name.merge The publish branch is: branch.$name.pushremote branch.$name.push Signed-off-by: Felipe Contreras felipe.contre...@gmail.com --- builtin/push.c | 19 +++ remote.c | 34 -- remote.h | 4 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/builtin/push.c b/builtin/push.c index 5dc06a3..f2deddf 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -150,6 +150,20 @@ static void setup_push_current(struct remote *remote, struct branch *branch) add_refspec(branch-name); } +static void setup_push_simple(struct remote *remote, struct branch *branch, + int triangular) +{ + if (branch-push_name) { + struct strbuf refspec = STRBUF_INIT; + strbuf_addf(refspec, %s:%s, branch-name, branch-push_name); + add_refspec(refspec.buf); + } else if (triangular) { + setup_push_current(remote, branch); + } else { + setup_push_upstream(remote, branch, triangular); + } +} + static char warn_unspecified_push_default_msg[] = N_(push.default is unset; its implicit value is changing in\n Git 2.0 from 'matching' to 'simple'. To squelch this message\n @@ -210,10 +224,7 @@ static void setup_default_push_refspecs(struct remote *remote) break; case PUSH_DEFAULT_SIMPLE: - if (triangular) - setup_push_current(remote, get_current_branch(remote)); - else - setup_push_upstream(remote, get_current_branch(remote), triangular); + setup_push_simple(remote, get_current_branch(remote), triangular); break; case PUSH_DEFAULT_UPSTREAM: diff --git a/remote.c b/remote.c index efcba93..04c7ed9 100644 --- a/remote.c +++ b/remote.c @@ -350,13 +350,17 @@ 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 = xstrdup(branch-pushremote_name); } else if (!strcmp(subkey, .merge)) { if (!value) return config_error_nonbool(key); add_merge(branch, xstrdup(value)); + } else if (!strcmp(subkey, .push)) { + if (git_config_string(branch-push_name, key, value)) + return -1; } return 0; } @@ -1492,6 +1496,14 @@ struct branch *branch_get(const char *name) } } } + if (ret ret-pushremote_name) { + struct remote *pushremote; + pushremote = pushremote_get(ret-pushremote_name); + ret-push.src = xstrdup(ret-push_name); + if (remote_find_tracking(pushremote, ret-push) +!strcmp(ret-pushremote_name, .)) + ret-push.dst = xstrdup(ret-push_name); + } return ret; } @@ -1694,6 +1706,15 @@ int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha1) return found; } +static char *get_base(struct branch *branch) +{ + if (branch-push.dst) + return branch-push.dst; + if (branch-merge branch-merge[0] branch-merge[0]-dst) + return branch-merge[0]-dst; + return NULL; +} + /* * Return true if there is anything to report, otherwise false. */ @@ -1710,15 +1731,16 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs) * Nothing to report unless we are marked to build on top of * somebody else. */ - if (!branch || - !branch-merge || !branch-merge[0] || !branch-merge[0]-dst) + if (!branch) + return 0; + base = get_base(branch); + if (!base) return 0; /* * If what we used to build on no longer exists, there is * nothing to report. */ - base = branch-merge[0]-dst; if (read_ref(base, sha1)) return 0; theirs = lookup_commit_reference(sha1); @@ -1781,7 +1803,7 @@ int format_tracking_info(struct branch *branch, struct strbuf *sb) if (!stat_tracking_info(branch, num_ours, num_theirs)) return 0; - base = branch-merge[0]-dst; + base = get_base(branch); base =
Re: [PATCH 2/6] Add concept of 'publish' branch
On Sun, Sep 1, 2013 at 4:26 AM, Felipe Contreras felipe.contre...@gmail.com wrote: The upstream branch is: branch.$name.remote branch.$name.merge The publish branch is: branch.$name.pushremote branch.$name.push Signed-off-by: Felipe Contreras felipe.contre...@gmail.com --- builtin/push.c | 19 +++ remote.c | 34 -- remote.h | 4 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/builtin/push.c b/builtin/push.c index 5dc06a3..f2deddf 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -150,6 +150,20 @@ static void setup_push_current(struct remote *remote, struct branch *branch) add_refspec(branch-name); } +static void setup_push_simple(struct remote *remote, struct branch *branch, + int triangular) +{ + if (branch-push_name) { + struct strbuf refspec = STRBUF_INIT; + strbuf_addf(refspec, %s:%s, branch-name, branch-push_name); + add_refspec(refspec.buf); strbuf_release(refspec); + } else if (triangular) { + setup_push_current(remote, branch); + } else { + setup_push_upstream(remote, branch, triangular); + } +} + static char warn_unspecified_push_default_msg[] = N_(push.default is unset; its implicit value is changing in\n Git 2.0 from 'matching' to 'simple'. To squelch this message\n @@ -210,10 +224,7 @@ static void setup_default_push_refspecs(struct remote *remote) break; case PUSH_DEFAULT_SIMPLE: - if (triangular) - setup_push_current(remote, get_current_branch(remote)); - else - setup_push_upstream(remote, get_current_branch(remote), triangular); + setup_push_simple(remote, get_current_branch(remote), triangular); break; case PUSH_DEFAULT_UPSTREAM: diff --git a/remote.c b/remote.c index efcba93..04c7ed9 100644 --- a/remote.c +++ b/remote.c @@ -350,13 +350,17 @@ 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 = xstrdup(branch-pushremote_name); } else if (!strcmp(subkey, .merge)) { if (!value) return config_error_nonbool(key); add_merge(branch, xstrdup(value)); + } else if (!strcmp(subkey, .push)) { + if (git_config_string(branch-push_name, key, value)) + return -1; } return 0; } @@ -1492,6 +1496,14 @@ struct branch *branch_get(const char *name) } } } + if (ret ret-pushremote_name) { + struct remote *pushremote; + pushremote = pushremote_get(ret-pushremote_name); + ret-push.src = xstrdup(ret-push_name); + if (remote_find_tracking(pushremote, ret-push) +!strcmp(ret-pushremote_name, .)) + ret-push.dst = xstrdup(ret-push_name); + } return ret; } @@ -1694,6 +1706,15 @@ int ref_newer(const unsigned char *new_sha1, const unsigned char *old_sha1) return found; } +static char *get_base(struct branch *branch) +{ + if (branch-push.dst) + return branch-push.dst; + if (branch-merge branch-merge[0] branch-merge[0]-dst) + return branch-merge[0]-dst; + return NULL; +} + /* * Return true if there is anything to report, otherwise false. */ @@ -1710,15 +1731,16 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs) * Nothing to report unless we are marked to build on top of * somebody else. */ - if (!branch || - !branch-merge || !branch-merge[0] || !branch-merge[0]-dst) + if (!branch) + return 0; + base = get_base(branch); + if (!base) return 0; /* * If what we used to build on no longer exists, there is * nothing to report. */ - base = branch-merge[0]-dst; if (read_ref(base, sha1)) return 0; theirs = lookup_commit_reference(sha1); @@ -1781,7 +1803,7 @@ int
Re: [PATCH 2/6] Add concept of 'publish' branch
On Sun, Sep 1, 2013 at 3:41 AM, Eric Sunshine sunsh...@sunshineco.com wrote: On Sun, Sep 1, 2013 at 4:26 AM, Felipe Contreras felipe.contre...@gmail.com wrote: +static void setup_push_simple(struct remote *remote, struct branch *branch, + int triangular) +{ + if (branch-push_name) { + struct strbuf refspec = STRBUF_INIT; + strbuf_addf(refspec, %s:%s, branch-name, branch-push_name); + add_refspec(refspec.buf); strbuf_release(refspec); Actually no, wee need that buffer. See setup_push_upstream(). -- Felipe Contreras -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html