The rev spec forms @{}, .., ... fill in HEAD as the missing argument automatically. Unfortunately, HEAD~<n> is a very common idiom and there is no way to make HEAD implicit here (due the shell expansion of ~<n>).
However, there is an alternative solution to the issue: overload the character @ to mean HEAD. Do this at the lowest possible layer of abstraction: in dwim_ref(), substitute @ with HEAD just before calling resolve_ref_unsafe(). The program will only reach this point after the other specs like ~, ^ and @{} have been resolved; therefore, it is safe to do it here.
This patch has the exact same effect as:
$ git symbolic-ref @ HEAD
It means that you can now do @~1, @^2, and even topic..@. However, since the @-parsing happens before we ever reach the symref resolution, @@{u} is invalid. But this is okay, since @{u} already has an implicit HEAD in it.
Inspired-by: Felipe Contreras <felipe.contreras@gmail.com> Inspired-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com> --- I haven't included documentation/ tests because I want feedback on this two-liner first.
refs.c | 2 ++ 1 file changed, 2 insertions(+)
Show changes to refs.c +2 −0
diff --git a/refs.c b/refs.c index de2d8eb..cb67b73 100644 --- a/refs.c +++ b/refs.c @@ -1604,6 +1604,8 @@ int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref) this_result = refs_found ? sha1_from_ref : sha1; mksnpath(fullref, sizeof(fullref), *p, len, str); + if (!strcmp(fullref, "@")) + mksnpath(fullref, sizeof(fullref), *p, 4, "HEAD"); r = resolve_ref_unsafe(fullref, this_result, 1, &flag); if (r) { if (!refs_found++)
-- 1.8.2.1.628.gcd33b41.dirty