From: "Nikolaus Schuetz via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Patrick Steinhardt <ps@pks.im>,
Nikolaus Schuetz <nikolauspschuetz@gmail.com>,
Nikolaus Schuetz <nikolauspschuetz@gmail.com>
Subject: [PATCH v2] t1402: test forbidden characters in refnames
Date: Thu, 20 Aug 2026 22:20:17 +0000 [thread overview]
Message-ID: <pull.2203.v2.git.1787264417682.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2203.git.1786653837190.gitgitgadget@gmail.com>
From: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
git-check-ref-format(1) documents that a refname cannot contain a
space, tilde, caret, colon, question-mark, asterisk, open-bracket or
backslash, nor the sequence "..", and cannot be the single character
"@". Of these, only "?", "\" and ".." were tested embedded in an
otherwise-valid refname; "*" was checked only as a lone character or
with --refspec-pattern.
Test all of them in that embedded form with a single loop, and check
that "@" alone is rejected even with --allow-onelevel -- where "@" is
otherwise a valid refname component, as "refs/@" confirms.
Signed-off-by: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
---
t1402: test forbidden characters in refnames
git-check-ref-format(1) documents the characters that a refname may not
contain (space, tilde, caret, colon, question-mark, asterisk,
open-bracket) and the rule that it may not be the single character "@".
t1402 only exercised a few of these directly.
This adds the remaining forbidden characters in embedded form, and
checks that "@" alone is rejected even with --allow-onelevel, where "@"
is otherwise a valid refname component (as "refs/@" confirms).
Test-only; documents existing behaviour, in the spirit of 919eb8ace
(t1402: check for refs ending with a dot).
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2203%2Fnikolauspschuetz%2Fns%2Ft1402-forbidden-characters-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2203/nikolauspschuetz/ns/t1402-forbidden-characters-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/2203
Range-diff vs v1:
1: f254db5b09 ! 1: cc013499f9 t1402: test forbidden characters in refnames
@@ Commit message
t1402: test forbidden characters in refnames
git-check-ref-format(1) documents that a refname cannot contain a
- space, tilde, caret, colon, question-mark, asterisk or open-bracket,
- and that it cannot be the single character "@". Of these, only "?"
- was tested as a character embedded in an otherwise-valid refname;
- "*" was checked only as a lone character or with --refspec-pattern.
+ space, tilde, caret, colon, question-mark, asterisk, open-bracket or
+ backslash, nor the sequence "..", and cannot be the single character
+ "@". Of these, only "?", "\" and ".." were tested embedded in an
+ otherwise-valid refname; "*" was checked only as a lone character or
+ with --refspec-pattern.
- Add the remaining forbidden characters in that embedded form, and
- check that "@" alone is rejected even with --allow-onelevel -- where
- "@" is otherwise a valid refname component, as "refs/@" confirms.
+ Test all of them in that embedded form with a single loop, and check
+ that "@" alone is rejected even with --allow-onelevel -- where "@" is
+ otherwise a valid refname component, as "refs/@" confirms.
Signed-off-by: Nikolaus Schuetz <nikolauspschuetz@gmail.com>
## t/t1402-check-ref-format.sh ##
-@@ t/t1402-check-ref-format.sh: invalid_ref '.refs/foo'
+@@ t/t1402-check-ref-format.sh: invalid_ref 'foo/./bar'
+ invalid_ref 'foo/bar/.'
+ invalid_ref '.refs/foo'
invalid_ref 'refs/heads/foo.'
- invalid_ref 'heads/foo..bar'
- invalid_ref 'heads/foo?bar'
-+invalid_ref 'heads/foo~bar'
-+invalid_ref 'heads/foo^bar'
-+invalid_ref 'heads/foo:bar'
-+invalid_ref 'heads/foo*bar'
-+invalid_ref 'heads/foo[bar'
-+invalid_ref 'heads/foo bar'
+-invalid_ref 'heads/foo..bar'
+-invalid_ref 'heads/foo?bar'
++for c in '?' '~' '^' ':' '*' '[' ' ' '\' '..'
++do
++ invalid_ref "heads/foo${c}bar"
++done
valid_ref 'foo./bar'
invalid_ref 'heads/foo.lock'
invalid_ref 'heads///foo.lock'
@@ t/t1402-check-ref-format.sh: invalid_ref '.refs/foo'
+valid_ref 'refs/@'
+invalid_ref '@' --allow-onelevel
invalid_ref 'heads/v@{ation'
- invalid_ref 'heads/foo\bar'
+-invalid_ref 'heads/foo\bar'
invalid_ref "$(printf 'heads/foo\t')"
+ invalid_ref "$(printf 'heads/foo\177')"
+ valid_ref "$(printf 'heads/fu\303\237')"
t/t1402-check-ref-format.sh | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/t/t1402-check-ref-format.sh b/t/t1402-check-ref-format.sh
index cabc516ae9..9dd64662b2 100755
--- a/t/t1402-check-ref-format.sh
+++ b/t/t1402-check-ref-format.sh
@@ -49,16 +49,19 @@ invalid_ref 'foo/./bar'
invalid_ref 'foo/bar/.'
invalid_ref '.refs/foo'
invalid_ref 'refs/heads/foo.'
-invalid_ref 'heads/foo..bar'
-invalid_ref 'heads/foo?bar'
+for c in '?' '~' '^' ':' '*' '[' ' ' '\' '..'
+do
+ invalid_ref "heads/foo${c}bar"
+done
valid_ref 'foo./bar'
invalid_ref 'heads/foo.lock'
invalid_ref 'heads///foo.lock'
invalid_ref 'foo.lock/bar'
invalid_ref 'foo.lock///bar'
valid_ref 'heads/foo@bar'
+valid_ref 'refs/@'
+invalid_ref '@' --allow-onelevel
invalid_ref 'heads/v@{ation'
-invalid_ref 'heads/foo\bar'
invalid_ref "$(printf 'heads/foo\t')"
invalid_ref "$(printf 'heads/foo\177')"
valid_ref "$(printf 'heads/fu\303\237')"
base-commit: 745601a9a94110d74769ab605ccd4f61339758d2
--
gitgitgadget
prev parent reply other threads:[~2026-08-20 22:20 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-13 20:43 [PATCH] t1402: test forbidden characters in refnames Nikolaus Schuetz via GitGitGadget
2026-08-19 11:20 ` Patrick Steinhardt
2026-08-19 20:22 ` Junio C Hamano
2026-08-20 14:46 ` Nikolaus Schuetz
2026-08-20 22:20 ` Nikolaus Schuetz via GitGitGadget [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.2203.v2.git.1787264417682.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=nikolauspschuetz@gmail.com \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.