summaryrefslogtreecommitdiff
path: root/sha1_name.c
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2013-05-07 17:04:31 -0500
committerJunio C Hamano <gitster@pobox.com>2013-05-08 12:13:12 -0700
commitcdfd94837b27c220f70f032b596ea993d195488f (patch)
treea3b5f7b61e29f5c0c011b1712ae77c9d9945d746 /sha1_name.c
parent7a0a49a7ca787433255280b66e7652b56f7beb6e (diff)
downloadgit-cdfd94837b27c220f70f032b596ea993d195488f.tar.gz
Add new @ shortcut for HEAD
Typing 'HEAD' is tedious, especially when we can use '@' instead. The reason for choosing '@' is that it follows naturally from the ref@op syntax (e.g. HEAD@{u}), except we have no ref, and no operation, and when we don't have those, it makes sens to assume 'HEAD'. So now we can use 'git show @~1', and all that goody goodness. Until now '@' was a valid name, but it conflicts with this idea, so let's make it invalid. Probably very few people, if any, used this name. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sha1_name.c')
-rw-r--r--sha1_name.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/sha1_name.c b/sha1_name.c
index f60c951234..4428df19a7 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -972,6 +972,17 @@ int get_sha1_mb(const char *name, unsigned char *sha1)
return st;
}
+/* parse @something syntax, when 'something' is not {.*} */
+static int interpret_empty_at(const char *name, int namelen, int len, struct strbuf *buf)
+{
+ if (len || name[1] == '{')
+ return -1;
+
+ strbuf_reset(buf);
+ strbuf_add(buf, "HEAD", 4);
+ return 1;
+}
+
static int reinterpret(const char *name, int namelen, int len, struct strbuf *buf)
{
/* we have extra data, which might need further processing */
@@ -1032,9 +1043,15 @@ int interpret_branch_name(const char *name, struct strbuf *buf)
cp = strchr(name, '@');
if (!cp)
return -1;
+
+ len = interpret_empty_at(name, namelen, cp - name, buf);
+ if (len > 0)
+ return reinterpret(name, namelen, len, buf);
+
tmp_len = upstream_mark(cp, namelen - (cp - name));
if (!tmp_len)
return -1;
+
len = cp + tmp_len - name;
cp = xstrndup(name, cp - name);
upstream = branch_get(*cp ? cp : NULL);