t / t9300-fast-import.shon commit Merge branch 'maint-1.5.1' into maint (8e29f90)
   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
 122test_tick
 123cat >input <<INPUT_END
 124commit refs/heads/verify--import-marks
 125committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 126data <<COMMIT
 127recreate from :5
 128COMMIT
 129
 130from :5
 131M 755 :2 copy-of-file2
 132
 133INPUT_END
 134test_expect_success \
 135        'A: verify marks import does not crash' \
 136        'git-fast-import --import-marks=marks.out <input &&
 137         git-whatchanged verify--import-marks'
 138test_expect_success \
 139        'A: verify pack' \
 140        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 141cat >expect <<EOF
 142:000000 100755 0000000000000000000000000000000000000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 A      copy-of-file2
 143EOF
 144git-diff-tree -M -r master verify--import-marks >actual
 145test_expect_success \
 146        'A: verify diff' \
 147        'compare_diff_raw expect actual &&
 148         test `git-rev-parse --verify master:file2` \
 149            = `git-rev-parse --verify verify--import-marks:copy-of-file2`'
 150
 151###
 152### series B
 153###
 154
 155test_tick
 156cat >input <<INPUT_END
 157commit refs/heads/branch
 158mark :1
 159committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 160data <<COMMIT
 161corrupt
 162COMMIT
 163
 164from refs/heads/master
 165M 755 0000000000000000000000000000000000000001 zero1
 166
 167INPUT_END
 168test_expect_failure \
 169    'B: fail on invalid blob sha1' \
 170    'git-fast-import <input'
 171rm -f .git/objects/pack_* .git/objects/index_*
 172
 173###
 174### series C
 175###
 176
 177newf=`echo hi newf | git-hash-object -w --stdin`
 178oldf=`git-rev-parse --verify master:file2`
 179test_tick
 180cat >input <<INPUT_END
 181commit refs/heads/branch
 182committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 183data <<COMMIT
 184second
 185COMMIT
 186
 187from refs/heads/master
 188M 644 $oldf file2/oldf
 189M 755 $newf file2/newf
 190D file3
 191
 192INPUT_END
 193test_expect_success \
 194    'C: incremental import create pack from stdin' \
 195    'git-fast-import <input &&
 196         git-whatchanged branch'
 197test_expect_success \
 198        'C: verify pack' \
 199        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 200test_expect_success \
 201        'C: validate reuse existing blob' \
 202        'test $newf = `git-rev-parse --verify branch:file2/newf`
 203         test $oldf = `git-rev-parse --verify branch:file2/oldf`'
 204
 205cat >expect <<EOF
 206parent `git-rev-parse --verify master^0`
 207author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 208committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 209
 210second
 211EOF
 212test_expect_success \
 213        'C: verify commit' \
 214        'git-cat-file commit branch | sed 1d >actual &&
 215         git diff expect actual'
 216
 217cat >expect <<EOF
 218:000000 100755 0000000000000000000000000000000000000000 f1fb5da718392694d0076d677d6d0e364c79b0bc A      file2/newf
 219:100644 100644 7123f7f44e39be127c5eb701e5968176ee9d78b1 7123f7f44e39be127c5eb701e5968176ee9d78b1 R100   file2   file2/oldf
 220:100644 000000 0d92e9f3374ae2947c23aa477cbc68ce598135f1 0000000000000000000000000000000000000000 D      file3
 221EOF
 222git-diff-tree -M -r master branch >actual
 223test_expect_success \
 224        'C: validate rename result' \
 225        'compare_diff_raw expect actual'
 226
 227###
 228### series D
 229###
 230
 231test_tick
 232cat >input <<INPUT_END
 233commit refs/heads/branch
 234committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 235data <<COMMIT
 236third
 237COMMIT
 238
 239from refs/heads/branch^0
 240M 644 inline newdir/interesting
 241data <<EOF
 242$file5_data
 243EOF
 244
 245M 755 inline newdir/exec.sh
 246data <<EOF
 247$file6_data
 248EOF
 249
 250INPUT_END
 251test_expect_success \
 252    'D: inline data in commit' \
 253    'git-fast-import <input &&
 254         git-whatchanged branch'
 255test_expect_success \
 256        'D: verify pack' \
 257        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 258
 259cat >expect <<EOF
 260:000000 100755 0000000000000000000000000000000000000000 35a59026a33beac1569b1c7f66f3090ce9c09afc A      newdir/exec.sh
 261:000000 100644 0000000000000000000000000000000000000000 046d0371e9220107917db0d0e030628de8a1de9b A      newdir/interesting
 262EOF
 263git-diff-tree -M -r branch^ branch >actual
 264test_expect_success \
 265        'D: validate new files added' \
 266        'compare_diff_raw expect actual'
 267
 268echo "$file5_data" >expect
 269test_expect_success \
 270        'D: verify file5' \
 271        'git-cat-file blob branch:newdir/interesting >actual &&
 272         git diff expect actual'
 273
 274echo "$file6_data" >expect
 275test_expect_success \
 276        'D: verify file6' \
 277        'git-cat-file blob branch:newdir/exec.sh >actual &&
 278         git diff expect actual'
 279
 280###
 281### series E
 282###
 283
 284cat >input <<INPUT_END
 285commit refs/heads/branch
 286author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> Tue Feb 6 11:22:18 2007 -0500
 287committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> Tue Feb 6 12:35:02 2007 -0500
 288data <<COMMIT
 289RFC 2822 type date
 290COMMIT
 291
 292from refs/heads/branch^0
 293
 294INPUT_END
 295test_expect_failure \
 296    'E: rfc2822 date, --date-format=raw' \
 297    'git-fast-import --date-format=raw <input'
 298test_expect_success \
 299    'E: rfc2822 date, --date-format=rfc2822' \
 300    'git-fast-import --date-format=rfc2822 <input'
 301test_expect_success \
 302        'E: verify pack' \
 303        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 304
 305cat >expect <<EOF
 306author $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL> 1170778938 -0500
 307committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> 1170783302 -0500
 308
 309RFC 2822 type date
 310EOF
 311test_expect_success \
 312        'E: verify commit' \
 313        'git-cat-file commit branch | sed 1,2d >actual &&
 314        git diff expect actual'
 315
 316###
 317### series F
 318###
 319
 320old_branch=`git-rev-parse --verify branch^0`
 321test_tick
 322cat >input <<INPUT_END
 323commit refs/heads/branch
 324committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 325data <<COMMIT
 326losing things already?
 327COMMIT
 328
 329from refs/heads/branch~1
 330
 331reset refs/heads/other
 332from refs/heads/branch
 333
 334INPUT_END
 335test_expect_success \
 336    'F: non-fast-forward update skips' \
 337    'if git-fast-import <input
 338         then
 339                echo BAD gfi did not fail
 340                return 1
 341         else
 342                if test $old_branch = `git-rev-parse --verify branch^0`
 343                then
 344                        : branch unaffected and failure returned
 345                        return 0
 346                else
 347                        echo BAD gfi changed branch $old_branch
 348                        return 1
 349                fi
 350         fi
 351        '
 352test_expect_success \
 353        'F: verify pack' \
 354        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 355
 356cat >expect <<EOF
 357tree `git-rev-parse branch~1^{tree}`
 358parent `git-rev-parse branch~1`
 359author $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 360committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 361
 362losing things already?
 363EOF
 364test_expect_success \
 365        'F: verify other commit' \
 366        'git-cat-file commit other >actual &&
 367        git diff expect actual'
 368
 369###
 370### series G
 371###
 372
 373old_branch=`git-rev-parse --verify branch^0`
 374test_tick
 375cat >input <<INPUT_END
 376commit refs/heads/branch
 377committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 378data <<COMMIT
 379losing things already?
 380COMMIT
 381
 382from refs/heads/branch~1
 383
 384INPUT_END
 385test_expect_success \
 386    'G: non-fast-forward update forced' \
 387    'git-fast-import --force <input'
 388test_expect_success \
 389        'G: verify pack' \
 390        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 391test_expect_success \
 392        'G: branch changed, but logged' \
 393        'test $old_branch != `git-rev-parse --verify branch^0` &&
 394         test $old_branch = `git-rev-parse --verify branch@{1}`'
 395
 396###
 397### series H
 398###
 399
 400test_tick
 401cat >input <<INPUT_END
 402commit refs/heads/H
 403committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 404data <<COMMIT
 405third
 406COMMIT
 407
 408from refs/heads/branch^0
 409M 644 inline i-will-die
 410data <<EOF
 411this file will never exist.
 412EOF
 413
 414deleteall
 415M 644 inline h/e/l/lo
 416data <<EOF
 417$file5_data
 418EOF
 419
 420INPUT_END
 421test_expect_success \
 422    'H: deletall, add 1' \
 423    'git-fast-import <input &&
 424         git-whatchanged H'
 425test_expect_success \
 426        'H: verify pack' \
 427        'for p in .git/objects/pack/*.pack;do git-verify-pack $p||exit;done'
 428
 429cat >expect <<EOF
 430:100755 000000 f1fb5da718392694d0076d677d6d0e364c79b0bc 0000000000000000000000000000000000000000 D      file2/newf
 431:100644 000000 7123f7f44e39be127c5eb701e5968176ee9d78b1 0000000000000000000000000000000000000000 D      file2/oldf
 432:100755 000000 85df50785d62d3b05ab03d9cbf7e4a0b49449730 0000000000000000000000000000000000000000 D      file4
 433:100644 100644 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 fcf778cda181eaa1cbc9e9ce3a2e15ee9f9fe791 R100   newdir/interesting      h/e/l/lo
 434:100755 000000 e74b7d465e52746be2b4bae983670711e6e66657 0000000000000000000000000000000000000000 D      newdir/exec.sh
 435EOF
 436git-diff-tree -M -r H^ H >actual
 437test_expect_success \
 438        'H: validate old files removed, new files added' \
 439        'compare_diff_raw expect actual'
 440
 441echo "$file5_data" >expect
 442test_expect_success \
 443        'H: verify file' \
 444        'git-cat-file blob H:h/e/l/lo >actual &&
 445         git diff expect actual'
 446
 447###
 448### series I
 449###
 450
 451cat >input <<INPUT_END
 452commit refs/heads/export-boundary
 453committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 454data <<COMMIT
 455we have a border.  its only 40 characters wide.
 456COMMIT
 457
 458from refs/heads/branch
 459
 460INPUT_END
 461test_expect_success \
 462    'I: export-pack-edges' \
 463    'git-fast-import --export-pack-edges=edges.list <input'
 464
 465cat >expect <<EOF
 466.git/objects/pack/pack-.pack: `git-rev-parse --verify export-boundary`
 467EOF
 468test_expect_success \
 469        'I: verify edge list' \
 470        'sed -e s/pack-.*pack/pack-.pack/ edges.list >actual &&
 471         git diff expect actual'
 472
 473###
 474### series J
 475###
 476
 477cat >input <<INPUT_END
 478commit refs/heads/J
 479committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 480data <<COMMIT
 481create J
 482COMMIT
 483
 484from refs/heads/branch
 485
 486reset refs/heads/J
 487
 488commit refs/heads/J
 489committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 490data <<COMMIT
 491initialize J
 492COMMIT
 493
 494INPUT_END
 495test_expect_success \
 496    'J: reset existing branch creates empty commit' \
 497    'git-fast-import <input'
 498test_expect_success \
 499        'J: branch has 1 commit, empty tree' \
 500        'test 1 = `git-rev-list J | wc -l` &&
 501         test 0 = `git ls-tree J | wc -l`'
 502
 503###
 504### series K
 505###
 506
 507cat >input <<INPUT_END
 508commit refs/heads/K
 509committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 510data <<COMMIT
 511create K
 512COMMIT
 513
 514from refs/heads/branch
 515
 516commit refs/heads/K
 517committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 518data <<COMMIT
 519redo K
 520COMMIT
 521
 522from refs/heads/branch^1
 523
 524INPUT_END
 525test_expect_success \
 526    'K: reinit branch with from' \
 527    'git-fast-import <input'
 528test_expect_success \
 529    'K: verify K^1 = branch^1' \
 530    'test `git-rev-parse --verify branch^1` \
 531                = `git-rev-parse --verify K^1`'
 532
 533###
 534### series L
 535###
 536
 537cat >input <<INPUT_END
 538blob
 539mark :1
 540data <<EOF
 541some data
 542EOF
 543
 544blob
 545mark :2
 546data <<EOF
 547other data
 548EOF
 549
 550commit refs/heads/L
 551committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 552data <<COMMIT
 553create L
 554COMMIT
 555
 556M 644 :1 b.
 557M 644 :1 b/other
 558M 644 :1 ba
 559
 560commit refs/heads/L
 561committer $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL> $GIT_COMMITTER_DATE
 562data <<COMMIT
 563update L
 564COMMIT
 565
 566M 644 :2 b.
 567M 644 :2 b/other
 568M 644 :2 ba
 569INPUT_END
 570
 571cat >expect <<EXPECT_END
 572:100644 100644 4268632... 55d3a52... M  b.
 573:040000 040000 0ae5cac... 443c768... M  b
 574:100644 100644 4268632... 55d3a52... M  ba
 575EXPECT_END
 576
 577test_expect_success \
 578    'L: verify internal tree sorting' \
 579        'git-fast-import <input &&
 580         git-diff --raw L^ L >output &&
 581         git diff expect output'
 582
 583test_done