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