t / t9350-fast-export.shon commit Merge branch 'jl/submodule-deinit' (7b72ec5)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Johannes E. Schindelin
   4#
   5
   6test_description='git fast-export'
   7. ./test-lib.sh
   8
   9test_expect_success 'setup' '
  10
  11        echo break it > file0 &&
  12        git add file0 &&
  13        test_tick &&
  14        echo Wohlauf > file &&
  15        git add file &&
  16        test_tick &&
  17        git commit -m initial &&
  18        echo die Luft > file &&
  19        echo geht frisch > file2 &&
  20        git add file file2 &&
  21        test_tick &&
  22        git commit -m second &&
  23        echo und > file2 &&
  24        test_tick &&
  25        git commit -m third file2 &&
  26        test_tick &&
  27        git tag rein &&
  28        git checkout -b wer HEAD^ &&
  29        echo lange > file2 &&
  30        test_tick &&
  31        git commit -m sitzt file2 &&
  32        test_tick &&
  33        git tag -a -m valentin muss &&
  34        git merge -s ours master
  35
  36'
  37
  38test_expect_success 'fast-export | fast-import' '
  39
  40        MASTER=$(git rev-parse --verify master) &&
  41        REIN=$(git rev-parse --verify rein) &&
  42        WER=$(git rev-parse --verify wer) &&
  43        MUSS=$(git rev-parse --verify muss) &&
  44        mkdir new &&
  45        git --git-dir=new/.git init &&
  46        git fast-export --all |
  47        (cd new &&
  48         git fast-import &&
  49         test $MASTER = $(git rev-parse --verify refs/heads/master) &&
  50         test $REIN = $(git rev-parse --verify refs/tags/rein) &&
  51         test $WER = $(git rev-parse --verify refs/heads/wer) &&
  52         test $MUSS = $(git rev-parse --verify refs/tags/muss))
  53
  54'
  55
  56test_expect_success 'fast-export master~2..master' '
  57
  58        git fast-export master~2..master |
  59                sed "s/master/partial/" |
  60                (cd new &&
  61                 git fast-import &&
  62                 test $MASTER != $(git rev-parse --verify refs/heads/partial) &&
  63                 git diff --exit-code master partial &&
  64                 git diff --exit-code master^ partial^ &&
  65                 test_must_fail git rev-parse partial~2)
  66
  67'
  68
  69test_expect_success 'iso-8859-1' '
  70
  71        git config i18n.commitencoding ISO8859-1 &&
  72        # use author and committer name in ISO-8859-1 to match it.
  73        . "$TEST_DIRECTORY"/t3901-8859-1.txt &&
  74        test_tick &&
  75        echo rosten >file &&
  76        git commit -s -m den file &&
  77        git fast-export wer^..wer |
  78                sed "s/wer/i18n/" |
  79                (cd new &&
  80                 git fast-import &&
  81                 git cat-file commit i18n | grep "Áéí óú")
  82
  83'
  84test_expect_success 'import/export-marks' '
  85
  86        git checkout -b marks master &&
  87        git fast-export --export-marks=tmp-marks HEAD &&
  88        test -s tmp-marks &&
  89        test_line_count = 3 tmp-marks &&
  90        test $(
  91                git fast-export --import-marks=tmp-marks\
  92                --export-marks=tmp-marks HEAD |
  93                grep ^commit |
  94                wc -l) \
  95        -eq 0 &&
  96        echo change > file &&
  97        git commit -m "last commit" file &&
  98        test $(
  99                git fast-export --import-marks=tmp-marks \
 100                --export-marks=tmp-marks HEAD |
 101                grep ^commit\  |
 102                wc -l) \
 103        -eq 1 &&
 104        test_line_count = 4 tmp-marks
 105
 106'
 107
 108cat > signed-tag-import << EOF
 109tag sign-your-name
 110from $(git rev-parse HEAD)
 111tagger C O Mitter <committer@example.com> 1112911993 -0700
 112data 210
 113A message for a sign
 114-----BEGIN PGP SIGNATURE-----
 115Version: GnuPG v1.4.5 (GNU/Linux)
 116
 117fakedsignaturefakedsignaturefakedsignaturefakedsignaturfakedsign
 118aturefakedsignaturefake=
 119=/59v
 120-----END PGP SIGNATURE-----
 121EOF
 122
 123test_expect_success 'set up faked signed tag' '
 124
 125        cat signed-tag-import | git fast-import
 126
 127'
 128
 129test_expect_success 'signed-tags=abort' '
 130
 131        test_must_fail git fast-export --signed-tags=abort sign-your-name
 132
 133'
 134
 135test_expect_success 'signed-tags=verbatim' '
 136
 137        git fast-export --signed-tags=verbatim sign-your-name > output &&
 138        grep PGP output
 139
 140'
 141
 142test_expect_success 'signed-tags=strip' '
 143
 144        git fast-export --signed-tags=strip sign-your-name > output &&
 145        ! grep PGP output
 146
 147'
 148
 149test_expect_success 'setup submodule' '
 150
 151        git checkout -f master &&
 152        mkdir sub &&
 153        (
 154                cd sub &&
 155                git init  &&
 156                echo test file > file &&
 157                git add file &&
 158                git commit -m sub_initial
 159        ) &&
 160        git submodule add "`pwd`/sub" sub &&
 161        git commit -m initial &&
 162        test_tick &&
 163        (
 164                cd sub &&
 165                echo more data >> file &&
 166                git add file &&
 167                git commit -m sub_second
 168        ) &&
 169        git add sub &&
 170        git commit -m second
 171
 172'
 173
 174test_expect_success 'submodule fast-export | fast-import' '
 175
 176        SUBENT1=$(git ls-tree master^ sub) &&
 177        SUBENT2=$(git ls-tree master sub) &&
 178        rm -rf new &&
 179        mkdir new &&
 180        git --git-dir=new/.git init &&
 181        git fast-export --signed-tags=strip --all |
 182        (cd new &&
 183         git fast-import &&
 184         test "$SUBENT1" = "$(git ls-tree refs/heads/master^ sub)" &&
 185         test "$SUBENT2" = "$(git ls-tree refs/heads/master sub)" &&
 186         git checkout master &&
 187         git submodule init &&
 188         git submodule update &&
 189         cmp sub/file ../sub/file)
 190
 191'
 192
 193GIT_AUTHOR_NAME='A U Thor'; export GIT_AUTHOR_NAME
 194GIT_COMMITTER_NAME='C O Mitter'; export GIT_COMMITTER_NAME
 195
 196test_expect_success 'setup copies' '
 197
 198        git config --unset i18n.commitencoding &&
 199        git checkout -b copy rein &&
 200        git mv file file3 &&
 201        git commit -m move1 &&
 202        test_tick &&
 203        cp file2 file4 &&
 204        git add file4 &&
 205        git mv file2 file5 &&
 206        git commit -m copy1 &&
 207        test_tick &&
 208        cp file3 file6 &&
 209        git add file6 &&
 210        git commit -m copy2 &&
 211        test_tick &&
 212        echo more text >> file6 &&
 213        echo even more text >> file6 &&
 214        git add file6 &&
 215        git commit -m modify &&
 216        test_tick &&
 217        cp file6 file7 &&
 218        echo test >> file7 &&
 219        git add file7 &&
 220        git commit -m copy_modify
 221
 222'
 223
 224test_expect_success 'fast-export -C -C | fast-import' '
 225
 226        ENTRY=$(git rev-parse --verify copy) &&
 227        rm -rf new &&
 228        mkdir new &&
 229        git --git-dir=new/.git init &&
 230        git fast-export -C -C --signed-tags=strip --all > output &&
 231        grep "^C file6 file7\$" output &&
 232        cat output |
 233        (cd new &&
 234         git fast-import &&
 235         test $ENTRY = $(git rev-parse --verify refs/heads/copy))
 236
 237'
 238
 239test_expect_success 'fast-export | fast-import when master is tagged' '
 240
 241        git tag -m msg last &&
 242        git fast-export -C -C --signed-tags=strip --all > output &&
 243        test $(grep -c "^tag " output) = 3
 244
 245'
 246
 247cat > tag-content << EOF
 248object $(git rev-parse HEAD)
 249type commit
 250tag rosten
 251EOF
 252
 253test_expect_success 'cope with tagger-less tags' '
 254
 255        TAG=$(git hash-object -t tag -w tag-content) &&
 256        git update-ref refs/tags/sonnenschein $TAG &&
 257        git fast-export -C -C --signed-tags=strip --all > output &&
 258        test $(grep -c "^tag " output) = 4 &&
 259        ! grep "Unspecified Tagger" output &&
 260        git fast-export -C -C --signed-tags=strip --all \
 261                --fake-missing-tagger > output &&
 262        test $(grep -c "^tag " output) = 4 &&
 263        grep "Unspecified Tagger" output
 264
 265'
 266
 267test_expect_success 'setup for limiting exports by PATH' '
 268        mkdir limit-by-paths &&
 269        (
 270                cd limit-by-paths &&
 271                git init &&
 272                echo hi > there &&
 273                git add there &&
 274                git commit -m "First file" &&
 275                echo foo > bar &&
 276                git add bar &&
 277                git commit -m "Second file" &&
 278                git tag -a -m msg mytag &&
 279                echo morefoo >> bar &&
 280                git add bar &&
 281                git commit -m "Change to second file"
 282        )
 283'
 284
 285cat > limit-by-paths/expected << EOF
 286blob
 287mark :1
 288data 3
 289hi
 290
 291reset refs/tags/mytag
 292commit refs/tags/mytag
 293mark :2
 294author A U Thor <author@example.com> 1112912713 -0700
 295committer C O Mitter <committer@example.com> 1112912713 -0700
 296data 11
 297First file
 298M 100644 :1 there
 299
 300EOF
 301
 302test_expect_success 'dropping tag of filtered out object' '
 303(
 304        cd limit-by-paths &&
 305        git fast-export --tag-of-filtered-object=drop mytag -- there > output &&
 306        test_cmp expected output
 307)
 308'
 309
 310cat >> limit-by-paths/expected << EOF
 311tag mytag
 312from :2
 313tagger C O Mitter <committer@example.com> 1112912713 -0700
 314data 4
 315msg
 316
 317EOF
 318
 319test_expect_success 'rewriting tag of filtered out object' '
 320(
 321        cd limit-by-paths &&
 322        git fast-export --tag-of-filtered-object=rewrite mytag -- there > output &&
 323        test_cmp expected output
 324)
 325'
 326
 327cat > limit-by-paths/expected << EOF
 328blob
 329mark :1
 330data 4
 331foo
 332
 333blob
 334mark :2
 335data 3
 336hi
 337
 338reset refs/heads/master
 339commit refs/heads/master
 340mark :3
 341author A U Thor <author@example.com> 1112912713 -0700
 342committer C O Mitter <committer@example.com> 1112912713 -0700
 343data 12
 344Second file
 345M 100644 :1 bar
 346M 100644 :2 there
 347
 348EOF
 349
 350test_expect_failure 'no exact-ref revisions included' '
 351        (
 352                cd limit-by-paths &&
 353                git fast-export master~2..master~1 > output &&
 354                test_cmp expected output
 355        )
 356'
 357
 358test_expect_success 'path limiting with import-marks does not lose unmodified files'        '
 359        git checkout -b simple marks~2 &&
 360        git fast-export --export-marks=marks simple -- file > /dev/null &&
 361        echo more content >> file &&
 362        test_tick &&
 363        git commit -mnext file &&
 364        git fast-export --import-marks=marks simple -- file file0 | grep file0
 365'
 366
 367test_expect_success 'full-tree re-shows unmodified files'        '
 368        git checkout -f simple &&
 369        test $(git fast-export --full-tree simple | grep -c file0) -eq 3
 370'
 371
 372test_expect_success 'set-up a few more tags for tag export tests' '
 373        git checkout -f master &&
 374        HEAD_TREE=`git show -s --pretty=raw HEAD | grep tree | sed "s/tree //"` &&
 375        git tag    tree_tag        -m "tagging a tree" $HEAD_TREE &&
 376        git tag -a tree_tag-obj    -m "tagging a tree" $HEAD_TREE &&
 377        git tag    tag-obj_tag     -m "tagging a tag" tree_tag-obj &&
 378        git tag -a tag-obj_tag-obj -m "tagging a tag" tree_tag-obj
 379'
 380
 381test_expect_success 'tree_tag'        '
 382        mkdir result &&
 383        (cd result && git init) &&
 384        git fast-export tree_tag > fe-stream &&
 385        (cd result && git fast-import < ../fe-stream)
 386'
 387
 388# NEEDSWORK: not just check return status, but validate the output
 389test_expect_success 'tree_tag-obj'    'git fast-export tree_tag-obj'
 390test_expect_success 'tag-obj_tag'     'git fast-export tag-obj_tag'
 391test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj'
 392
 393test_expect_success SYMLINKS 'directory becomes symlink'        '
 394        git init dirtosymlink &&
 395        git init result &&
 396        (
 397                cd dirtosymlink &&
 398                mkdir foo &&
 399                mkdir bar &&
 400                echo hello > foo/world &&
 401                echo hello > bar/world &&
 402                git add foo/world bar/world &&
 403                git commit -q -mone &&
 404                git rm -r foo &&
 405                ln -s bar foo &&
 406                git add foo &&
 407                git commit -q -mtwo
 408        ) &&
 409        (
 410                cd dirtosymlink &&
 411                git fast-export master -- foo |
 412                (cd ../result && git fast-import --quiet)
 413        ) &&
 414        (cd result && git show master:foo)
 415'
 416
 417test_expect_success 'fast-export quotes pathnames' '
 418        git init crazy-paths &&
 419        (cd crazy-paths &&
 420         blob=`echo foo | git hash-object -w --stdin` &&
 421         git update-index --add \
 422                --cacheinfo 100644 $blob "$(printf "path with\\nnewline")" \
 423                --cacheinfo 100644 $blob "path with \"quote\"" \
 424                --cacheinfo 100644 $blob "path with \\backslash" \
 425                --cacheinfo 100644 $blob "path with space" &&
 426         git commit -m addition &&
 427         git ls-files -z -s | "$PERL_PATH" -0pe "s{\\t}{$&subdir/}" >index &&
 428         git read-tree --empty &&
 429         git update-index -z --index-info <index &&
 430         git commit -m rename &&
 431         git read-tree --empty &&
 432         git commit -m deletion &&
 433         git fast-export -M HEAD >export.out &&
 434         git rev-list HEAD >expect &&
 435         git init result &&
 436         cd result &&
 437         git fast-import <../export.out &&
 438         git rev-list HEAD >actual &&
 439         test_cmp ../expect actual
 440        )
 441'
 442
 443test_expect_success 'test bidirectionality' '
 444        >marks-cur &&
 445        >marks-new &&
 446        git init marks-test &&
 447        git fast-export --export-marks=marks-cur --import-marks=marks-cur --branches | \
 448        git --git-dir=marks-test/.git fast-import --export-marks=marks-new --import-marks=marks-new &&
 449        (cd marks-test &&
 450        git reset --hard &&
 451        echo Wohlauf > file &&
 452        git commit -a -m "back in time") &&
 453        git --git-dir=marks-test/.git fast-export --export-marks=marks-new --import-marks=marks-new --branches | \
 454        git fast-import --export-marks=marks-cur --import-marks=marks-cur
 455'
 456
 457cat > expected << EOF
 458blob
 459mark :13
 460data 5
 461bump
 462
 463commit refs/heads/master
 464mark :14
 465author A U Thor <author@example.com> 1112912773 -0700
 466committer C O Mitter <committer@example.com> 1112912773 -0700
 467data 5
 468bump
 469from :12
 470M 100644 :13 file
 471
 472EOF
 473
 474test_expect_success 'avoid uninteresting refs' '
 475        > tmp-marks &&
 476        git fast-export --import-marks=tmp-marks \
 477                --export-marks=tmp-marks master > /dev/null &&
 478        git tag v1.0 &&
 479        git branch uninteresting &&
 480        echo bump > file &&
 481        git commit -a -m bump &&
 482        git fast-export --import-marks=tmp-marks \
 483                --export-marks=tmp-marks ^uninteresting ^v1.0 master > actual &&
 484        test_cmp expected actual
 485'
 486
 487cat > expected << EOF
 488reset refs/heads/master
 489from :14
 490
 491EOF
 492
 493test_expect_success 'refs are updated even if no commits need to be exported' '
 494        > tmp-marks &&
 495        git fast-export --import-marks=tmp-marks \
 496                --export-marks=tmp-marks master > /dev/null &&
 497        git fast-export --import-marks=tmp-marks \
 498                --export-marks=tmp-marks master > actual &&
 499        test_cmp expected actual
 500'
 501
 502test_done