summaryrefslogtreecommitdiff
path: root/sha1_name.c
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2013-09-02 01:34:30 -0500
committerJunio C Hamano <gitster@pobox.com>2013-09-12 14:39:34 -0700
commit9ba89f484e023827eca6ad44baf69af37dac4db3 (patch)
tree412e36de2f9e033c1705bed8d21ed7aac3ad379f /sha1_name.c
parentcf99a761d3903dbaf8265f60da9eaee6a15a6fe6 (diff)
downloadgit-9ba89f484e023827eca6ad44baf69af37dac4db3.tar.gz
Add new @ shortcut for HEADfc/at-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.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sha1_name.c b/sha1_name.c
index 93197b91e3..a0b59235a9 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -1004,6 +1004,28 @@ 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)
+{
+ const char *next;
+
+ if (len || name[1] == '{')
+ return -1;
+
+ /* make sure it's a single @, or @@{.*}, not @foo */
+ next = strchr(name + len + 1, '@');
+ if (next && next[1] != '{')
+ return -1;
+ if (!next)
+ next = name + namelen;
+ if (next != 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 */
@@ -1068,9 +1090,15 @@ int interpret_branch_name(const char *name, int namelen, 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);