Thread (28 messages) flat view 28 messages, 10 authors, 2016-06-15
DORMANTno replies

[PATCH 4/3] provide a nice @{...} syntax to always mean the current branch reflog

From: Nicolas Pitre <hidden>
Date: 2016-06-15 22:42:52
Subsystem: the rest · Maintainer: Linus Torvalds

Possibly related (same subject, not in this thread)

This is shorter than HEAD@{...} and being nameless it has no semantic 
issues.

Signed-off-by: Nicolas Pitre <redacted>
---

On Thu, 1 Feb 2007, Matthias Lederhofer wrote:
Nicolas Pitre [off-list ref] wrote:
quoted
I really like "@{...}" to mean whatever branch I'm on.  Given that it 
has no real name it can happily change meaning with branch switches.
Ack.
Here it is, on top of my previous patches.
diff --git a/sha1_name.c b/sha1_name.c
index 70c6e42..de8caf8 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -279,7 +279,7 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 	/* basic@{time or number} format to query ref-log */
 	reflog_len = at = 0;
 	if (str[len-1] == '}') {
-		for (at = 1; at < len - 1; at++) {
+		for (at = 0; at < len - 1; at++) {
 			if (str[at] == '@' && str[at+1] == '{') {
 				reflog_len = (len-1) - (at+2);
 				len = at;
@@ -289,10 +289,14 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 	}
 
 	/* Accept only unambiguous ref paths. */
-	if (ambiguous_path(str, len))
+	if (len && ambiguous_path(str, len))
 		return -1;
 
-	refs_found = dwim_ref(str, len, sha1, &real_ref);
+	if (!len && reflog_len) {
+		/* allow "@{...}" to mean the current branch reflog */
+		refs_found = dwim_ref("HEAD", 4, sha1, &real_ref);
+	} else
+		refs_found = dwim_ref(str, len, sha1, &real_ref);
 
 	if (!refs_found)
 		return -1;
@@ -312,11 +316,12 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 		 * In the mean time prevent people from getting used to
 		 * such a synonym until the work is completed.
 		 */
-		if (!strncmp("HEAD", str, len) &&
+		if (len && !strncmp("HEAD", str, len) &&
 		    !strncmp(real_ref, "refs/", 5)) {
 			error("reflog for HEAD has not been implemented yet\n"
-			      "Maybe you could try %s%s instead.",
-			      strchr(real_ref+5, '/')+1, str + len);
+			      "Maybe you could try %s%s instead, "
+			      "or just %s for current branch..",
+			      strchr(real_ref+5, '/')+1, str+len, str+len);
 			exit(-1);
 		}
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help