t / t9300-fast-import.shon commit Merge branch 'maint' (8299886)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Shawn Pearce
   4#
   5
   6test_description='test git-fast-import utility'
   7. ./test-lib.sh
   8. ../diff-lib.sh ;# test-lib chdir's into trash
   9
  10file2_data='file2
  11second line of EOF'
  12
  13file3_data='EOF
  14in 3rd file
  15 END'
  16
  17file4_data=abcd
  18file4_len=4
  19
  20file5_data='an inline file.
  21  we should see it later.'
  22
  23file6_data='#!/bin/sh
  24echo "$@"'
  25
  26###
  27### series A
  28###
  29
  30test_tick
  31cat >input <<INPUT_END
  32blob
  33mark :2
  34data <<EOF
  35$file2_data
  36EOF
  37
  38blob
  39mark :3
  40data <<END
  41$file3_data
  42END
  43
  44blob
  45mark :4
  46data $file4_len
  47$file4_data
  48commit refs/heads/master
  49mark :5
  50committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
  51data <<COMMIT
  52initial
  53COMMIT
  54
  55M 644 :2 file2
  56M 644 :3 file3
  57M 755 :4 file4
  58
  59INPUT_END
  60test_expect_success \
  61    'A: create pack from stdin' \
  62    'git-fast-import --export-marks=marks.out <input &&
  63         git-whatchanged master'
  64test_expect_success \
  65        'A: verify pack' \
  66        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
  67
  68cat >expect <<EOF
  69author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
  70committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
  71
  72initial
  73EOF
  74test_expect_success \
  75        'A: verify commit' \
  76        'git-cat-file commit master | sed 1d >actual &&
  77        git diff expect actual'
  78
  79cat >expect <<EOF
  80100644 blob file2
  81100644 blob file3
  82100755 blob file4
  83EOF
  84test_expect_success \
  85        'A: verify tree' \
  86        'git-cat-file -p master^{tree} | sed "s/ [0-9a-f]*      / /" >actual &&
  87         git diff expect actual'
  88
  89echo "$file2_data" >expect
  90test_expect_success \
  91        'A: verify file2' \
  92        'git-cat-file blob master:file2 >actual && git diff expect actual'
  93
  94echo "$file3_data" >expect
  95test_expect_success \
  96        'A: verify file3' \
  97        'git-cat-file blob master:file3 >actual && git diff expect actual'
  98
  99printf "$file4_data" >expect
 100test_expect_success \
 101        'A: verify file4' \
 102        'git-cat-file blob master:file4 >actual && git diff expect actual'
 103
 104cat >expect <<EOF
 105:2 `git-rev-parse --verify master:file2`
 106:3 `git-rev-parse --verify master:file3`
 107:4 `git-rev-parse --verify master:file4`
 108:5 `git-rev-parse --verify master^0`
 109EOF
 110test_expect_success \
 111        'A: verify marks output' \
 112        'git diff expect marks.out'
 113
 114test_expect_success \
 115        'A: verify marks import' \
 116        'git-fast-import \
 117                --import-marks=marks.out \
 118                --export-marks=marks.new \
 119                </dev/null &&
 120        git diff -u expect marks.new'
 121
 122###
 123### series B
 124###
 125
 126test_tick
 127cat >input <<INPUT_END
 128commit refs/heads/branch
 129mark :1
 130committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 131data <<COMMIT
 132corrupt
 133COMMIT
 134
 135from refs/heads/master
 136M 755 0000000000000000000000000000000000000001 zero1
 137
 138INPUT_END
 139test_expect_failure \
 140    'B: fail on invalid blob sha1' \
 141    'git-fast-import <input'
 142rm -f .git/objects/pack_* .git/objects/index_*
 143
 144###
 145### series C
 146###
 147
 148newf=`echo hi newf | git-hash-object -w --stdin`
 149oldf=`git-rev-parse --verify master:file2`
 150test_tick
 151cat >input <<INPUT_END
 152commit refs/heads/branch
 153committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 154data <<COMMIT
 155second
 156COMMIT
 157
 158from refs/heads/master
 159M 644 $oldf file2/oldf
 160M 755 $newf file2/newf
 161D file3
 162
 163INPUT_END
 164test_expect_success \
 165    'C: incremental import create pack from stdin' \
 166    'git-fast-import <input &&
 167         git-whatchanged branch'
 168test_expect_success \
 169        'C: verify pack' \
 170        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 171test_expect_success \
 172        'C: validate reuse existing blob' \
 173        'test $newf = `git-rev-parse --verify branch:file2/newf`
 174         test $oldf = `git-rev-parse --verify branch:file2/oldf`'
 175
 176cat >expect <<EOF
 177parent `git-rev-parse --verify master^0`
 178author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 179committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 180
 181second
 182EOF
 183test_expect_success \
 184        'C: verify commit' \
 185        'git-cat-file commit branch | sed 1d >actual &&
 186         git diff expect actual'
 187
 188cat >expect <<EOF
 189:000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A      file2/newf
 190:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100   file2   file2/oldf
 191:100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D      file3
 192EOF
 193git-diff-tree -M -r master branch >actual
 194test_expect_success \
 195        'C: validate rename result' \
 196        'compare_diff_raw expect actual'
 197
 198###
 199### series D
 200###
 201
 202test_tick
 203cat >input <<INPUT_END
 204commit refs/heads/branch
 205committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 206data <<COMMIT
 207third
 208COMMIT
 209
 210from refs/heads/branch^0
 211M 644 inline newdir/interesting
 212data <<EOF
 213$file5_data
 214EOF
 215
 216M 755 inline newdir/exec.sh
 217data <<EOF
 218$file6_data
 219EOF
 220
 221INPUT_END
 222test_expect_success \
 223    'D: inline data in commit' \
 224    'git-fast-import <input &&
 225         git-whatchanged branch'
 226test_expect_success \
 227        'D: verify pack' \
 228        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 229
 230cat >expect <<EOF
 231:000000 100755 0000000000000000000000000000000000000000 35a59026a33beac1569b1c7f66f3090ce9c09afc A      newdir/exec.sh
 232:000000 100644 0000000000000000000000000000000000000000 046d0371e9220107917db0d0e030628de8a1de9b A      newdir/interesting
 233EOF
 234git-diff-tree -M -r branch^ branch >actual
 235test_expect_success \
 236        'D: validate new files added' \
 237        'compare_diff_raw expect actual'
 238
 239echo "$file5_data" >expect
 240test_expect_success \
 241        'D: verify file5' \
 242        'git-cat-file blob branch:newdir/interesting >actual &&
 243         git diff expect actual'
 244
 245echo "$file6_data" >expect
 246test_expect_success \
 247        'D: verify file6' \
 248        'git-cat-file blob branch:newdir/exec.sh >actual &&
 249         git diff expect actual'
 250
 251###
 252### series E
 253###
 254
 255cat >input <<INPUT_END
 256commit refs/heads/branch
 257author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500
 258committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500
 259data <<COMMIT
 260RFC 2822 type date
 261COMMIT
 262
 263from refs/heads/branch^0
 264
 265INPUT_END
 266test_expect_failure \
 267    'E: rfc2822 date, --date-format=raw' \
 268    'git-fast-import --date-format=raw <input'
 269test_expect_success \
 270    'E: rfc2822 date, --date-format=rfc2822' \
 271    'git-fast-import --date-format=rfc2822 <input'
 272test_expect_success \
 273        'E: verify pack' \
 274        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 275
 276cat >expect <<EOF
 277author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500
 278committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500
 279
 280RFC 2822 type date
 281EOF
 282test_expect_success \
 283        'E: verify commit' \
 284        'git-cat-file commit branch | sed 1,2d >actual &&
 285        git diff expect actual'
 286
 287###
 288### series F
 289###
 290
 291old_branch=`git-rev-parse --verify branch^0`
 292test_tick
 293cat >input <<INPUT_END
 294commit refs/heads/branch
 295committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 296data <<COMMIT
 297losing things already?
 298COMMIT
 299
 300from refs/heads/branch~1
 301
 302reset refs/heads/other
 303from refs/heads/branch
 304
 305INPUT_END
 306test_expect_success \
 307    'F: non-fast-forward update skips' \
 308    'if git-fast-import <input
 309         then
 310                echo BAD gfi did not fail
 311                return 1
 312         else
 313                if test $old_branch = `git-rev-parse --verify branch^0`
 314                then
 315                        : branch unaffected and failure returned
 316                        return 0
 317                else
 318                        echo BAD gfi changed branch $old_branch
 319                        return 1
 320                fi
 321         fi
 322        '
 323test_expect_success \
 324        'F: verify pack' \
 325        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 326
 327cat >expect <<EOF
 328tree `git-rev-parse branch~1^{tree}`
 329parent `git-rev-parse branch~1`
 330author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 331committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 332
 333losing things already?
 334EOF
 335test_expect_success \
 336        'F: verify other commit' \
 337        'git-cat-file commit other >actual &&
 338        git diff expect actual'
 339
 340###
 341### series G
 342###
 343
 344old_branch=`git-rev-parse --verify branch^0`
 345test_tick
 346cat >input <<INPUT_END
 347commit refs/heads/branch
 348committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 349data <<COMMIT
 350losing things already?
 351COMMIT
 352
 353from refs/heads/branch~1
 354
 355INPUT_END
 356test_expect_success \
 357    'G: non-fast-forward update forced' \
 358    'git-fast-import --force <input'
 359test_expect_success \
 360        'G: verify pack' \
 361        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 362test_expect_success \
 363        'G: branch changed, but logged' \
 364        'test $old_branch != `git-rev-parse --verify branch^0` &&
 365         test $old_branch = `git-rev-parse --verify branch@{1}`'
 366
 367###
 368### series H
 369###
 370
 371test_tick
 372cat >input <<INPUT_END
 373commit refs/heads/H
 374committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 375data <<COMMIT
 376third
 377COMMIT
 378
 379from refs/heads/branch^0
 380M 644 inline i-will-die
 381data <<EOF
 382this file will never exist.
 383EOF
 384
 385deleteall
 386M 644 inline h/e/l/lo
 387data <<EOF
 388$file5_data
 389EOF
 390
 391INPUT_END
 392test_expect_success \
 393    'H: deletall, add 1' \
 394    'git-fast-import <input &&
 395         git-whatchanged H'
 396test_expect_success \
 397        'H: verify pack' \
 398        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 399
 400cat >expect <<EOF
 401:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D      file2/newf
 402:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D      file2/oldf
 403:100755 000000 85df50785d62d3b05ab03d9cbf7e4a0b49449730 0000000000000000000000000000000000000000 D      file4
 404:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100   newdir/interesting      h/e/l/lo
 405:100755 000000 e74b7d465e52746be2b4bae983670711e6e66657 0000000000000000000000000000000000000000 D      newdir/exec.sh
 406EOF
 407git-diff-tree -M -r H^ H >actual
 408test_expect_success \
 409        'H: validate old files removed, new files added' \
 410        'compare_diff_raw expect actual'
 411
 412echo "$file5_data" >expect
 413test_expect_success \
 414        'H: verify file' \
 415        'git-cat-file blob H:h/e/l/lo >actual &&
 416         git diff expect actual'
 417
 418###
 419### series I
 420###
 421
 422cat >input <<INPUT_END
 423commit refs/heads/export-boundary
 424committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 425data <<COMMIT
 426we have a border.  its only 40 characters wide.
 427COMMIT
 428
 429from refs/heads/branch
 430
 431INPUT_END
 432test_expect_success \
 433    'I: export-pack-edges' \
 434    'git-fast-import --export-pack-edges=edges.list <input'
 435
 436cat >expect <<EOF
 437.git/objects/pack/pack-.pack: `git-rev-parse --verify export-boundary`
 438EOF
 439test_expect_success \
 440        'I: verify edge list' \
 441        'sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
 442         git diff expect actual'
 443
 444###
 445### series J
 446###
 447
 448cat >input <<INPUT_END
 449commit refs/heads/J
 450committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 451data <<COMMIT
 452create J
 453COMMIT
 454
 455from refs/heads/branch
 456
 457reset refs/heads/J
 458
 459commit refs/heads/J
 460committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 461data <<COMMIT
 462initialize J
 463COMMIT
 464
 465INPUT_END
 466test_expect_success \
 467    'J: reset existing branch creates empty commit' \
 468    'git-fast-import <input'
 469test_expect_success \
 470        'J: branch has 1 commit, empty tree' \
 471        'test 1 = `git-rev-list J | wc -l` &&
 472         test 0 = `git ls-tree J | wc -l`'
 473
 474###
 475### series K
 476###
 477
 478cat >input <<INPUT_END
 479commit refs/heads/K
 480committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 481data <<COMMIT
 482create K
 483COMMIT
 484
 485from refs/heads/branch
 486
 487commit refs/heads/K
 488committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 489data <<COMMIT
 490redo K
 491COMMIT
 492
 493from refs/heads/branch^1
 494
 495INPUT_END
 496test_expect_success \
 497    'K: reinit branch with from' \
 498    'git-fast-import <input'
 499test_expect_success \
 500    'K: verify K^1 = branch^1' \
 501    'test `git-rev-parse --verify branch^1` \
 502                = `git-rev-parse --verify K^1`'
 503
 504###
 505### series L
 506###
 507
 508cat >input <<INPUT_END
 509blob
 510mark :1
 511data <<EOF
 512some data
 513EOF
 514
 515blob
 516mark :2
 517data <<EOF
 518other data
 519EOF
 520
 521commit refs/heads/L
 522committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 523data <<COMMIT
 524create L
 525COMMIT
 526
 527M 644 :1 b.
 528M 644 :1 b/other
 529M 644 :1 ba
 530
 531commit refs/heads/L
 532committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 533data <<COMMIT
 534update L
 535COMMIT
 536
 537M 644 :2 b.
 538M 644 :2 b/other
 539M 644 :2 ba
 540INPUT_END
 541
 542cat >expect <<EXPECT_END
 543:100644 100644 4268632... 55d3a52... M  b.
 544:040000 040000 0ae5cac... 443c768... M  b
 545:100644 100644 4268632... 55d3a52... M  ba
 546EXPECT_END
 547
 548test_expect_success \
 549    'L: verify internal tree sorting' \
 550        'git-fast-import <input &&
 551         git-diff --raw L^ L >output &&
 552         git diff expect output'
 553
 554test_done