diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-09-20 12:38:10 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-09-20 12:38:10 -0700 |
commit | f406140baa5128bfa537c271c7292a866c08b7d4 (patch) | |
tree | c52ee64bfc197e86ee928f8e40056f46ab0f7be9 /sha1_name.c | |
parent | 005a1de380733477382c50e2e44ed8042c401fed (diff) | |
parent | 9ba89f484e023827eca6ad44baf69af37dac4db3 (diff) | |
download | git-f406140baa5128bfa537c271c7292a866c08b7d4.tar.gz |
Merge branch 'fc/at-head'
Instead of typing four capital letters "HEAD", you can say "@" now,
e.g. "git log @".
* fc/at-head:
Add new @ shortcut for HEAD
sha1-name: pass len argument to interpret_branch_name()
Diffstat (limited to 'sha1_name.c')
-rw-r--r-- | sha1_name.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/sha1_name.c b/sha1_name.c index 78c093f79e..0e5fe7f937 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -1006,6 +1006,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 */ @@ -1014,7 +1036,7 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu int ret; strbuf_add(buf, name + len, namelen - len); - ret = interpret_branch_name(buf->buf, &tmp); + ret = interpret_branch_name(buf->buf, buf->len, &tmp); /* that data was not interpreted, remove our cruft */ if (ret < 0) { strbuf_setlen(buf, used); @@ -1048,14 +1070,16 @@ static int reinterpret(const char *name, int namelen, int len, struct strbuf *bu * If the input was ok but there are not N branch switches in the * reflog, it returns 0. */ -int interpret_branch_name(const char *name, struct strbuf *buf) +int interpret_branch_name(const char *name, int namelen, struct strbuf *buf) { char *cp; struct branch *upstream; - int namelen = strlen(name); int len = interpret_nth_prior_checkout(name, buf); int tmp_len; + if (!namelen) + namelen = strlen(name); + if (!len) { return len; /* syntax Ok, not enough switches */ } else if (len > 0) { @@ -1068,9 +1092,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); @@ -1102,7 +1132,7 @@ int interpret_branch_name(const char *name, struct strbuf *buf) int strbuf_branchname(struct strbuf *sb, const char *name) { int len = strlen(name); - int used = interpret_branch_name(name, sb); + int used = interpret_branch_name(name, len, sb); if (used == len) return 0; |