t / t5510-fetch.shon commit ref_transaction_commit(): fix atomicity and avoid fd exhaustion (cf018ee)
   1#!/bin/sh
   2# Copyright (c) 2006, Junio C Hamano.
   3
   4test_description='Per branch config variables affects "git fetch".
   5
   6'
   7
   8. ./test-lib.sh
   9
  10D=`pwd`
  11
  12test_bundle_object_count () {
  13        git verify-pack -v "$1" >verify.out &&
  14        test "$2" = $(grep '^[0-9a-f]\{40\} ' verify.out | wc -l)
  15}
  16
  17convert_bundle_to_pack () {
  18        while read x && test -n "$x"
  19        do
  20                :;
  21        done
  22        cat
  23}
  24
  25test_expect_success setup '
  26        echo >file original &&
  27        git add file &&
  28        git commit -a -m original'
  29
  30test_expect_success "clone and setup child repos" '
  31        git clone . one &&
  32        (
  33                cd one &&
  34                echo >file updated by one &&
  35                git commit -a -m "updated by one"
  36        ) &&
  37        git clone . two &&
  38        (
  39                cd two &&
  40                git config branch.master.remote one &&
  41                git config remote.one.url ../one/.git/ &&
  42                git config remote.one.fetch refs/heads/master:refs/heads/one
  43        ) &&
  44        git clone . three &&
  45        (
  46                cd three &&
  47                git config branch.master.remote two &&
  48                git config branch.master.merge refs/heads/one &&
  49                mkdir -p .git/remotes &&
  50                {
  51                        echo "URL: ../two/.git/"
  52                        echo "Pull: refs/heads/master:refs/heads/two"
  53                        echo "Pull: refs/heads/one:refs/heads/one"
  54                } >.git/remotes/two
  55        ) &&
  56        git clone . bundle &&
  57        git clone . seven
  58'
  59
  60test_expect_success "fetch test" '
  61        cd "$D" &&
  62        echo >file updated by origin &&
  63        git commit -a -m "updated by origin" &&
  64        cd two &&
  65        git fetch &&
  66        test -f .git/refs/heads/one &&
  67        mine=`git rev-parse refs/heads/one` &&
  68        his=`cd ../one && git rev-parse refs/heads/master` &&
  69        test "z$mine" = "z$his"
  70'
  71
  72test_expect_success "fetch test for-merge" '
  73        cd "$D" &&
  74        cd three &&
  75        git fetch &&
  76        test -f .git/refs/heads/two &&
  77        test -f .git/refs/heads/one &&
  78        master_in_two=`cd ../two && git rev-parse master` &&
  79        one_in_two=`cd ../two && git rev-parse one` &&
  80        {
  81                echo "$one_in_two       "
  82                echo "$master_in_two    not-for-merge"
  83        } >expected &&
  84        cut -f -2 .git/FETCH_HEAD >actual &&
  85        test_cmp expected actual'
  86
  87test_expect_success 'fetch --prune on its own works as expected' '
  88        cd "$D" &&
  89        git clone . prune &&
  90        cd prune &&
  91        git update-ref refs/remotes/origin/extrabranch master &&
  92
  93        git fetch --prune origin &&
  94        test_must_fail git rev-parse origin/extrabranch
  95'
  96
  97test_expect_success 'fetch --prune with a branch name keeps branches' '
  98        cd "$D" &&
  99        git clone . prune-branch &&
 100        cd prune-branch &&
 101        git update-ref refs/remotes/origin/extrabranch master &&
 102
 103        git fetch --prune origin master &&
 104        git rev-parse origin/extrabranch
 105'
 106
 107test_expect_success 'fetch --prune with a namespace keeps other namespaces' '
 108        cd "$D" &&
 109        git clone . prune-namespace &&
 110        cd prune-namespace &&
 111
 112        git fetch --prune origin refs/heads/a/*:refs/remotes/origin/a/* &&
 113        git rev-parse origin/master
 114'
 115
 116test_expect_success 'fetch --prune handles overlapping refspecs' '
 117        cd "$D" &&
 118        git update-ref refs/pull/42/head master &&
 119        git clone . prune-overlapping &&
 120        cd prune-overlapping &&
 121        git config --add remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* &&
 122
 123        git fetch --prune origin &&
 124        git rev-parse origin/master &&
 125        git rev-parse origin/pr/42 &&
 126
 127        git config --unset-all remote.origin.fetch &&
 128        git config remote.origin.fetch refs/pull/*/head:refs/remotes/origin/pr/* &&
 129        git config --add remote.origin.fetch refs/heads/*:refs/remotes/origin/* &&
 130
 131        git fetch --prune origin &&
 132        git rev-parse origin/master &&
 133        git rev-parse origin/pr/42
 134'
 135
 136test_expect_success 'fetch --prune --tags prunes branches but not tags' '
 137        cd "$D" &&
 138        git clone . prune-tags &&
 139        cd prune-tags &&
 140        git tag sometag master &&
 141        # Create what looks like a remote-tracking branch from an earlier
 142        # fetch that has since been deleted from the remote:
 143        git update-ref refs/remotes/origin/fake-remote master &&
 144
 145        git fetch --prune --tags origin &&
 146        git rev-parse origin/master &&
 147        test_must_fail git rev-parse origin/fake-remote &&
 148        git rev-parse sometag
 149'
 150
 151test_expect_success 'fetch --prune --tags with branch does not prune other things' '
 152        cd "$D" &&
 153        git clone . prune-tags-branch &&
 154        cd prune-tags-branch &&
 155        git tag sometag master &&
 156        git update-ref refs/remotes/origin/extrabranch master &&
 157
 158        git fetch --prune --tags origin master &&
 159        git rev-parse origin/extrabranch &&
 160        git rev-parse sometag
 161'
 162
 163test_expect_success 'fetch --prune --tags with refspec prunes based on refspec' '
 164        cd "$D" &&
 165        git clone . prune-tags-refspec &&
 166        cd prune-tags-refspec &&
 167        git tag sometag master &&
 168        git update-ref refs/remotes/origin/foo/otherbranch master &&
 169        git update-ref refs/remotes/origin/extrabranch master &&
 170
 171        git fetch --prune --tags origin refs/heads/foo/*:refs/remotes/origin/foo/* &&
 172        test_must_fail git rev-parse refs/remotes/origin/foo/otherbranch &&
 173        git rev-parse origin/extrabranch &&
 174        git rev-parse sometag
 175'
 176
 177test_expect_success 'fetch tags when there is no tags' '
 178
 179    cd "$D" &&
 180
 181    mkdir notags &&
 182    cd notags &&
 183    git init &&
 184
 185    git fetch -t ..
 186
 187'
 188
 189test_expect_success 'fetch following tags' '
 190
 191        cd "$D" &&
 192        git tag -a -m 'annotated' anno HEAD &&
 193        git tag light HEAD &&
 194
 195        mkdir four &&
 196        cd four &&
 197        git init &&
 198
 199        git fetch .. :track &&
 200        git show-ref --verify refs/tags/anno &&
 201        git show-ref --verify refs/tags/light
 202
 203'
 204
 205test_expect_success 'fetch uses remote ref names to describe new refs' '
 206        cd "$D" &&
 207        git init descriptive &&
 208        (
 209                cd descriptive &&
 210                git config remote.o.url .. &&
 211                git config remote.o.fetch "refs/heads/*:refs/crazyheads/*" &&
 212                git config --add remote.o.fetch "refs/others/*:refs/heads/*" &&
 213                git fetch o
 214        ) &&
 215        git tag -a -m "Descriptive tag" descriptive-tag &&
 216        git branch descriptive-branch &&
 217        git checkout descriptive-branch &&
 218        echo "Nuts" >crazy &&
 219        git add crazy &&
 220        git commit -a -m "descriptive commit" &&
 221        git update-ref refs/others/crazy HEAD &&
 222        (
 223                cd descriptive &&
 224                git fetch o 2>actual &&
 225                grep " -> refs/crazyheads/descriptive-branch$" actual |
 226                test_i18ngrep "new branch" &&
 227                grep " -> descriptive-tag$" actual |
 228                test_i18ngrep "new tag" &&
 229                grep " -> crazy$" actual |
 230                test_i18ngrep "new ref"
 231        ) &&
 232        git checkout master
 233'
 234
 235test_expect_success 'fetch must not resolve short tag name' '
 236
 237        cd "$D" &&
 238
 239        mkdir five &&
 240        cd five &&
 241        git init &&
 242
 243        test_must_fail git fetch .. anno:five
 244
 245'
 246
 247test_expect_success 'fetch can now resolve short remote name' '
 248
 249        cd "$D" &&
 250        git update-ref refs/remotes/six/HEAD HEAD &&
 251
 252        mkdir six &&
 253        cd six &&
 254        git init &&
 255
 256        git fetch .. six:six
 257'
 258
 259test_expect_success 'create bundle 1' '
 260        cd "$D" &&
 261        echo >file updated again by origin &&
 262        git commit -a -m "tip" &&
 263        git bundle create bundle1 master^..master
 264'
 265
 266test_expect_success 'header of bundle looks right' '
 267        head -n 1 "$D"/bundle1 | grep "^#" &&
 268        head -n 2 "$D"/bundle1 | grep "^-[0-9a-f]\{40\} " &&
 269        head -n 3 "$D"/bundle1 | grep "^[0-9a-f]\{40\} " &&
 270        head -n 4 "$D"/bundle1 | grep "^$"
 271'
 272
 273test_expect_success 'create bundle 2' '
 274        cd "$D" &&
 275        git bundle create bundle2 master~2..master
 276'
 277
 278test_expect_success 'unbundle 1' '
 279        cd "$D/bundle" &&
 280        git checkout -b some-branch &&
 281        test_must_fail git fetch "$D/bundle1" master:master
 282'
 283
 284
 285test_expect_success 'bundle 1 has only 3 files ' '
 286        cd "$D" &&
 287        convert_bundle_to_pack <bundle1 >bundle.pack &&
 288        git index-pack bundle.pack &&
 289        test_bundle_object_count bundle.pack 3
 290'
 291
 292test_expect_success 'unbundle 2' '
 293        cd "$D/bundle" &&
 294        git fetch ../bundle2 master:master &&
 295        test "tip" = "$(git log -1 --pretty=oneline master | cut -b42-)"
 296'
 297
 298test_expect_success 'bundle does not prerequisite objects' '
 299        cd "$D" &&
 300        touch file2 &&
 301        git add file2 &&
 302        git commit -m add.file2 file2 &&
 303        git bundle create bundle3 -1 HEAD &&
 304        convert_bundle_to_pack <bundle3 >bundle.pack &&
 305        git index-pack bundle.pack &&
 306        test_bundle_object_count bundle.pack 3
 307'
 308
 309test_expect_success 'bundle should be able to create a full history' '
 310
 311        cd "$D" &&
 312        git tag -a -m '1.0' v1.0 master &&
 313        git bundle create bundle4 v1.0
 314
 315'
 316
 317! rsync --help > /dev/null 2> /dev/null &&
 318say 'Skipping rsync tests because rsync was not found' || {
 319test_expect_success 'fetch via rsync' '
 320        git pack-refs &&
 321        mkdir rsynced &&
 322        (cd rsynced &&
 323         git init --bare &&
 324         git fetch "rsync:../.git" master:refs/heads/master &&
 325         git gc --prune &&
 326         test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
 327         git fsck --full)
 328'
 329
 330test_expect_success 'push via rsync' '
 331        mkdir rsynced2 &&
 332        (cd rsynced2 &&
 333         git init) &&
 334        (cd rsynced &&
 335         git push "rsync:../rsynced2/.git" master) &&
 336        (cd rsynced2 &&
 337         git gc --prune &&
 338         test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
 339         git fsck --full)
 340'
 341
 342test_expect_success 'push via rsync' '
 343        mkdir rsynced3 &&
 344        (cd rsynced3 &&
 345         git init) &&
 346        git push --all "rsync:rsynced3/.git" &&
 347        (cd rsynced3 &&
 348         test $(git rev-parse master) = $(cd .. && git rev-parse master) &&
 349         git fsck --full)
 350'
 351}
 352
 353test_expect_success 'fetch with a non-applying branch.<name>.merge' '
 354        git config branch.master.remote yeti &&
 355        git config branch.master.merge refs/heads/bigfoot &&
 356        git config remote.blub.url one &&
 357        git config remote.blub.fetch "refs/heads/*:refs/remotes/one/*" &&
 358        git fetch blub
 359'
 360
 361# URL supplied to fetch does not match the url of the configured branch's remote
 362test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [1]' '
 363        one_head=$(cd one && git rev-parse HEAD) &&
 364        this_head=$(git rev-parse HEAD) &&
 365        git update-ref -d FETCH_HEAD &&
 366        git fetch one &&
 367        test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
 368        test $this_head = "$(git rev-parse --verify HEAD)"
 369'
 370
 371# URL supplied to fetch matches the url of the configured branch's remote and
 372# the merge spec matches the branch the remote HEAD points to
 373test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [2]' '
 374        one_ref=$(cd one && git symbolic-ref HEAD) &&
 375        git config branch.master.remote blub &&
 376        git config branch.master.merge "$one_ref" &&
 377        git update-ref -d FETCH_HEAD &&
 378        git fetch one &&
 379        test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
 380        test $this_head = "$(git rev-parse --verify HEAD)"
 381'
 382
 383# URL supplied to fetch matches the url of the configured branch's remote, but
 384# the merge spec does not match the branch the remote HEAD points to
 385test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [3]' '
 386        git config branch.master.merge "${one_ref}_not" &&
 387        git update-ref -d FETCH_HEAD &&
 388        git fetch one &&
 389        test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
 390        test $this_head = "$(git rev-parse --verify HEAD)"
 391'
 392
 393# the strange name is: a\!'b
 394test_expect_success 'quoting of a strangely named repo' '
 395        test_must_fail git fetch "a\\!'\''b" > result 2>&1 &&
 396        cat result &&
 397        grep "fatal: '\''a\\\\!'\''b'\''" result
 398'
 399
 400test_expect_success 'bundle should record HEAD correctly' '
 401
 402        cd "$D" &&
 403        git bundle create bundle5 HEAD master &&
 404        git bundle list-heads bundle5 >actual &&
 405        for h in HEAD refs/heads/master
 406        do
 407                echo "$(git rev-parse --verify $h) $h"
 408        done >expect &&
 409        test_cmp expect actual
 410
 411'
 412
 413test_expect_success 'mark initial state of origin/master' '
 414        (
 415                cd three &&
 416                git tag base-origin-master refs/remotes/origin/master
 417        )
 418'
 419
 420test_expect_success 'explicit fetch should update tracking' '
 421
 422        cd "$D" &&
 423        git branch -f side &&
 424        (
 425                cd three &&
 426                git update-ref refs/remotes/origin/master base-origin-master &&
 427                o=$(git rev-parse --verify refs/remotes/origin/master) &&
 428                git fetch origin master &&
 429                n=$(git rev-parse --verify refs/remotes/origin/master) &&
 430                test "$o" != "$n" &&
 431                test_must_fail git rev-parse --verify refs/remotes/origin/side
 432        )
 433'
 434
 435test_expect_success 'explicit pull should update tracking' '
 436
 437        cd "$D" &&
 438        git branch -f side &&
 439        (
 440                cd three &&
 441                git update-ref refs/remotes/origin/master base-origin-master &&
 442                o=$(git rev-parse --verify refs/remotes/origin/master) &&
 443                git pull origin master &&
 444                n=$(git rev-parse --verify refs/remotes/origin/master) &&
 445                test "$o" != "$n" &&
 446                test_must_fail git rev-parse --verify refs/remotes/origin/side
 447        )
 448'
 449
 450test_expect_success 'explicit --refmap is allowed only with command-line refspec' '
 451        cd "$D" &&
 452        (
 453                cd three &&
 454                test_must_fail git fetch --refmap="*:refs/remotes/none/*"
 455        )
 456'
 457
 458test_expect_success 'explicit --refmap option overrides remote.*.fetch' '
 459        cd "$D" &&
 460        git branch -f side &&
 461        (
 462                cd three &&
 463                git update-ref refs/remotes/origin/master base-origin-master &&
 464                o=$(git rev-parse --verify refs/remotes/origin/master) &&
 465                git fetch --refmap="refs/heads/*:refs/remotes/other/*" origin master &&
 466                n=$(git rev-parse --verify refs/remotes/origin/master) &&
 467                test "$o" = "$n" &&
 468                test_must_fail git rev-parse --verify refs/remotes/origin/side &&
 469                git rev-parse --verify refs/remotes/other/master
 470        )
 471'
 472
 473test_expect_success 'explicitly empty --refmap option disables remote.*.fetch' '
 474        cd "$D" &&
 475        git branch -f side &&
 476        (
 477                cd three &&
 478                git update-ref refs/remotes/origin/master base-origin-master &&
 479                o=$(git rev-parse --verify refs/remotes/origin/master) &&
 480                git fetch --refmap="" origin master &&
 481                n=$(git rev-parse --verify refs/remotes/origin/master) &&
 482                test "$o" = "$n" &&
 483                test_must_fail git rev-parse --verify refs/remotes/origin/side
 484        )
 485'
 486
 487test_expect_success 'configured fetch updates tracking' '
 488
 489        cd "$D" &&
 490        git branch -f side &&
 491        (
 492                cd three &&
 493                git update-ref refs/remotes/origin/master base-origin-master &&
 494                o=$(git rev-parse --verify refs/remotes/origin/master) &&
 495                git fetch origin &&
 496                n=$(git rev-parse --verify refs/remotes/origin/master) &&
 497                test "$o" != "$n" &&
 498                git rev-parse --verify refs/remotes/origin/side
 499        )
 500'
 501
 502test_expect_success 'non-matching refspecs do not confuse tracking update' '
 503        cd "$D" &&
 504        git update-ref refs/odd/location HEAD &&
 505        (
 506                cd three &&
 507                git update-ref refs/remotes/origin/master base-origin-master &&
 508                git config --add remote.origin.fetch \
 509                        refs/odd/location:refs/remotes/origin/odd &&
 510                o=$(git rev-parse --verify refs/remotes/origin/master) &&
 511                git fetch origin master &&
 512                n=$(git rev-parse --verify refs/remotes/origin/master) &&
 513                test "$o" != "$n" &&
 514                test_must_fail git rev-parse --verify refs/remotes/origin/odd
 515        )
 516'
 517
 518test_expect_success 'pushing nonexistent branch by mistake should not segv' '
 519
 520        cd "$D" &&
 521        test_must_fail git push seven no:no
 522
 523'
 524
 525test_expect_success 'auto tag following fetches minimum' '
 526
 527        cd "$D" &&
 528        git clone .git follow &&
 529        git checkout HEAD^0 &&
 530        (
 531                for i in 1 2 3 4 5 6 7
 532                do
 533                        echo $i >>file &&
 534                        git commit -m $i -a &&
 535                        git tag -a -m $i excess-$i || exit 1
 536                done
 537        ) &&
 538        git checkout master &&
 539        (
 540                cd follow &&
 541                git fetch
 542        )
 543'
 544
 545test_expect_success 'refuse to fetch into the current branch' '
 546
 547        test_must_fail git fetch . side:master
 548
 549'
 550
 551test_expect_success 'fetch into the current branch with --update-head-ok' '
 552
 553        git fetch --update-head-ok . side:master
 554
 555'
 556
 557test_expect_success 'fetch --dry-run' '
 558
 559        rm -f .git/FETCH_HEAD &&
 560        git fetch --dry-run . &&
 561        ! test -f .git/FETCH_HEAD
 562'
 563
 564test_expect_success "should be able to fetch with duplicate refspecs" '
 565        mkdir dups &&
 566        (
 567                cd dups &&
 568                git init &&
 569                git config branch.master.remote three &&
 570                git config remote.three.url ../three/.git &&
 571                git config remote.three.fetch +refs/heads/*:refs/remotes/origin/* &&
 572                git config --add remote.three.fetch +refs/heads/*:refs/remotes/origin/* &&
 573                git fetch three
 574        )
 575'
 576
 577# configured prune tests
 578
 579set_config_tristate () {
 580        # var=$1 val=$2
 581        case "$2" in
 582        unset)  test_unconfig "$1" ;;
 583        *)      git config "$1" "$2" ;;
 584        esac
 585}
 586
 587test_configured_prune () {
 588        fetch_prune=$1 remote_origin_prune=$2 cmdline=$3 expected=$4
 589
 590        test_expect_success "prune fetch.prune=$1 remote.origin.prune=$2${3:+ $3}; $4" '
 591                # make sure a newbranch is there in . and also in one
 592                git branch -f newbranch &&
 593                (
 594                        cd one &&
 595                        test_unconfig fetch.prune &&
 596                        test_unconfig remote.origin.prune &&
 597                        git fetch &&
 598                        git rev-parse --verify refs/remotes/origin/newbranch
 599                ) &&
 600
 601                # now remove it
 602                git branch -d newbranch &&
 603
 604                # then test
 605                (
 606                        cd one &&
 607                        set_config_tristate fetch.prune $fetch_prune &&
 608                        set_config_tristate remote.origin.prune $remote_origin_prune &&
 609
 610                        git fetch $cmdline &&
 611                        case "$expected" in
 612                        pruned)
 613                                test_must_fail git rev-parse --verify refs/remotes/origin/newbranch
 614                                ;;
 615                        kept)
 616                                git rev-parse --verify refs/remotes/origin/newbranch
 617                                ;;
 618                        esac
 619                )
 620        '
 621}
 622
 623test_configured_prune unset unset ""            kept
 624test_configured_prune unset unset "--no-prune"  kept
 625test_configured_prune unset unset "--prune"     pruned
 626
 627test_configured_prune false unset ""            kept
 628test_configured_prune false unset "--no-prune"  kept
 629test_configured_prune false unset "--prune"     pruned
 630
 631test_configured_prune true  unset ""            pruned
 632test_configured_prune true  unset "--prune"     pruned
 633test_configured_prune true  unset "--no-prune"  kept
 634
 635test_configured_prune unset false ""            kept
 636test_configured_prune unset false "--no-prune"  kept
 637test_configured_prune unset false "--prune"     pruned
 638
 639test_configured_prune false false ""            kept
 640test_configured_prune false false "--no-prune"  kept
 641test_configured_prune false false "--prune"     pruned
 642
 643test_configured_prune true  false ""            kept
 644test_configured_prune true  false "--prune"     pruned
 645test_configured_prune true  false "--no-prune"  kept
 646
 647test_configured_prune unset true  ""            pruned
 648test_configured_prune unset true  "--no-prune"  kept
 649test_configured_prune unset true  "--prune"     pruned
 650
 651test_configured_prune false true  ""            pruned
 652test_configured_prune false true  "--no-prune"  kept
 653test_configured_prune false true  "--prune"     pruned
 654
 655test_configured_prune true  true  ""            pruned
 656test_configured_prune true  true  "--prune"     pruned
 657test_configured_prune true  true  "--no-prune"  kept
 658
 659test_expect_success 'all boundary commits are excluded' '
 660        test_commit base &&
 661        test_commit oneside &&
 662        git checkout HEAD^ &&
 663        test_commit otherside &&
 664        git checkout master &&
 665        test_tick &&
 666        git merge otherside &&
 667        ad=$(git log --no-walk --format=%ad HEAD) &&
 668        git bundle create twoside-boundary.bdl master --since="$ad" &&
 669        convert_bundle_to_pack <twoside-boundary.bdl >twoside-boundary.pack &&
 670        pack=$(git index-pack --fix-thin --stdin <twoside-boundary.pack) &&
 671        test_bundle_object_count .git/objects/pack/pack-${pack##pack    }.pack 3
 672'
 673
 674test_expect_success 'fetch --prune prints the remotes url' '
 675        git branch goodbye &&
 676        git clone . only-prunes &&
 677        git branch -D goodbye &&
 678        (
 679                cd only-prunes &&
 680                git fetch --prune origin 2>&1 | head -n1 >../actual
 681        ) &&
 682        echo "From ${D}/." >expect &&
 683        test_cmp expect actual
 684'
 685
 686test_expect_success 'branchname D/F conflict resolved by --prune' '
 687        git branch dir/file &&
 688        git clone . prune-df-conflict &&
 689        git branch -D dir/file &&
 690        git branch dir &&
 691        (
 692                cd prune-df-conflict &&
 693                git fetch --prune &&
 694                git rev-parse origin/dir >../actual
 695        ) &&
 696        git rev-parse dir >expect &&
 697        test_cmp expect actual
 698'
 699
 700test_expect_success 'fetching a one-level ref works' '
 701        test_commit extra &&
 702        git reset --hard HEAD^ &&
 703        git update-ref refs/foo extra &&
 704        git init one-level &&
 705        (
 706                cd one-level &&
 707                git fetch .. HEAD refs/foo
 708        )
 709'
 710
 711test_done