Git fork
at reftables-rust 561 lines 14 kB view raw
1#!/bin/sh 2# 3# Copyright (c) 2009 Jens Lehmann, based on t7401 by Ping Yin 4# Copyright (c) 2011 Alexey Shumkin (+ non-UTF-8 commit encoding tests) 5# 6 7test_description='Support for verbose submodule differences in git diff 8 9This test tries to verify the sanity of the --submodule option of git diff. 10' 11 12GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main 13export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME 14 15. ./test-lib.sh 16 17# Test non-UTF-8 encoding in case iconv is available. 18if test_have_prereq ICONV 19then 20 test_encoding="ISO8859-1" 21 # String "added" in German (translated with Google Translate), encoded in UTF-8, 22 # used in sample commit log messages in add_file() function below. 23 added=$(printf "hinzugef\303\274gt") 24else 25 test_encoding="UTF-8" 26 added="added" 27fi 28 29add_file () { 30 ( 31 cd "$1" && 32 shift && 33 for name 34 do 35 echo "$name" >"$name" && 36 git add "$name" && 37 test_tick && 38 # "git commit -m" would break MinGW, as Windows refuse to pass 39 # $test_encoding encoded parameter to git. 40 echo "Add $name ($added $name)" | iconv -f utf-8 -t $test_encoding | 41 git -c "i18n.commitEncoding=$test_encoding" commit -F - 42 done >/dev/null && 43 git rev-parse --short --verify HEAD 44 ) 45} 46commit_file () { 47 test_tick && 48 git commit "$@" -m "Commit $*" >/dev/null 49} 50 51test_expect_success 'setup submodule' ' 52 git init sm1 && 53 add_file . foo && 54 head1=$(add_file sm1 foo1 foo2) && 55 fullhead1=$(cd sm1 && git rev-parse --verify HEAD) 56' 57 58test_expect_success 'added submodule' ' 59 git add sm1 && 60 git diff-index -p --submodule=log HEAD >actual && 61 cat >expected <<-EOF && 62 Submodule sm1 0000000...$head1 (new submodule) 63 EOF 64 test_cmp expected actual 65' 66 67test_expect_success 'added submodule, set diff.submodule' ' 68 git config diff.submodule log && 69 git add sm1 && 70 git diff --cached >actual && 71 cat >expected <<-EOF && 72 Submodule sm1 0000000...$head1 (new submodule) 73 EOF 74 git config --unset diff.submodule && 75 test_cmp expected actual 76' 77 78test_expect_success '--submodule=short overrides diff.submodule' ' 79 test_config diff.submodule log && 80 git add sm1 && 81 git diff --submodule=short --cached >actual && 82 cat >expected <<-EOF && 83 diff --git a/sm1 b/sm1 84 new file mode 160000 85 index 0000000..$head1 86 --- /dev/null 87 +++ b/sm1 88 @@ -0,0 +1 @@ 89 +Subproject commit $fullhead1 90 EOF 91 test_cmp expected actual 92' 93 94test_expect_success 'diff.submodule does not affect plumbing' ' 95 test_config diff.submodule log && 96 git diff-index -p HEAD >actual && 97 cat >expected <<-EOF && 98 diff --git a/sm1 b/sm1 99 new file mode 160000 100 index 0000000..$head1 101 --- /dev/null 102 +++ b/sm1 103 @@ -0,0 +1 @@ 104 +Subproject commit $fullhead1 105 EOF 106 test_cmp expected actual 107' 108 109commit_file sm1 && 110head2=$(add_file sm1 foo3) 111 112test_expect_success 'modified submodule(forward)' ' 113 git diff-index -p --submodule=log HEAD >actual && 114 cat >expected <<-EOF && 115 Submodule sm1 $head1..$head2: 116 > Add foo3 ($added foo3) 117 EOF 118 test_cmp expected actual 119' 120 121test_expect_success 'modified submodule(forward)' ' 122 git diff --submodule=log >actual && 123 cat >expected <<-EOF && 124 Submodule sm1 $head1..$head2: 125 > Add foo3 ($added foo3) 126 EOF 127 test_cmp expected actual 128' 129 130test_expect_success 'modified submodule(forward) --submodule' ' 131 git diff --submodule >actual && 132 cat >expected <<-EOF && 133 Submodule sm1 $head1..$head2: 134 > Add foo3 ($added foo3) 135 EOF 136 test_cmp expected actual 137' 138 139fullhead2=$(cd sm1; git rev-parse --verify HEAD) 140test_expect_success 'modified submodule(forward) --submodule=short' ' 141 git diff --submodule=short >actual && 142 cat >expected <<-EOF && 143 diff --git a/sm1 b/sm1 144 index $head1..$head2 160000 145 --- a/sm1 146 +++ b/sm1 147 @@ -1 +1 @@ 148 -Subproject commit $fullhead1 149 +Subproject commit $fullhead2 150 EOF 151 test_cmp expected actual 152' 153 154commit_file sm1 && 155head3=$( 156 cd sm1 && 157 git reset --hard HEAD~2 >/dev/null && 158 git rev-parse --short --verify HEAD 159) 160 161test_expect_success 'modified submodule(backward)' ' 162 git diff-index -p --submodule=log HEAD >actual && 163 cat >expected <<-EOF && 164 Submodule sm1 $head2..$head3 (rewind): 165 < Add foo3 ($added foo3) 166 < Add foo2 ($added foo2) 167 EOF 168 test_cmp expected actual 169' 170 171head4=$(add_file sm1 foo4 foo5) 172test_expect_success 'modified submodule(backward and forward)' ' 173 git diff-index -p --submodule=log HEAD >actual && 174 cat >expected <<-EOF && 175 Submodule sm1 $head2...$head4: 176 > Add foo5 ($added foo5) 177 > Add foo4 ($added foo4) 178 < Add foo3 ($added foo3) 179 < Add foo2 ($added foo2) 180 EOF 181 test_cmp expected actual 182' 183 184commit_file sm1 && 185mv sm1 sm1-bak && 186echo sm1 >sm1 && 187head5=$(git hash-object sm1 | cut -c1-7) && 188git add sm1 && 189rm -f sm1 && 190mv sm1-bak sm1 191 192test_expect_success 'typechanged submodule(submodule->blob), --cached' ' 193 git diff --submodule=log --cached >actual && 194 cat >expected <<-EOF && 195 Submodule sm1 $head4...0000000 (submodule deleted) 196 diff --git a/sm1 b/sm1 197 new file mode 100644 198 index 0000000..$head5 199 --- /dev/null 200 +++ b/sm1 201 @@ -0,0 +1 @@ 202 +sm1 203 EOF 204 test_cmp expected actual 205' 206 207test_expect_success 'typechanged submodule(submodule->blob)' ' 208 git diff --submodule=log >actual && 209 cat >expected <<-EOF && 210 diff --git a/sm1 b/sm1 211 deleted file mode 100644 212 index $head5..0000000 213 --- a/sm1 214 +++ /dev/null 215 @@ -1 +0,0 @@ 216 -sm1 217 Submodule sm1 0000000...$head4 (new submodule) 218 EOF 219 test_cmp expected actual 220' 221 222rm -rf sm1 && 223git checkout-index sm1 224test_expect_success 'typechanged submodule(submodule->blob)' ' 225 git diff-index -p --submodule=log HEAD >actual && 226 cat >expected <<-EOF && 227 Submodule sm1 $head4...0000000 (submodule deleted) 228 diff --git a/sm1 b/sm1 229 new file mode 100644 230 index 0000000..$head5 231 --- /dev/null 232 +++ b/sm1 233 @@ -0,0 +1 @@ 234 +sm1 235 EOF 236 test_cmp expected actual 237' 238 239test_expect_success 'setup submodule anew' ' 240 rm -f sm1 && 241 git init sm1 && 242 head6=$(add_file sm1 foo6 foo7) && 243 fullhead6=$(cd sm1 && git rev-parse --verify HEAD) 244' 245 246test_expect_success 'nonexistent commit' ' 247 git diff-index -p --submodule=log HEAD >actual && 248 cat >expected <<-EOF && 249 Submodule sm1 $head4...$head6 (commits not present) 250 EOF 251 test_cmp expected actual 252' 253 254commit_file 255test_expect_success 'typechanged submodule(blob->submodule)' ' 256 git diff-index -p --submodule=log HEAD >actual && 257 cat >expected <<-EOF && 258 diff --git a/sm1 b/sm1 259 deleted file mode 100644 260 index $head5..0000000 261 --- a/sm1 262 +++ /dev/null 263 @@ -1 +0,0 @@ 264 -sm1 265 Submodule sm1 0000000...$head6 (new submodule) 266 EOF 267 test_cmp expected actual 268' 269 270commit_file sm1 && 271test_expect_success 'submodule is up to date' ' 272 git diff-index -p --submodule=log HEAD >actual && 273 test_must_be_empty actual 274' 275 276test_expect_success 'submodule contains untracked content' ' 277 echo new > sm1/new-file && 278 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && 279 cat >expected <<-EOF && 280 Submodule sm1 contains untracked content 281 EOF 282 test_cmp expected actual 283' 284 285test_expect_success 'submodule contains untracked content (untracked ignored)' ' 286 git diff-index -p --submodule=log HEAD >actual && 287 test_must_be_empty actual 288' 289 290test_expect_success 'submodule contains untracked content (dirty ignored)' ' 291 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual && 292 test_must_be_empty actual 293' 294 295test_expect_success 'submodule contains untracked content (all ignored)' ' 296 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual && 297 test_must_be_empty actual 298' 299 300test_expect_success 'submodule contains untracked and modified content' ' 301 echo new > sm1/foo6 && 302 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && 303 cat >expected <<-EOF && 304 Submodule sm1 contains untracked content 305 Submodule sm1 contains modified content 306 EOF 307 test_cmp expected actual 308' 309 310test_expect_success 'submodule contains untracked and modified content (untracked ignored)' ' 311 echo new > sm1/foo6 && 312 git diff-index -p --submodule=log HEAD >actual && 313 cat >expected <<-EOF && 314 Submodule sm1 contains modified content 315 EOF 316 test_cmp expected actual 317' 318 319test_expect_success 'submodule contains untracked and modified content (dirty ignored)' ' 320 echo new > sm1/foo6 && 321 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual && 322 test_must_be_empty actual 323' 324 325test_expect_success 'submodule contains untracked and modified content (all ignored)' ' 326 echo new > sm1/foo6 && 327 git diff-index -p --ignore-submodules --submodule=log HEAD >actual && 328 test_must_be_empty actual 329' 330 331test_expect_success 'submodule contains modified content' ' 332 rm -f sm1/new-file && 333 git diff-index -p --submodule=log HEAD >actual && 334 cat >expected <<-EOF && 335 Submodule sm1 contains modified content 336 EOF 337 test_cmp expected actual 338' 339 340(cd sm1; git commit -mchange foo6 >/dev/null) && 341head8=$(cd sm1; git rev-parse --short --verify HEAD) && 342test_expect_success 'submodule is modified' ' 343 git diff-index -p --submodule=log HEAD >actual && 344 cat >expected <<-EOF && 345 Submodule sm1 $head6..$head8: 346 > change 347 EOF 348 test_cmp expected actual 349' 350 351test_expect_success 'modified submodule contains untracked content' ' 352 echo new > sm1/new-file && 353 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && 354 cat >expected <<-EOF && 355 Submodule sm1 contains untracked content 356 Submodule sm1 $head6..$head8: 357 > change 358 EOF 359 test_cmp expected actual 360' 361 362test_expect_success 'modified submodule contains untracked content (untracked ignored)' ' 363 git diff-index -p --submodule=log HEAD >actual && 364 cat >expected <<-EOF && 365 Submodule sm1 $head6..$head8: 366 > change 367 EOF 368 test_cmp expected actual 369' 370 371test_expect_success 'modified submodule contains untracked content (dirty ignored)' ' 372 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual && 373 cat >expected <<-EOF && 374 Submodule sm1 $head6..$head8: 375 > change 376 EOF 377 test_cmp expected actual 378' 379 380test_expect_success 'modified submodule contains untracked content (all ignored)' ' 381 git diff-index -p --ignore-submodules=all --submodule=log HEAD >actual && 382 test_must_be_empty actual 383' 384 385test_expect_success 'modified submodule contains untracked and modified content' ' 386 echo modification >> sm1/foo6 && 387 git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual && 388 cat >expected <<-EOF && 389 Submodule sm1 contains untracked content 390 Submodule sm1 contains modified content 391 Submodule sm1 $head6..$head8: 392 > change 393 EOF 394 test_cmp expected actual 395' 396 397test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' ' 398 echo modification >> sm1/foo6 && 399 git diff-index -p --submodule=log HEAD >actual && 400 cat >expected <<-EOF && 401 Submodule sm1 contains modified content 402 Submodule sm1 $head6..$head8: 403 > change 404 EOF 405 test_cmp expected actual 406' 407 408test_expect_success 'modified submodule contains untracked and modified content (dirty ignored)' ' 409 echo modification >> sm1/foo6 && 410 git diff-index -p --ignore-submodules=dirty --submodule=log HEAD >actual && 411 cat >expected <<-EOF && 412 Submodule sm1 $head6..$head8: 413 > change 414 EOF 415 test_cmp expected actual 416' 417 418test_expect_success 'modified submodule contains untracked and modified content (all ignored)' ' 419 echo modification >> sm1/foo6 && 420 git diff-index -p --ignore-submodules --submodule=log HEAD >actual && 421 test_must_be_empty actual 422' 423 424test_expect_success 'modified submodule contains modified content' ' 425 rm -f sm1/new-file && 426 git diff-index -p --submodule=log HEAD >actual && 427 cat >expected <<-EOF && 428 Submodule sm1 contains modified content 429 Submodule sm1 $head6..$head8: 430 > change 431 EOF 432 test_cmp expected actual 433' 434 435rm -rf sm1 436test_expect_success 'deleted submodule' ' 437 git diff-index -p --submodule=log HEAD >actual && 438 cat >expected <<-EOF && 439 Submodule sm1 $head6...0000000 (submodule deleted) 440 EOF 441 test_cmp expected actual 442' 443 444test_expect_success 'create second submodule' ' 445 test_create_repo sm2 && 446 head7=$(add_file sm2 foo8 foo9) && 447 git add sm2 448' 449 450test_expect_success 'multiple submodules' ' 451 git diff-index -p --submodule=log HEAD >actual && 452 cat >expected <<-EOF && 453 Submodule sm1 $head6...0000000 (submodule deleted) 454 Submodule sm2 0000000...$head7 (new submodule) 455 EOF 456 test_cmp expected actual 457' 458 459test_expect_success 'path filter' ' 460 git diff-index -p --submodule=log HEAD sm2 >actual && 461 cat >expected <<-EOF && 462 Submodule sm2 0000000...$head7 (new submodule) 463 EOF 464 test_cmp expected actual 465' 466 467commit_file sm2 468test_expect_success 'given commit' ' 469 git diff-index -p --submodule=log HEAD^ >actual && 470 cat >expected <<-EOF && 471 Submodule sm1 $head6...0000000 (submodule deleted) 472 Submodule sm2 0000000...$head7 (new submodule) 473 EOF 474 test_cmp expected actual 475' 476 477test_expect_success 'given commit --submodule' ' 478 git diff-index -p --submodule HEAD^ >actual && 479 cat >expected <<-EOF && 480 Submodule sm1 $head6...0000000 (submodule deleted) 481 Submodule sm2 0000000...$head7 (new submodule) 482 EOF 483 test_cmp expected actual 484' 485 486fullhead7=$(cd sm2; git rev-parse --verify HEAD) 487 488test_expect_success 'given commit --submodule=short' ' 489 git diff-index -p --submodule=short HEAD^ >actual && 490 cat >expected <<-EOF && 491 diff --git a/sm1 b/sm1 492 deleted file mode 160000 493 index $head6..0000000 494 --- a/sm1 495 +++ /dev/null 496 @@ -1 +0,0 @@ 497 -Subproject commit $fullhead6 498 diff --git a/sm2 b/sm2 499 new file mode 160000 500 index 0000000..$head7 501 --- /dev/null 502 +++ b/sm2 503 @@ -0,0 +1 @@ 504 +Subproject commit $fullhead7 505 EOF 506 test_cmp expected actual 507' 508 509test_expect_success 'setup .git file for sm2' ' 510 (cd sm2 && 511 REAL="$(pwd)/../.real" && 512 mv .git "$REAL" && 513 echo "gitdir: $REAL" >.git) 514' 515 516test_expect_success 'diff --submodule with .git file' ' 517 git diff --submodule HEAD^ >actual && 518 cat >expected <<-EOF && 519 Submodule sm1 $head6...0000000 (submodule deleted) 520 Submodule sm2 0000000...$head7 (new submodule) 521 EOF 522 test_cmp expected actual 523' 524 525test_expect_success 'diff --submodule with objects referenced by alternates' ' 526 mkdir sub_alt && 527 (cd sub_alt && 528 git init && 529 echo a >a && 530 git add a && 531 git commit -m a 532 ) && 533 mkdir super && 534 (cd super && 535 git clone -s ../sub_alt sub && 536 git init && 537 git add sub && 538 git commit -m "sub a" 539 ) && 540 (cd sub_alt && 541 sha1_before=$(git rev-parse --short HEAD) && 542 echo b >b && 543 git add b && 544 git commit -m b && 545 sha1_after=$(git rev-parse --short HEAD) && 546 { 547 echo "Submodule sub $sha1_before..$sha1_after:" && 548 echo " > b" 549 } >../expected 550 ) && 551 (cd super && 552 (cd sub && 553 git fetch && 554 git checkout origin/main 555 ) && 556 git diff --submodule > ../actual 557 ) && 558 test_cmp expected actual 559' 560 561test_done