t / t5500-fetch-pack.shon commit git-send-email: skip RFC2047 quoting for ASCII subjects (5637d85)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Johannes Schindelin
   4#
   5
   6test_description='Testing multi_ack pack fetching'
   7
   8. ./test-lib.sh
   9
  10# Test fetch-pack/upload-pack pair.
  11
  12# Some convenience functions
  13
  14add () {
  15        name=$1 &&
  16        text="$@" &&
  17        branch=`echo $name | sed -e 's/^\(.\).*$/\1/'` &&
  18        parents="" &&
  19
  20        shift &&
  21        while test $1; do
  22                parents="$parents -p $1" &&
  23                shift
  24        done &&
  25
  26        echo "$text" > test.txt &&
  27        git update-index --add test.txt &&
  28        tree=$(git write-tree) &&
  29        # make sure timestamps are in correct order
  30        test_tick &&
  31        commit=$(echo "$text" | git commit-tree $tree $parents) &&
  32        eval "$name=$commit; export $name" &&
  33        echo $commit > .git/refs/heads/$branch &&
  34        eval ${branch}TIP=$commit
  35}
  36
  37pull_to_client () {
  38        number=$1 &&
  39        heads=$2 &&
  40        count=$3 &&
  41        test_expect_success "$number pull" '
  42                (
  43                        cd client &&
  44                        git fetch-pack -k -v .. $heads &&
  45
  46                        case "$heads" in
  47                            *A*)
  48                                    echo $ATIP > .git/refs/heads/A;;
  49                        esac &&
  50                        case "$heads" in *B*)
  51                            echo $BTIP > .git/refs/heads/B;;
  52                        esac &&
  53                        git symbolic-ref HEAD refs/heads/`echo $heads \
  54                                | sed -e "s/^\(.\).*$/\1/"` &&
  55
  56                        git fsck --full &&
  57
  58                        mv .git/objects/pack/pack-* . &&
  59                        p=`ls -1 pack-*.pack` &&
  60                        git unpack-objects <$p &&
  61                        git fsck --full &&
  62
  63                        idx=`echo pack-*.idx` &&
  64                        pack_count=`git show-index <$idx | wc -l` &&
  65                        test $pack_count = $count &&
  66                        rm -f pack-*
  67                )
  68        '
  69}
  70
  71# Here begins the actual testing
  72
  73# A1 - ... - A20 - A21
  74#    \
  75#      B1  -   B2 - .. - B70
  76
  77# client pulls A20, B1. Then tracks only B. Then pulls A.
  78
  79test_expect_success 'setup' '
  80        mkdir client &&
  81        (
  82                cd client &&
  83                git init &&
  84                git config transfer.unpacklimit 0
  85        ) &&
  86        add A1 &&
  87        prev=1 &&
  88        cur=2 &&
  89        while [ $cur -le 10 ]; do
  90                add A$cur $(eval echo \$A$prev) &&
  91                prev=$cur &&
  92                cur=$(($cur+1))
  93        done &&
  94        add B1 $A1 &&
  95        echo $ATIP > .git/refs/heads/A &&
  96        echo $BTIP > .git/refs/heads/B &&
  97        git symbolic-ref HEAD refs/heads/B
  98'
  99
 100pull_to_client 1st "refs/heads/B refs/heads/A" $((11*3))
 101
 102test_expect_success 'post 1st pull setup' '
 103        add A11 $A10 &&
 104        prev=1 &&
 105        cur=2 &&
 106        while [ $cur -le 65 ]; do
 107                add B$cur $(eval echo \$B$prev) &&
 108                prev=$cur &&
 109                cur=$(($cur+1))
 110        done
 111'
 112
 113pull_to_client 2nd "refs/heads/B" $((64*3))
 114
 115pull_to_client 3rd "refs/heads/A" $((1*3))
 116
 117test_expect_success 'single branch clone' '
 118        git clone --single-branch "file://$(pwd)/." singlebranch
 119'
 120
 121test_expect_success 'single branch object count' '
 122        GIT_DIR=singlebranch/.git git count-objects -v |
 123                grep "^in-pack:" > count.singlebranch &&
 124        echo "in-pack: 198" >expected &&
 125        test_cmp expected count.singlebranch
 126'
 127
 128test_expect_success 'single given branch clone' '
 129        git clone --single-branch --branch A "file://$(pwd)/." branch-a &&
 130        test_must_fail git --git-dir=branch-a/.git rev-parse origin/B
 131'
 132
 133test_expect_success 'clone shallow' '
 134        git clone --no-single-branch --depth 2 "file://$(pwd)/." shallow
 135'
 136
 137test_expect_success 'clone shallow object count' '
 138        (
 139                cd shallow &&
 140                git count-objects -v
 141        ) > count.shallow &&
 142        grep "^in-pack: 18" count.shallow
 143'
 144
 145test_expect_success 'clone shallow object count (part 2)' '
 146        sed -e "/^in-pack:/d" -e "/^packs:/d" -e "/^size-pack:/d" \
 147            -e "/: 0$/d" count.shallow > count_output &&
 148        ! test -s count_output
 149'
 150
 151test_expect_success 'fsck in shallow repo' '
 152        (
 153                cd shallow &&
 154                git fsck --full
 155        )
 156'
 157
 158test_expect_success 'simple fetch in shallow repo' '
 159        (
 160                cd shallow &&
 161                git fetch
 162        )
 163'
 164
 165test_expect_success 'no changes expected' '
 166        (
 167                cd shallow &&
 168                git count-objects -v
 169        ) > count.shallow.2 &&
 170        cmp count.shallow count.shallow.2
 171'
 172
 173test_expect_success 'fetch same depth in shallow repo' '
 174        (
 175                cd shallow &&
 176                git fetch --depth=2
 177        )
 178'
 179
 180test_expect_success 'no changes expected' '
 181        (
 182                cd shallow &&
 183                git count-objects -v
 184        ) > count.shallow.3 &&
 185        cmp count.shallow count.shallow.3
 186'
 187
 188test_expect_success 'add two more' '
 189        add B66 $B65 &&
 190        add B67 $B66
 191'
 192
 193test_expect_success 'pull in shallow repo' '
 194        (
 195                cd shallow &&
 196                git pull .. B
 197        )
 198'
 199
 200test_expect_success 'clone shallow object count' '
 201        (
 202                cd shallow &&
 203                git count-objects -v
 204        ) > count.shallow &&
 205        grep "^count: 6" count.shallow
 206'
 207
 208test_expect_success 'add two more (part 2)' '
 209        add B68 $B67 &&
 210        add B69 $B68
 211'
 212
 213test_expect_success 'deepening pull in shallow repo' '
 214        (
 215                cd shallow &&
 216                git pull --depth 4 .. B
 217        )
 218'
 219
 220test_expect_success 'clone shallow object count' '
 221        (
 222                cd shallow &&
 223                git count-objects -v
 224        ) > count.shallow &&
 225        grep "^count: 12" count.shallow
 226'
 227
 228test_expect_success 'deepening fetch in shallow repo' '
 229        (
 230                cd shallow &&
 231                git fetch --depth 4 .. A:A
 232        )
 233'
 234
 235test_expect_success 'clone shallow object count' '
 236        (
 237                cd shallow &&
 238                git count-objects -v
 239        ) > count.shallow &&
 240        grep "^count: 18" count.shallow
 241'
 242
 243test_expect_success 'pull in shallow repo with missing merge base' '
 244        (
 245                cd shallow &&
 246                test_must_fail git pull --depth 4 .. A
 247        )
 248'
 249
 250test_expect_success 'additional simple shallow deepenings' '
 251        (
 252                cd shallow &&
 253                git fetch --depth=8 &&
 254                git fetch --depth=10 &&
 255                git fetch --depth=11
 256        )
 257'
 258
 259test_expect_success 'clone shallow object count' '
 260        (
 261                cd shallow &&
 262                git count-objects -v
 263        ) > count.shallow &&
 264        grep "^count: 52" count.shallow
 265'
 266
 267test_expect_success 'clone shallow without --no-single-branch' '
 268        git clone --depth 1 "file://$(pwd)/." shallow2
 269'
 270
 271test_expect_success 'clone shallow object count' '
 272        (
 273                cd shallow2 &&
 274                git count-objects -v
 275        ) > count.shallow2 &&
 276        grep "^in-pack: 6" count.shallow2
 277'
 278
 279test_expect_success 'clone shallow with --branch' '
 280        git clone --depth 1 --branch A "file://$(pwd)/." shallow3
 281'
 282
 283test_expect_success 'clone shallow object count' '
 284        echo "in-pack: 6" > count3.expected &&
 285        GIT_DIR=shallow3/.git git count-objects -v |
 286                grep "^in-pack" > count3.actual &&
 287        test_cmp count3.expected count3.actual
 288'
 289
 290test_expect_success 'clone shallow with detached HEAD' '
 291        git checkout HEAD^ &&
 292        git clone --depth 1 "file://$(pwd)/." shallow5 &&
 293        git checkout - &&
 294        GIT_DIR=shallow5/.git git rev-parse HEAD >actual &&
 295        git rev-parse HEAD^ >expected &&
 296        test_cmp expected actual
 297'
 298
 299test_expect_success 'shallow clone pulling tags' '
 300        git tag -a -m A TAGA1 A &&
 301        git tag -a -m B TAGB1 B &&
 302        git tag TAGA2 A &&
 303        git tag TAGB2 B &&
 304        git clone --depth 1 "file://$(pwd)/." shallow6 &&
 305
 306        cat >taglist.expected <<\EOF &&
 307TAGB1
 308TAGB2
 309EOF
 310        GIT_DIR=shallow6/.git git tag -l >taglist.actual &&
 311        test_cmp taglist.expected taglist.actual &&
 312
 313        echo "in-pack: 7" > count6.expected &&
 314        GIT_DIR=shallow6/.git git count-objects -v |
 315                grep "^in-pack" > count6.actual &&
 316        test_cmp count6.expected count6.actual
 317'
 318
 319test_expect_success 'shallow cloning single tag' '
 320        git clone --depth 1 --branch=TAGB1 "file://$(pwd)/." shallow7 &&
 321        cat >taglist.expected <<\EOF &&
 322TAGB1
 323TAGB2
 324EOF
 325        GIT_DIR=shallow7/.git git tag -l >taglist.actual &&
 326        test_cmp taglist.expected taglist.actual &&
 327
 328        echo "in-pack: 7" > count7.expected &&
 329        GIT_DIR=shallow7/.git git count-objects -v |
 330                grep "^in-pack" > count7.actual &&
 331        test_cmp count7.expected count7.actual
 332'
 333
 334test_expect_success 'setup tests for the --stdin parameter' '
 335        for head in C D E F
 336        do
 337                add $head
 338        done &&
 339        for head in A B C D E F
 340        do
 341                git tag $head $head
 342        done &&
 343        cat >input <<-\EOF
 344        refs/heads/C
 345        refs/heads/A
 346        refs/heads/D
 347        refs/tags/C
 348        refs/heads/B
 349        refs/tags/A
 350        refs/heads/E
 351        refs/tags/B
 352        refs/tags/E
 353        refs/tags/D
 354        EOF
 355        sort <input >expect &&
 356        (
 357                echo refs/heads/E &&
 358                echo refs/tags/E &&
 359                cat input
 360        ) >input.dup
 361'
 362
 363test_expect_success 'fetch refs from cmdline' '
 364        (
 365                cd client &&
 366                git fetch-pack --no-progress .. $(cat ../input)
 367        ) >output &&
 368        cut -d " " -f 2 <output | sort >actual &&
 369        test_cmp expect actual
 370'
 371
 372test_expect_success 'fetch refs from stdin' '
 373        (
 374                cd client &&
 375                git fetch-pack --stdin --no-progress .. <../input
 376        ) >output &&
 377        cut -d " " -f 2 <output | sort >actual &&
 378        test_cmp expect actual
 379'
 380
 381test_expect_success 'fetch mixed refs from cmdline and stdin' '
 382        (
 383                cd client &&
 384                tail -n +5 ../input |
 385                git fetch-pack --stdin --no-progress .. $(head -n 4 ../input)
 386        ) >output &&
 387        cut -d " " -f 2 <output | sort >actual &&
 388        test_cmp expect actual
 389'
 390
 391test_expect_success 'test duplicate refs from stdin' '
 392        (
 393        cd client &&
 394        git fetch-pack --stdin --no-progress .. <../input.dup
 395        ) >output &&
 396        cut -d " " -f 2 <output | sort >actual &&
 397        test_cmp expect actual
 398'
 399
 400test_expect_success 'set up tests of missing reference' '
 401        cat >expect-error <<-\EOF
 402        error: no such remote ref refs/heads/xyzzy
 403        EOF
 404'
 405
 406test_expect_success 'test lonely missing ref' '
 407        (
 408                cd client &&
 409                test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy
 410        ) >/dev/null 2>error-m &&
 411        test_cmp expect-error error-m
 412'
 413
 414test_expect_success 'test missing ref after existing' '
 415        (
 416                cd client &&
 417                test_must_fail git fetch-pack --no-progress .. refs/heads/A refs/heads/xyzzy
 418        ) >/dev/null 2>error-em &&
 419        test_cmp expect-error error-em
 420'
 421
 422test_expect_success 'test missing ref before existing' '
 423        (
 424                cd client &&
 425                test_must_fail git fetch-pack --no-progress .. refs/heads/xyzzy refs/heads/A
 426        ) >/dev/null 2>error-me &&
 427        test_cmp expect-error error-me
 428'
 429
 430test_expect_success 'test --all, --depth, and explicit head' '
 431        (
 432                cd client &&
 433                git fetch-pack --no-progress --all --depth=1 .. refs/heads/A
 434        ) >out-adh 2>error-adh
 435'
 436
 437test_expect_success 'test --all, --depth, and explicit tag' '
 438        git tag OLDTAG refs/heads/B~5 &&
 439        (
 440                cd client &&
 441                git fetch-pack --no-progress --all --depth=1 .. refs/tags/OLDTAG
 442        ) >out-adt 2>error-adt
 443'
 444
 445test_done