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

[PATCH 1/7] check_ref_format(): tighten refname rules

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 21, 2009, 22:13 UTC
Message-ID
<1237673619-12608-2-git-send-email-gitster@pobox.com>
In-Reply-To
<1237673619-12608-1-git-send-email-gitster@pobox.com>

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: Junio C HamanoNext: Junio C Hamano
Message 2 of 14 in “Clean up interpret_nth_last_branch feature”
  1. 0/7 Clean up interpret_nth_last_branch featureJunio C Hamano, Mar 21, 2009
  2. 1/7 check_ref_format(): tighten refname rulesJunio C Hamano, Mar 21, 2009
  3. 2/7 Rename interpret/substitute nth_last_branch functionsJunio C Hamano, Mar 21, 2009
  4. 3/7 check-ref-format --branch: give Porcelain a way to grok branch shorthandJunio C Hamano, Mar 21, 2009
  5. 4/7 strbuf_branchname(): a wrapper for branch name shorthandsJunio C Hamano, Mar 21, 2009
  6. 5/7 Fix "branch -m @{-1} newname"Junio C Hamano, Mar 21, 2009
  7. 6/7 strbuf_check_branch_ref(): a helper to check a refname for a branchJunio C Hamano, Mar 21, 2009
  8. 7/7 checkout -: make "-" to mean "previous branch" everywhereJunio C Hamano, Mar 21, 2009
  9. 7/7 checkout -: make "-" to mean "previous branch" everywhereJunio C Hamano, Mar 22, 2009
  10. Bert WesargMar 22, 2009
  11. Junio C HamanoMar 22, 2009
  12. Junio C HamanoMar 21, 2009
  13. Johannes SchindelinMar 22, 2009
  14. Junio C HamanoMar 22, 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.