From ee34518d629331dadd58b1a75294369d679eda8b Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Fri, 16 Dec 2005 02:40:25 +0100 Subject: We do not like "HEAD" as a new branch name This makes git-check-ref-format fail for "HEAD". Since the check is only executed when creating refs, the existing symbolic ref is safe. Otherwise these commands, most likely are pilot errors, would do pretty funky stuff: git checkout -b HEAD git pull . other:HEAD Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- refs.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'refs.c') diff --git a/refs.c b/refs.c index d2aec73edc..b8fcb98dad 100644 --- a/refs.c +++ b/refs.c @@ -345,6 +345,11 @@ int check_ref_format(const char *ref) if (!ch) { if (level < 2) return -1; /* at least of form "heads/blah" */ + + /* do not allow ref name to end in "HEAD" */ + if (cp - ref > 4 && !strcmp(cp - 4, "HEAD")) + return -1; + return 0; } } -- cgit v1.3 From 06bf6ac4248e834a229027908d405f5e42ac96d7 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 15 Dec 2005 18:52:51 -0800 Subject: refs.c: off-by-one fix. Signed-off-by: Junio C Hamano --- refs.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'refs.c') diff --git a/refs.c b/refs.c index b8fcb98dad..69858e48cb 100644 --- a/refs.c +++ b/refs.c @@ -346,8 +346,11 @@ int check_ref_format(const char *ref) if (level < 2) return -1; /* at least of form "heads/blah" */ - /* do not allow ref name to end in "HEAD" */ - if (cp - ref > 4 && !strcmp(cp - 4, "HEAD")) + /* Do not allow ref name to end in "HEAD" + * Note that cp is poiting at one past NUL at the end. + * i.e. cp[-1] = NUL. + */ + if (5 <= cp - ref && !strcmp(cp - 5, "HEAD")) return -1; return 0; -- cgit v1.3 From 68283999f8ae0e9286f8b7f199905b77d608cb80 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 15 Dec 2005 18:03:59 -0800 Subject: Forbid pattern maching characters in refnames. by marking '?', '*', and '[' as bad_ref_char(). Signed-off-by: Junio C Hamano --- Documentation/git-check-ref-format.txt | 8 +++++--- refs.c | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'refs.c') diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index 636e9516b0..f7f84c644e 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -26,13 +26,15 @@ imposes the following rules on how refs are named: . It cannot have ASCII control character (i.e. bytes whose values are lower than \040, or \177 `DEL`), space, tilde `~`, - caret `{caret}`, or colon `:` anywhere; + caret `{caret}`, colon `:`, question-mark `?`, asterisk `*`, + or open bracket `[` anywhere; . It cannot end with a slash `/`. These rules makes it easy for shell script based tools to parse -refnames, and also avoids ambiguities in certain refname -expressions (see gitlink:git-rev-parse[1]). Namely: +refnames, pathname expansion by the shell when a refname is used +unquoted (by mistake), and also avoids ambiguities in certain +refname expressions (see gitlink:git-rev-parse[1]). Namely: . double-dot `..` are often used as in `ref1..ref2`, and in some context this notation means `{caret}ref1 ref2` (i.e. not in diff --git a/refs.c b/refs.c index 69858e48cb..7a2c56e64b 100644 --- a/refs.c +++ b/refs.c @@ -313,7 +313,9 @@ int write_ref_sha1(const char *ref, int fd, const unsigned char *sha1) static inline int bad_ref_char(int ch) { return (((unsigned) ch) <= ' ' || - ch == '~' || ch == '^' || ch == ':'); + ch == '~' || ch == '^' || ch == ':' || + /* 2.13 Pattern Matching Notation */ + ch == '?' || ch == '*' || ch == '['); } int check_ref_format(const char *ref) -- cgit v1.3 From 8872f27b8773dfe7d3dbb440c27d4a5a9dbc8470 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 16 Dec 2005 23:48:14 -0800 Subject: Revert "refs.c: off-by-one fix." This reverts 06bf6ac4248e834a229027908d405f5e42ac96d7 commit. --- refs.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'refs.c') diff --git a/refs.c b/refs.c index 7a2c56e64b..0d63c1fcab 100644 --- a/refs.c +++ b/refs.c @@ -348,11 +348,8 @@ int check_ref_format(const char *ref) if (level < 2) return -1; /* at least of form "heads/blah" */ - /* Do not allow ref name to end in "HEAD" - * Note that cp is poiting at one past NUL at the end. - * i.e. cp[-1] = NUL. - */ - if (5 <= cp - ref && !strcmp(cp - 5, "HEAD")) + /* do not allow ref name to end in "HEAD" */ + if (cp - ref > 4 && !strcmp(cp - 4, "HEAD")) return -1; return 0; -- cgit v1.3 From f7087e2e7c34421b4577876969da94d0f6195414 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 16 Dec 2005 23:48:22 -0800 Subject: Revert "We do not like "HEAD" as a new branch name" This reverts ee34518d629331dadd58b1a75294369d679eda8b commit. --- refs.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'refs.c') diff --git a/refs.c b/refs.c index 0d63c1fcab..c33729c54a 100644 --- a/refs.c +++ b/refs.c @@ -347,11 +347,6 @@ int check_ref_format(const char *ref) if (!ch) { if (level < 2) return -1; /* at least of form "heads/blah" */ - - /* do not allow ref name to end in "HEAD" */ - if (cp - ref > 4 && !strcmp(cp - 4, "HEAD")) - return -1; - return 0; } } -- cgit v1.3