Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='test git rev-parse' |
Johannes Schindelin | 06d5314 | 2020-11-18 23:44:21 +0000 | [diff] [blame] | 4 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
Johannes Schindelin | 334afbc | 2020-11-18 23:44:19 +0000 | [diff] [blame] | 5 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| 6 | |
Ævar Arnfjörð Bjarmason | e77b3da | 2022-09-01 01:14:08 +0200 | [diff] [blame] | 7 | TEST_PASSES_SANITIZE_LEAK=true |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 8 | . ./test-lib.sh |
| 9 | |
brian m. carlson | fac60b8 | 2020-12-13 00:25:29 +0000 | [diff] [blame] | 10 | test_one () { |
| 11 | dir="$1" && |
| 12 | expect="$2" && |
| 13 | shift && |
| 14 | shift && |
| 15 | echo "$expect" >expect && |
| 16 | git -C "$dir" rev-parse "$@" >actual && |
| 17 | test_cmp expect actual |
| 18 | } |
| 19 | |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 20 | # usage: [options] label is-bare is-inside-git is-inside-work prefix git-dir absolute-git-dir |
Eric Sunshine | 12f7526 | 2016-05-18 16:15:42 -0400 | [diff] [blame] | 21 | test_rev_parse () { |
Eric Sunshine | 1e043cf | 2016-05-18 16:15:43 -0400 | [diff] [blame] | 22 | d= |
Eric Sunshine | 1dea0dc | 2016-05-18 16:15:44 -0400 | [diff] [blame] | 23 | bare= |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 24 | gitdir= |
Eric Sunshine | 1e043cf | 2016-05-18 16:15:43 -0400 | [diff] [blame] | 25 | while : |
| 26 | do |
| 27 | case "$1" in |
| 28 | -C) d="$2"; shift; shift ;; |
Eric Sunshine | 1dea0dc | 2016-05-18 16:15:44 -0400 | [diff] [blame] | 29 | -b) case "$2" in |
| 30 | [tfu]*) bare="$2"; shift; shift ;; |
| 31 | *) error "test_rev_parse: bogus core.bare value '$2'" ;; |
| 32 | esac ;; |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 33 | -g) gitdir="$2"; shift; shift ;; |
Eric Sunshine | 1e043cf | 2016-05-18 16:15:43 -0400 | [diff] [blame] | 34 | -*) error "test_rev_parse: unrecognized option '$1'" ;; |
| 35 | *) break ;; |
| 36 | esac |
| 37 | done |
| 38 | |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 39 | name=$1 |
| 40 | shift |
| 41 | |
Eric Sunshine | 12f7526 | 2016-05-18 16:15:42 -0400 | [diff] [blame] | 42 | for o in --is-bare-repository \ |
| 43 | --is-inside-git-dir \ |
| 44 | --is-inside-work-tree \ |
| 45 | --show-prefix \ |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 46 | --git-dir \ |
| 47 | --absolute-git-dir |
Eric Sunshine | 12f7526 | 2016-05-18 16:15:42 -0400 | [diff] [blame] | 48 | do |
| 49 | test $# -eq 0 && break |
| 50 | expect="$1" |
| 51 | test_expect_success "$name: $o" ' |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 52 | if test -n "$gitdir" |
| 53 | then |
| 54 | test_when_finished "unset GIT_DIR" && |
| 55 | GIT_DIR="$gitdir" && |
| 56 | export GIT_DIR |
| 57 | fi && |
| 58 | |
Eric Sunshine | 1dea0dc | 2016-05-18 16:15:44 -0400 | [diff] [blame] | 59 | case "$bare" in |
| 60 | t*) test_config ${d:+-C} ${d:+"$d"} core.bare true ;; |
| 61 | f*) test_config ${d:+-C} ${d:+"$d"} core.bare false ;; |
| 62 | u*) test_unconfig ${d:+-C} ${d:+"$d"} core.bare ;; |
| 63 | esac && |
| 64 | |
Eric Sunshine | 12f7526 | 2016-05-18 16:15:42 -0400 | [diff] [blame] | 65 | echo "$expect" >expect && |
Eric Sunshine | 1e043cf | 2016-05-18 16:15:43 -0400 | [diff] [blame] | 66 | git ${d:+-C} ${d:+"$d"} rev-parse $o >actual && |
Eric Sunshine | 12f7526 | 2016-05-18 16:15:42 -0400 | [diff] [blame] | 67 | test_cmp expect actual |
| 68 | ' |
| 69 | shift |
| 70 | done |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 71 | } |
| 72 | |
SZEDER Gábor | 8fb3c00 | 2009-02-14 17:16:28 +0100 | [diff] [blame] | 73 | ROOT=$(pwd) |
Johannes Schindelin | 7efeb8f | 2007-08-05 14:12:53 +0100 | [diff] [blame] | 74 | |
Eric Sunshine | d66f68f | 2016-05-17 15:36:26 -0400 | [diff] [blame] | 75 | test_expect_success 'setup' ' |
| 76 | mkdir -p sub/dir work && |
brian m. carlson | fac60b8 | 2020-12-13 00:25:29 +0000 | [diff] [blame] | 77 | cp -R .git repo.git && |
| 78 | git checkout -B main && |
| 79 | test_commit abc && |
| 80 | git checkout -b side && |
| 81 | test_commit def && |
| 82 | git checkout main && |
| 83 | git worktree add worktree side |
Eric Sunshine | d66f68f | 2016-05-17 15:36:26 -0400 | [diff] [blame] | 84 | ' |
| 85 | |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 86 | test_rev_parse toplevel false false true '' .git "$ROOT/.git" |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 87 | |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 88 | test_rev_parse -C .git .git/ false true false '' . "$ROOT/.git" |
| 89 | test_rev_parse -C .git/objects .git/objects/ false true false '' "$ROOT/.git" "$ROOT/.git" |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 90 | |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 91 | test_rev_parse -C sub/dir subdirectory false false true sub/dir/ "$ROOT/.git" "$ROOT/.git" |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 92 | |
Eric Sunshine | 1dea0dc | 2016-05-18 16:15:44 -0400 | [diff] [blame] | 93 | test_rev_parse -b t 'core.bare = true' true false false |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 94 | |
Eric Sunshine | 1dea0dc | 2016-05-18 16:15:44 -0400 | [diff] [blame] | 95 | test_rev_parse -b u 'core.bare undefined' false false true |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 96 | |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 97 | |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 98 | test_rev_parse -C work -g ../.git -b f 'GIT_DIR=../.git, core.bare = false' false false true '' "../.git" "$ROOT/.git" |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 99 | |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 100 | test_rev_parse -C work -g ../.git -b t 'GIT_DIR=../.git, core.bare = true' true false false '' |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 101 | |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 102 | test_rev_parse -C work -g ../.git -b u 'GIT_DIR=../.git, core.bare undefined' false false true '' |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 103 | |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 104 | |
SZEDER Gábor | a2f5a87 | 2017-02-03 03:48:23 +0100 | [diff] [blame] | 105 | test_rev_parse -C work -g ../repo.git -b f 'GIT_DIR=../repo.git, core.bare = false' false false true '' "../repo.git" "$ROOT/repo.git" |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 106 | |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 107 | test_rev_parse -C work -g ../repo.git -b t 'GIT_DIR=../repo.git, core.bare = true' true false false '' |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 108 | |
Eric Sunshine | e6273f4 | 2016-05-18 16:15:45 -0400 | [diff] [blame] | 109 | test_rev_parse -C work -g ../repo.git -b u 'GIT_DIR=../repo.git, core.bare undefined' false false true '' |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 110 | |
brian m. carlson | fac60b8 | 2020-12-13 00:25:29 +0000 | [diff] [blame] | 111 | test_expect_success 'rev-parse --path-format=absolute' ' |
| 112 | test_one "." "$ROOT/.git" --path-format=absolute --git-dir && |
| 113 | test_one "." "$ROOT/.git" --path-format=absolute --git-common-dir && |
| 114 | test_one "sub/dir" "$ROOT/.git" --path-format=absolute --git-dir && |
| 115 | test_one "sub/dir" "$ROOT/.git" --path-format=absolute --git-common-dir && |
| 116 | test_one "worktree" "$ROOT/.git/worktrees/worktree" --path-format=absolute --git-dir && |
| 117 | test_one "worktree" "$ROOT/.git" --path-format=absolute --git-common-dir && |
| 118 | test_one "." "$ROOT" --path-format=absolute --show-toplevel && |
| 119 | test_one "." "$ROOT/.git/objects" --path-format=absolute --git-path objects && |
| 120 | test_one "." "$ROOT/.git/objects/foo/bar/baz" --path-format=absolute --git-path objects/foo/bar/baz |
| 121 | ' |
| 122 | |
| 123 | test_expect_success 'rev-parse --path-format=relative' ' |
| 124 | test_one "." ".git" --path-format=relative --git-dir && |
| 125 | test_one "." ".git" --path-format=relative --git-common-dir && |
| 126 | test_one "sub/dir" "../../.git" --path-format=relative --git-dir && |
| 127 | test_one "sub/dir" "../../.git" --path-format=relative --git-common-dir && |
| 128 | test_one "worktree" "../.git/worktrees/worktree" --path-format=relative --git-dir && |
| 129 | test_one "worktree" "../.git" --path-format=relative --git-common-dir && |
| 130 | test_one "." "./" --path-format=relative --show-toplevel && |
| 131 | test_one "." ".git/objects" --path-format=relative --git-path objects && |
| 132 | test_one "." ".git/objects/foo/bar/baz" --path-format=relative --git-path objects/foo/bar/baz |
| 133 | ' |
| 134 | |
| 135 | test_expect_success '--path-format=relative does not affect --absolute-git-dir' ' |
| 136 | git rev-parse --path-format=relative --absolute-git-dir >actual && |
| 137 | echo "$ROOT/.git" >expect && |
| 138 | test_cmp expect actual |
| 139 | ' |
| 140 | |
| 141 | test_expect_success '--path-format can change in the middle of the command line' ' |
| 142 | git rev-parse --path-format=absolute --git-dir --path-format=relative --git-path objects/foo/bar >actual && |
| 143 | cat >expect <<-EOF && |
| 144 | $ROOT/.git |
| 145 | .git/objects/foo/bar |
| 146 | EOF |
| 147 | test_cmp expect actual |
| 148 | ' |
| 149 | |
Wolfgang Müller | 99fc555 | 2021-05-17 10:02:42 +0200 | [diff] [blame] | 150 | test_expect_success '--path-format does not segfault without an argument' ' |
| 151 | test_must_fail git rev-parse --path-format |
| 152 | ' |
| 153 | |
Michael Rappazzo | 5de8a54 | 2017-02-17 17:59:02 +0100 | [diff] [blame] | 154 | test_expect_success 'git-common-dir from worktree root' ' |
| 155 | echo .git >expect && |
| 156 | git rev-parse --git-common-dir >actual && |
| 157 | test_cmp expect actual |
| 158 | ' |
| 159 | |
Johannes Schindelin | 098aa86 | 2017-02-17 17:59:06 +0100 | [diff] [blame] | 160 | test_expect_success 'git-common-dir inside sub-dir' ' |
Michael Rappazzo | 5de8a54 | 2017-02-17 17:59:02 +0100 | [diff] [blame] | 161 | mkdir -p path/to/child && |
| 162 | test_when_finished "rm -rf path" && |
| 163 | echo "$(git -C path/to/child rev-parse --show-cdup).git" >expect && |
| 164 | git -C path/to/child rev-parse --git-common-dir >actual && |
| 165 | test_cmp expect actual |
| 166 | ' |
| 167 | |
| 168 | test_expect_success 'git-path from worktree root' ' |
| 169 | echo .git/objects >expect && |
| 170 | git rev-parse --git-path objects >actual && |
| 171 | test_cmp expect actual |
| 172 | ' |
| 173 | |
Johannes Schindelin | 098aa86 | 2017-02-17 17:59:06 +0100 | [diff] [blame] | 174 | test_expect_success 'git-path inside sub-dir' ' |
Michael Rappazzo | 5de8a54 | 2017-02-17 17:59:02 +0100 | [diff] [blame] | 175 | mkdir -p path/to/child && |
| 176 | test_when_finished "rm -rf path" && |
| 177 | echo "$(git -C path/to/child rev-parse --show-cdup).git/objects" >expect && |
| 178 | git -C path/to/child rev-parse --git-path objects >actual && |
| 179 | test_cmp expect actual |
| 180 | ' |
| 181 | |
Øystein Walle | 417abfd | 2017-09-18 19:04:29 +0200 | [diff] [blame] | 182 | test_expect_success 'rev-parse --is-shallow-repository in shallow repo' ' |
| 183 | test_commit test_commit && |
| 184 | echo true >expect && |
| 185 | git clone --depth 1 --no-local . shallow && |
| 186 | test_when_finished "rm -rf shallow" && |
| 187 | git -C shallow rev-parse --is-shallow-repository >actual && |
| 188 | test_cmp expect actual |
| 189 | ' |
| 190 | |
| 191 | test_expect_success 'rev-parse --is-shallow-repository in non-shallow repo' ' |
| 192 | echo false >expect && |
| 193 | git rev-parse --is-shallow-repository >actual && |
| 194 | test_cmp expect actual |
| 195 | ' |
| 196 | |
brian m. carlson | 2eabd38 | 2019-10-28 00:58:55 +0000 | [diff] [blame] | 197 | test_expect_success 'rev-parse --show-object-format in repo' ' |
SZEDER Gábor | a48a880 | 2022-12-18 17:29:05 +0100 | [diff] [blame] | 198 | test_oid algo >expect && |
brian m. carlson | 2eabd38 | 2019-10-28 00:58:55 +0000 | [diff] [blame] | 199 | git rev-parse --show-object-format >actual && |
| 200 | test_cmp expect actual && |
| 201 | git rev-parse --show-object-format=storage >actual && |
| 202 | test_cmp expect actual && |
| 203 | git rev-parse --show-object-format=input >actual && |
| 204 | test_cmp expect actual && |
| 205 | git rev-parse --show-object-format=output >actual && |
| 206 | test_cmp expect actual && |
| 207 | test_must_fail git rev-parse --show-object-format=squeamish-ossifrage 2>err && |
| 208 | grep "unknown mode for --show-object-format: squeamish-ossifrage" err |
| 209 | ' |
| 210 | |
Patrick Steinhardt | 3c4a531 | 2023-12-29 08:27:00 +0100 | [diff] [blame] | 211 | test_expect_success 'rev-parse --show-ref-format' ' |
| 212 | test_detect_ref_format >expect && |
| 213 | git rev-parse --show-ref-format >actual && |
| 214 | test_cmp expect actual |
| 215 | ' |
| 216 | |
| 217 | test_expect_success 'rev-parse --show-ref-format with invalid storage' ' |
| 218 | test_when_finished "rm -rf repo" && |
| 219 | git init repo && |
| 220 | ( |
| 221 | cd repo && |
| 222 | git config extensions.refstorage broken && |
| 223 | test_must_fail git rev-parse --show-ref-format 2>err && |
| 224 | grep "error: invalid value for ${SQ}extensions.refstorage${SQ}: ${SQ}broken${SQ}" err |
| 225 | ) |
| 226 | ' |
| 227 | |
Jeff King | 2d92ab3 | 2019-11-19 03:05:43 -0500 | [diff] [blame] | 228 | test_expect_success '--show-toplevel from subdir of working tree' ' |
| 229 | pwd >expect && |
| 230 | git -C sub/dir rev-parse --show-toplevel >actual && |
| 231 | test_cmp expect actual |
| 232 | ' |
| 233 | |
| 234 | test_expect_success '--show-toplevel from inside .git' ' |
| 235 | test_must_fail git -C .git rev-parse --show-toplevel |
| 236 | ' |
| 237 | |
Stefan Beller | bf0231c | 2017-03-08 15:07:42 -0800 | [diff] [blame] | 238 | test_expect_success 'showing the superproject correctly' ' |
| 239 | git rev-parse --show-superproject-working-tree >out && |
| 240 | test_must_be_empty out && |
| 241 | |
| 242 | test_create_repo super && |
| 243 | test_commit -C super test_commit && |
| 244 | test_create_repo sub && |
| 245 | test_commit -C sub test_commit && |
Taylor Blau | 8a96dbc | 2022-07-29 15:16:10 -0400 | [diff] [blame] | 246 | git -c protocol.file.allow=always \ |
| 247 | -C super submodule add ../sub dir/sub && |
Stefan Beller | bf0231c | 2017-03-08 15:07:42 -0800 | [diff] [blame] | 248 | echo $(pwd)/super >expect && |
| 249 | git -C super/dir/sub rev-parse --show-superproject-working-tree >out && |
Sam McKelvie | c5cbb27 | 2018-09-27 11:10:54 -0700 | [diff] [blame] | 250 | test_cmp expect out && |
| 251 | |
| 252 | test_commit -C super submodule_add && |
| 253 | git -C super checkout -b branch1 && |
| 254 | git -C super/dir/sub checkout -b branch1 && |
| 255 | test_commit -C super/dir/sub branch1_commit && |
| 256 | git -C super add dir/sub && |
| 257 | test_commit -C super branch1_commit && |
Johannes Schindelin | 06d5314 | 2020-11-18 23:44:21 +0000 | [diff] [blame] | 258 | git -C super checkout -b branch2 main && |
| 259 | git -C super/dir/sub checkout -b branch2 main && |
Sam McKelvie | c5cbb27 | 2018-09-27 11:10:54 -0700 | [diff] [blame] | 260 | test_commit -C super/dir/sub branch2_commit && |
| 261 | git -C super add dir/sub && |
| 262 | test_commit -C super branch2_commit && |
| 263 | test_must_fail git -C super merge branch1 && |
| 264 | |
| 265 | git -C super/dir/sub rev-parse --show-superproject-working-tree >out && |
Stefan Beller | bf0231c | 2017-03-08 15:07:42 -0800 | [diff] [blame] | 266 | test_cmp expect out |
| 267 | ' |
| 268 | |
Eric Wong | a5cdca4 | 2021-02-10 21:55:43 +0000 | [diff] [blame] | 269 | # at least one external project depends on this behavior: |
| 270 | test_expect_success 'rev-parse --since= unsqueezed ordering' ' |
| 271 | x1=--since=1970-01-01T00:00:01Z && |
| 272 | x2=--since=1970-01-01T00:00:02Z && |
| 273 | x3=--since=1970-01-01T00:00:03Z && |
| 274 | git rev-parse $x1 $x1 $x3 $x2 >actual && |
| 275 | cat >expect <<-EOF && |
| 276 | --max-age=1 |
| 277 | --max-age=1 |
| 278 | --max-age=3 |
| 279 | --max-age=2 |
| 280 | EOF |
| 281 | test_cmp expect actual |
| 282 | ' |
| 283 | |
Victoria Dye | 5305474 | 2023-10-09 21:58:53 +0000 | [diff] [blame] | 284 | test_expect_success 'rev-parse --bisect includes bad, excludes good' ' |
| 285 | test_commit_bulk 6 && |
| 286 | |
| 287 | git update-ref refs/bisect/bad-1 HEAD~1 && |
| 288 | git update-ref refs/bisect/b HEAD~2 && |
| 289 | git update-ref refs/bisect/bad-3 HEAD~3 && |
| 290 | git update-ref refs/bisect/good-3 HEAD~3 && |
| 291 | git update-ref refs/bisect/bad-4 HEAD~4 && |
| 292 | git update-ref refs/bisect/go HEAD~4 && |
| 293 | |
| 294 | # Note: refs/bisect/b and refs/bisect/go should be ignored because they |
| 295 | # do not match the refs/bisect/bad or refs/bisect/good prefixes. |
| 296 | cat >expect <<-EOF && |
| 297 | refs/bisect/bad-1 |
| 298 | refs/bisect/bad-3 |
| 299 | refs/bisect/bad-4 |
| 300 | ^refs/bisect/good-3 |
| 301 | EOF |
| 302 | |
| 303 | git rev-parse --symbolic-full-name --bisect >actual && |
| 304 | test_cmp expect actual |
| 305 | ' |
| 306 | |
Matthias Lederhofer | dace6e4 | 2007-06-06 09:01:21 +0200 | [diff] [blame] | 307 | test_done |