git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 5/6] Add new @ shortcut for HEAD

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Apr 30, 2013, 21:49 UTC
Message-ID
<1367358554-4257-6-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1367358554-4257-1-git-send-email-felipe.contreras@gmail.com>

So HEAD@{0}~0^0 is too much to type, but we can remove '^0', and we can remove '~0', and we can remove 'HEAD', which leaves us with @{0}, but we can't remove '{0}'?

This patch allows '@' to be the same as '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 lets make it invalid. Very few people if any probably used this name, if they did, they can rename it by using the full-path (e.g. refs/heads/@).

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 Documentation/git-check-ref-format.txt | 2 ++
 Documentation/revisions.txt            | 3 +++
 refs.c                                 | 4 ++++
 sha1_name.c                            | 6 +++++-
 t/t1508-at-combinations.sh             | 3 +++
 5 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt
index ec1739a..e8035ec 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.txt
@@ -54,6 +54,8 @@ Git imposes the following rules on how references are named:
 
 . They cannot contain a sequence `@{`.
 
+. They cannot be the single character `@`.
+
 . They cannot contain a `\`.
 
 These rules make it easy for shell script based tools to parse
diff --git a/Documentation/revisions.txt b/Documentation/revisions.txt
index d477b3f..09896a3 100644
--- a/Documentation/revisions.txt
+++ b/Documentation/revisions.txt
@@ -58,6 +58,9 @@ the '$GIT_DIR/refs' directory or from the '$GIT_DIR/packed-refs' file.
 While the ref name encoding is unspecified, UTF-8 is preferred as
 some output processing may assume ref names in UTF-8.
 
+'@'::
+  '@' alone is a shortcut for 'HEAD'.
+
 '<refname>@\{<date>\}', e.g. 'master@\{yesterday\}', 'HEAD@\{5 minutes ago\}'::
   A ref followed by the suffix '@' with a date specification
   enclosed in a brace
diff --git a/refs.c b/refs.c
index de2d8eb..4e70b3e 100644
--- a/refs.c
+++ b/refs.c
@@ -72,6 +72,10 @@ int check_refname_format(const char *refname, int flags)
 {
 	int component_len, component_count = 0;
 
+	if (!strcmp(refname, "@"))
+		/* Refname is a single character '@'. */
+		return -1;
+
 	while (1) {
 		/* We are at the start of a path component. */
 		component_len = check_refname_component(refname, flags);
diff --git a/sha1_name.c b/sha1_name.c
index 76e3219..887de6c 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -437,11 +437,13 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 	static const char *warn_msg = "refname '%.*s' is ambiguous.";
 	char *real_ref = NULL;
 	int refs_found = 0;
-	int at, reflog_len;
+	int at, reflog_len, only_at;
 
 	if (len == 40 && !get_sha1_hex(str, sha1))
 		return 0;
 
+	only_at = len == 1 && str[0] == '@';
+
 	/* basic@{time or number or -number} format to query ref-log */
 	reflog_len = at = 0;
 	if (len && str[len-1] == '}') {
@@ -474,6 +476,8 @@ static int get_sha1_basic(const char *str, int len, unsigned char *sha1)
 		refs_found = dwim_ref("HEAD", 4, sha1, &real_ref);
 	} else if (reflog_len)
 		refs_found = dwim_log(str, len, sha1, &real_ref);
+	else if (only_at)
+		refs_found = dwim_ref("HEAD", 4, sha1, &real_ref);
 	else
 		refs_found = dwim_ref(str, len, sha1, &real_ref);
 
diff --git a/t/t1508-at-combinations.sh b/t/t1508-at-combinations.sh
index d5d6244..50035cd 100755
--- a/t/t1508-at-combinations.sh
+++ b/t/t1508-at-combinations.sh
@@ -45,6 +45,9 @@ check "@{u}" upstream-two
 check "@{u}@{1}" upstream-one
 check "@{-1}@{u}" master-two
 check "@{-1}@{u}@{1}" master-one
+check "@" new-two
+check "HEAD@{u}" upstream-two
+check "@@{u}" upstream-two failure
 nonsense "@{u}@{-1}"
 nonsense "@{1}@{u}"
 
-- 
1.8.3.rc0.395.gfe9a10d
Previous: Junio C HamanoNext: Junio C Hamano
Message 16 of 22 in “New @ shortcut for HEAD”
  1. 0/6 New @ shortcut for HEADFelipe Contreras, Apr 30, 2013
  2. 1/6 sha1_name: remove no-opFelipe Contreras, Apr 30, 2013
  3. 2/6 sha1_name: remove unnecessary bracesFelipe Contreras, Apr 30, 2013
  4. 3/6 sha1_name: avoid Yoda conditionsFelipe Contreras, Apr 30, 2013
  5. Junio C HamanoApr 30, 2013
  6. Felipe ContrerasApr 30, 2013
  7. Junio C HamanoApr 30, 2013
  8. Felipe ContrerasApr 30, 2013
  9. Junio C HamanoApr 30, 2013
  10. Junio C HamanoApr 30, 2013
  11. Felipe ContrerasApr 30, 2013
  12. Junio C HamanoApr 30, 2013
  13. Junio C HamanoApr 30, 2013
  14. 4/6 sha1_name: refactor reinterpret()Felipe Contreras, Apr 30, 2013
  15. Junio C HamanoApr 30, 2013
  16. 5/6 Add new @ shortcut for HEADFelipe Contreras, Apr 30, 2013
  17. Junio C HamanoApr 30, 2013
  18. Duy NguyenMay 1, 2013
  19. Felipe ContrerasMay 2, 2013
  20. Junio C HamanoMay 2, 2013
  21. 6/6 sha1_name: allow @@{u} to workFelipe Contreras, Apr 30, 2013
  22. Junio C HamanoApr 30, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.