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

Re: ref name troubles, was Re: [PATCH v2] Introduce %<branch> as shortcut to the tracked branch

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 21, 2009, 21:00 UTC
Message-ID
<7vab7eegls.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<20090320004029.GX23521@spearce.org>
"Shawn O. Pearce" <spearce@spearce.org> writes:
Show 24 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>> On Fri, 20 Mar 2009, Johannes Schindelin wrote:
>> 
>> > Just try this:
>> > 
>> > 	$ git checkout -b %helloworld
>> 
>> It gets worse.  Much worse.
>> 
>> Try this (triggered by a comment by Ilari on IRC):
>> 
>> 	$ git checkout -b '@{1}'
>> 
>> That _works_! WTH?
>
> '@' is not reserved.  Neither is '{' or '}'.  Neither is
> the combination.
>
> Waaaaaay back when I added reflog query syntax I tried to use only
> '@', people with branch names like 'foo@bar' made a point that they
> didn't want to reserve it.  We stuck the {} in as a "highly unlikely
> to conflict with a branch name" and others pointed out most shells
> will do fun things with those, but we kept it to avoid ambiguous
> meanings of "foo@noon" when foo@noon is already a branch.
Let's do something along this line.
-- >8 --
Subject: [PATCH] check_ref_format(): tighten refname rules

Yes, I know that tightening rules retroactively is bad, but this changes the rules for refnames to forbid:

 (1) a refname that ends with a dot.
     We already reject a path component that begins with a dot, primarily
     to avoid ambiguous range interpretation.  If we allowed ".B" as a
     valid ref, it is unclear if "A...B" means "in dot-B but not in A" or
     "either in A or B but not in both".
     But for this to be complete, we need also to forbid "A." to avoid "in
     B but not in A-dot".  This was not a problem in the original range
     notation, but we should have added this restriction when three-dot
     notation was introduced.
     Unlike "no dot at the beginning of any path component" rule, this
     rule does not have to be "no dot at the end of any path component",
     because you cannot abbreviate the tail end away, similar to you can
     say "dot-B" to mean "refs/heads/dot-B".
 (2) a refname that contains "@{" in it.
     Some people and foreign SCM converter may have named their branches
     as frotz@243 and we still want to keep supporting it, but "git branch
     @{1}" is a disaster.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 refs.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/refs.c b/refs.c
index 8d3c502..abd5623 100644
--- a/refs.c
+++ b/refs.c
@@ -693,7 +693,7 @@ static inline int bad_ref_char(int ch)
 
 int check_ref_format(const char *ref)
 {
-	int ch, level, bad_type;
+	int ch, level, bad_type, last;
 	int ret = CHECK_REF_FORMAT_OK;
 	const char *cp = ref;
 
@@ -717,19 +717,23 @@ int check_ref_format(const char *ref)
 				return CHECK_REF_FORMAT_ERROR;
 		}
 
+		last = ch;
 		/* scan the rest of the path component */
 		while ((ch = *cp++) != 0) {
 			bad_type = bad_ref_char(ch);
-			if (bad_type) {
+			if (bad_type)
 				return CHECK_REF_FORMAT_ERROR;
-			}
 			if (ch == '/')
 				break;
-			if (ch == '.' && *cp == '.')
+			if (last == '.' && ch == '.')
+				return CHECK_REF_FORMAT_ERROR;
+			if (last == '@' && ch == '{')
 				return CHECK_REF_FORMAT_ERROR;
 		}
 		level++;
 		if (!ch) {
+			if (ref <= cp - 2 && cp[-2] == '.')
+				return CHECK_REF_FORMAT_ERROR;
 			if (level < 2)
 				return CHECK_REF_FORMAT_ONELEVEL;
 			return ret;
-- 
1.6.2.1.299.gda643a
Previous: Johannes Schindelin
Message 61 of 61 in “Re: Git {log,diff} against tracked branch?”
  1. Petr BaudisMar 18, 2009
  2. Introduce %<branch> as shortcut to the tracked branchJohannes Schindelin, Mar 18, 2009
  3. Andreas GruenbacherMar 18, 2009
  4. Introduce %<branch> as shortcut to the tracked branchJohannes Schindelin, Mar 18, 2009
  5. Andreas GruenbacherMar 18, 2009
  6. Johannes SchindelinMar 18, 2009
  7. Junio C HamanoMar 18, 2009
  8. Johannes SchindelinMar 18, 2009
  9. Michael J GruberMar 19, 2009
  10. Michael J GruberMar 19, 2009
  11. Johannes SchindelinMar 20, 2009
  12. ref name troubles, was Re: [PATCH v2] Introduce %<branch> as shortcut to the tracked branchJohannes Schindelin, Mar 20, 2009
  13. Shawn O. PearceMar 20, 2009
  14. Shawn O. PearceMar 20, 2009
  15. Sverre RabbelierMar 20, 2009
  16. Introduce BEL<branch> as shortcut to the tracked branchJohannes Schindelin, Mar 20, 2009
  17. Wincent ColaiutaMar 20, 2009
  18. Johannes SchindelinMar 20, 2009
  19. Santi BéjarMar 20, 2009
  20. Andreas GruenbacherMar 20, 2009
  21. Matthieu MoyMar 20, 2009
  22. Johannes SchindelinMar 20, 2009
  23. Mikael MagnussonMar 20, 2009
  24. Johannes SchindelinMar 20, 2009
  25. Document and test the new % shotcut for the tracked branchMichael J Gruber, Mar 20, 2009
  26. Johannes SchindelinMar 20, 2009
  27. Michael J GruberMar 20, 2009
  28. Petr BaudisMar 20, 2009
  29. Johannes SchindelinMar 20, 2009
  30. Petr BaudisMar 22, 2009
  31. Michael J GruberMar 20, 2009
  32. Introduce %<branch> as shortcut to the tracked branchJohannes Schindelin, Mar 20, 2009
  33. Junio C HamanoMar 20, 2009
  34. Johannes SchindelinMar 20, 2009
  35. Junio C HamanoMar 20, 2009
  36. Jeff KingMar 20, 2009
  37. Julian PhillipsMar 20, 2009
  38. Jeff KingMar 20, 2009
  39. Julian PhillipsMar 20, 2009
  40. Sverre RabbelierMar 20, 2009
  41. Julian PhillipsMar 20, 2009
  42. Sverre RabbelierMar 20, 2009
  43. Andreas GruenbacherMar 21, 2009
  44. Miles BaderMar 21, 2009
  45. Julian PhillipsMar 21, 2009
  46. Julian PhillipsMar 21, 2009
  47. Björn SteinbrinkMar 20, 2009
  48. Jeff KingMar 20, 2009
  49. Junio C HamanoMar 20, 2009
  50. Johannes SchindelinMar 20, 2009
  51. Petr BaudisMar 20, 2009
  52. Johannes SchindelinMar 20, 2009
  53. Petr BaudisMar 20, 2009
  54. Johannes SchindelinMar 20, 2009
  55. Michael J GruberMar 20, 2009
  56. Johannes SchindelinMar 20, 2009
  57. Michael J GruberMar 20, 2009
  58. Junio C HamanoMar 20, 2009
  59. Daniel BarkalowMar 20, 2009
  60. Johannes SchindelinMar 20, 2009
  61. Junio C HamanoMar 21, 2009

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.