Merge branch 'jk/oid-array-cleanups'
[git] / t / t1402-check-ref-format.sh
1 #!/bin/sh
2
3 test_description='Test git check-ref-format'
4
5 . ./test-lib.sh
6
7 valid_ref() {
8         prereq=
9         case $1 in
10         [A-Z!]*)
11                 prereq=$1
12                 shift
13         esac
14         desc="ref name '$1' is valid${2:+ with options $2}"
15         test_expect_success $prereq "$desc" "
16                 git check-ref-format $2 '$1'
17         "
18 }
19 invalid_ref() {
20         prereq=
21         case $1 in
22         [A-Z!]*)
23                 prereq=$1
24                 shift
25         esac
26         desc="ref name '$1' is invalid${2:+ with options $2}"
27         test_expect_success $prereq "$desc" "
28                 test_must_fail git check-ref-format $2 '$1'
29         "
30 }
31
32 invalid_ref ''
33 invalid_ref !MINGW '/'
34 invalid_ref !MINGW '/' --allow-onelevel
35 invalid_ref !MINGW '/' --normalize
36 invalid_ref !MINGW '/' '--allow-onelevel --normalize'
37 valid_ref 'foo/bar/baz'
38 valid_ref 'foo/bar/baz' --normalize
39 invalid_ref 'refs///heads/foo'
40 valid_ref 'refs///heads/foo' --normalize
41 invalid_ref 'heads/foo/'
42 invalid_ref !MINGW '/heads/foo'
43 valid_ref !MINGW '/heads/foo' --normalize
44 invalid_ref '///heads/foo'
45 valid_ref '///heads/foo' --normalize
46 invalid_ref './foo'
47 invalid_ref './foo/bar'
48 invalid_ref 'foo/./bar'
49 invalid_ref 'foo/bar/.'
50 invalid_ref '.refs/foo'
51 invalid_ref 'refs/heads/foo.'
52 invalid_ref 'heads/foo..bar'
53 invalid_ref 'heads/foo?bar'
54 valid_ref 'foo./bar'
55 invalid_ref 'heads/foo.lock'
56 invalid_ref 'heads///foo.lock'
57 invalid_ref 'foo.lock/bar'
58 invalid_ref 'foo.lock///bar'
59 valid_ref 'heads/foo@bar'
60 invalid_ref 'heads/v@{ation'
61 invalid_ref 'heads/foo\bar'
62 invalid_ref "$(printf 'heads/foo\t')"
63 invalid_ref "$(printf 'heads/foo\177')"
64 valid_ref "$(printf 'heads/fu\303\237')"
65 valid_ref 'heads/*foo/bar' --refspec-pattern
66 valid_ref 'heads/foo*/bar' --refspec-pattern
67 valid_ref 'heads/f*o/bar' --refspec-pattern
68 invalid_ref 'heads/f*o*/bar' --refspec-pattern
69 invalid_ref 'heads/foo*/bar*' --refspec-pattern
70
71 ref='foo'
72 invalid_ref "$ref"
73 valid_ref "$ref" --allow-onelevel
74 invalid_ref "$ref" --refspec-pattern
75 valid_ref "$ref" '--refspec-pattern --allow-onelevel'
76 invalid_ref "$ref" --normalize
77 valid_ref "$ref" '--allow-onelevel --normalize'
78
79 ref='foo/bar'
80 valid_ref "$ref"
81 valid_ref "$ref" --allow-onelevel
82 valid_ref "$ref" --refspec-pattern
83 valid_ref "$ref" '--refspec-pattern --allow-onelevel'
84 valid_ref "$ref" --normalize
85
86 ref='foo/*'
87 invalid_ref "$ref"
88 invalid_ref "$ref" --allow-onelevel
89 valid_ref "$ref" --refspec-pattern
90 valid_ref "$ref" '--refspec-pattern --allow-onelevel'
91
92 ref='*/foo'
93 invalid_ref "$ref"
94 invalid_ref "$ref" --allow-onelevel
95 valid_ref "$ref" --refspec-pattern
96 valid_ref "$ref" '--refspec-pattern --allow-onelevel'
97 invalid_ref "$ref" --normalize
98 valid_ref "$ref" '--refspec-pattern --normalize'
99
100 ref='foo/*/bar'
101 invalid_ref "$ref"
102 invalid_ref "$ref" --allow-onelevel
103 valid_ref "$ref" --refspec-pattern
104 valid_ref "$ref" '--refspec-pattern --allow-onelevel'
105
106 ref='*'
107 invalid_ref "$ref"
108 invalid_ref "$ref" --allow-onelevel
109 invalid_ref "$ref" --refspec-pattern
110 valid_ref "$ref" '--refspec-pattern --allow-onelevel'
111
112 ref='foo/*/*'
113 invalid_ref "$ref" --refspec-pattern
114 invalid_ref "$ref" '--refspec-pattern --allow-onelevel'
115
116 ref='*/foo/*'
117 invalid_ref "$ref" --refspec-pattern
118 invalid_ref "$ref" '--refspec-pattern --allow-onelevel'
119
120 ref='*/*/foo'
121 invalid_ref "$ref" --refspec-pattern
122 invalid_ref "$ref" '--refspec-pattern --allow-onelevel'
123
124 ref='/foo'
125 invalid_ref !MINGW "$ref"
126 invalid_ref !MINGW "$ref" --allow-onelevel
127 invalid_ref !MINGW "$ref" --refspec-pattern
128 invalid_ref !MINGW "$ref" '--refspec-pattern --allow-onelevel'
129 invalid_ref !MINGW "$ref" --normalize
130 valid_ref !MINGW "$ref" '--allow-onelevel --normalize'
131 invalid_ref !MINGW "$ref" '--refspec-pattern --normalize'
132 valid_ref !MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize'
133
134 test_expect_success "check-ref-format --branch @{-1}" '
135         T=$(git write-tree) &&
136         sha1=$(echo A | git commit-tree $T) &&
137         git update-ref refs/heads/master $sha1 &&
138         git update-ref refs/remotes/origin/master $sha1 &&
139         git checkout master &&
140         git checkout origin/master &&
141         git checkout master &&
142         refname=$(git check-ref-format --branch @{-1}) &&
143         test "$refname" = "$sha1" &&
144         refname2=$(git check-ref-format --branch @{-2}) &&
145         test "$refname2" = master'
146
147 test_expect_success 'check-ref-format --branch -naster' '
148         test_must_fail git check-ref-format --branch -naster >actual &&
149         test_must_be_empty actual
150 '
151
152 test_expect_success 'check-ref-format --branch from subdir' '
153         mkdir subdir &&
154
155         T=$(git write-tree) &&
156         sha1=$(echo A | git commit-tree $T) &&
157         git update-ref refs/heads/master $sha1 &&
158         git update-ref refs/remotes/origin/master $sha1 &&
159         git checkout master &&
160         git checkout origin/master &&
161         git checkout master &&
162         refname=$(
163                 cd subdir &&
164                 git check-ref-format --branch @{-1}
165         ) &&
166         test "$refname" = "$sha1"
167 '
168
169 test_expect_success 'check-ref-format --branch @{-1} from non-repo' '
170         nongit test_must_fail git check-ref-format --branch @{-1} >actual &&
171         test_must_be_empty actual
172 '
173
174 test_expect_success 'check-ref-format --branch master from non-repo' '
175         echo master >expect &&
176         nongit git check-ref-format --branch master >actual &&
177         test_cmp expect actual
178 '
179
180 valid_ref_normalized() {
181         prereq=
182         case $1 in
183         [A-Z!]*)
184                 prereq=$1
185                 shift
186         esac
187         test_expect_success $prereq "ref name '$1' simplifies to '$2'" "
188                 refname=\$(git check-ref-format --normalize '$1') &&
189                 test \"\$refname\" = '$2'
190         "
191 }
192 invalid_ref_normalized() {
193         prereq=
194         case $1 in
195         [A-Z!]*)
196                 prereq=$1
197                 shift
198         esac
199         test_expect_success $prereq "check-ref-format --normalize rejects '$1'" "
200                 test_must_fail git check-ref-format --normalize '$1'
201         "
202 }
203
204 valid_ref_normalized 'heads/foo' 'heads/foo'
205 valid_ref_normalized 'refs///heads/foo' 'refs/heads/foo'
206 valid_ref_normalized !MINGW '/heads/foo' 'heads/foo'
207 valid_ref_normalized '///heads/foo' 'heads/foo'
208 invalid_ref_normalized 'foo'
209 invalid_ref_normalized !MINGW '/foo'
210 invalid_ref_normalized 'heads/foo/../bar'
211 invalid_ref_normalized 'heads/./foo'
212 invalid_ref_normalized 'heads\foo'
213 invalid_ref_normalized 'heads/foo.lock'
214 invalid_ref_normalized 'heads///foo.lock'
215 invalid_ref_normalized 'foo.lock/bar'
216 invalid_ref_normalized 'foo.lock///bar'
217
218 test_done