git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 8/8] sha1_name: add support for @{publish} marks

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 20, 2014, 19:45 UTC
Message-ID
<1398023106-25958-9-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1398023106-25958-1-git-send-email-felipe.contreras@gmail.com>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 Documentation/revisions.txt |  4 ++++
 sha1_name.c                 | 49 ++++++++++++++++++++++++++++-----------------
 t/t1508-at-combinations.sh  |  5 +++++
 3 files changed, 40 insertions(+), 18 deletions(-)
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index 5a286d0..fd01cb4 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -96,6 +96,10 @@ some output processing may assume ref names in UTF-8.
   refers to the branch that the branch specified by branchname is set to build on
   top of.  A missing branchname defaults to the current one.
 
+'<branchname>@\{publish\}', e.g. 'master@\{publish\}', '@\{p\}'::
+  The suffix '@\{publish\}' to a branchname refers to the remote branch to
+  push to. A missing branchname defaults to the current one.
+
 '<rev>{caret}', e.g. 'HEAD{caret}, v1.5.1{caret}0'::
   A suffix '{caret}' to a revision parameter means the first parent of
   that commit object.  '{caret}<n>' means the <n>th parent (i.e.
diff --git a/sha1_name.c b/sha1_name.c
index aa3f3e0..a36852d 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -415,9 +415,9 @@ static int ambiguous_path(const char *path, int len)
 	return slash;
 }
 
-static inline int upstream_mark(const char *string, int len)
+static inline int tracking_mark(const char *string, int len)
 {
-	const char *suffix[] = { "upstream", "u" };
+	const char *suffix[] = { "upstream", "u", "publish", "p" };
 	int i;
 
 	for (i = 0; i < ARRAY_SIZE(suffix); i++) {
@@ -475,7 +475,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 					nth_prior = 1;
 					continue;
 				}
-				if (!upstream_mark(str + at + 2, len - at - 3)) {
+				if (!tracking_mark(str + at + 2, len - at - 3)) {
 					reflog_len = (len-1) - (at+2);
 					len = at;
 				}
@@ -1057,10 +1057,11 @@ static void set_shortened_ref(struct strbuf *buf, const char *ref)
 	free(s);
 }
 
-static const char *get_upstream_branch(const char *name_buf, int len)
+static const char *get_tracking_branch(const char *name_buf, int len, char type)
 {
 	char *name = xstrndup(name_buf, len);
 	struct branch *branch = branch_get(*name ? name : NULL);
+	char *tracking = NULL;
 
 	/*
 	 * Upstream can be NULL only if branch refers to HEAD and HEAD
@@ -1068,23 +1069,35 @@ static const char *get_upstream_branch(const char *name_buf, int len)
 	 */
 	if (!branch)
 		die(_("HEAD does not point to a branch"));
-	if (!branch->merge || !branch->merge[0]->dst) {
-		if (!ref_exists(branch->refname))
-			die(_("No such branch: '%s'"), name);
-		if (!branch->merge) {
-			die(_("No upstream configured for branch '%s'"),
-				branch->name);
+	switch (type) {
+	case 'u':
+		if (!branch->merge || !branch->merge[0]->dst) {
+			if (!ref_exists(branch->refname))
+				die(_("No such branch: '%s'"), name);
+			if (!branch->merge) {
+				die(_("No upstream configured for branch '%s'"),
+					branch->name);
+			}
+			die(
+				_("Upstream branch '%s' not stored as a remote-tracking branch"),
+				branch->merge[0]->src);
+		}
+		tracking = branch->merge[0]->dst;
+		break;
+	case 'p':
+		if (!branch->push.dst) {
+			die(_("No publish configured for branch '%s'"),
+					branch->name);
 		}
-		die(
-			_("Upstream branch '%s' not stored as a remote-tracking branch"),
-			branch->merge[0]->src);
+		tracking = branch->push.dst;
+		break;
 	}
 	free(name);
 
-	return branch->merge[0]->dst;
+	return tracking;
 }
 
-static int interpret_upstream_mark(const char *name, int namelen,
+static int interpret_tracking_mark(const char *name, int namelen,
 				   int at, struct strbuf *buf)
 {
 	int len;
@@ -1092,14 +1105,14 @@ static int interpret_upstream_mark(const char *name, int namelen,
 	if (name[at + 1] != '{' || name[namelen - 1] != '}')
 		return -1;
 
-	len = upstream_mark(name + at + 2, namelen - at - 3);
+	len = tracking_mark(name + at + 2, namelen - at - 3);
 	if (!len)
 		return -1;
 
 	if (memchr(name, ':', at))
 		return -1;
 
-	set_shortened_ref(buf, get_upstream_branch(name, at));
+	set_shortened_ref(buf, get_tracking_branch(name, at, name[at + 2]));
 	return len + at + 3;
 }
 
@@ -1150,7 +1163,7 @@ int interpret_branch_name(const char *name, int namelen, struct strbuf *buf)
 		if (len > 0)
 			return reinterpret(name, namelen, len, buf);
 
-		len = interpret_upstream_mark(name, namelen, at - name, buf);
+		len = interpret_tracking_mark(name, namelen, at - name, buf);
 		if (len > 0)
 			return len;
 	}
diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh
index 078e119..f67aab3 100755
--- a/t/t1508-at-combinations.sh
+++ b/t/t1508-at-combinations.sh
@@ -32,6 +32,7 @@ fail() {
 test_expect_success 'setup' '
 	test_commit master-one &&
 	test_commit master-two &&
+	git checkout -b publish-branch &&
 	git checkout -b upstream-branch &&
 	test_commit upstream-one &&
 	test_commit upstream-two &&
@@ -46,6 +47,7 @@ test_expect_success 'setup' '
 	test_commit new-two &&
 	git branch -u master old-branch &&
 	git branch -u upstream-branch new-branch
+	git branch -p publish-branch new-branch
 '
 
 check HEAD ref refs/heads/new-branch
@@ -61,8 +63,11 @@ check "HEAD@{u}" ref refs/heads/upstream-branch
 check "@{u}@{1}" commit upstream-one
 check "@{-1}@{u}" ref refs/heads/master
 check "@{-1}@{u}@{1}" commit master-one
+check "@{p}" ref refs/heads/publish-branch
+check "HEAD@{p}" ref refs/heads/publish-branch
 check "@" commit new-two
 check "@@{u}" ref refs/heads/upstream-branch
+check "@@{p}" ref refs/heads/publish-branch
 check "@@/at-test" ref refs/heads/@@/at-test
 check "@/at-test" ref refs/heads/@/at-test
 check "@at-test" ref refs/heads/@at-test
-- 
1.9.1+fc3.9.gc73078e
Previous: Felipe Contreras
Message 9 of 9 in “Introduce publish tracking branch”
  1. 0/8 Introduce publish tracking branchFelipe Contreras, Apr 20, 2014
  2. 1/8 t5516 (fetch-push): fix test restorationFelipe Contreras, Apr 20, 2014
  3. 2/8 Add concept of 'publish' branchFelipe Contreras, Apr 20, 2014
  4. 3/8 branch: add --set-publish-to optionFelipe Contreras, Apr 20, 2014
  5. 4/8 push: add --set-publish optionFelipe Contreras, Apr 20, 2014
  6. 5/8 branch: display publish branchFelipe Contreras, Apr 20, 2014
  7. 6/8 sha1_name: cleanup interpret_branch_name()Felipe Contreras, Apr 20, 2014
  8. 7/8 sha1_name: simplify track findingFelipe Contreras, Apr 20, 2014
  9. 8/8 sha1_name: add support for @{publish} marksFelipe Contreras, Apr 20, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.