t / t5550-http-fetch.shon commit Merge branch 'maint-1.8.2' into maint (a717d9e)
   1#!/bin/sh
   2
   3test_description='test dumb fetching over http via static file'
   4. ./test-lib.sh
   5
   6if test -n "$NO_CURL"; then
   7        skip_all='skipping test, git built without http support'
   8        test_done
   9fi
  10
  11LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'5550'}
  12. "$TEST_DIRECTORY"/lib-httpd.sh
  13start_httpd
  14
  15test_expect_success 'setup repository' '
  16        git config push.default matching &&
  17        echo content1 >file &&
  18        git add file &&
  19        git commit -m one
  20        echo content2 >file &&
  21        git add file &&
  22        git commit -m two
  23'
  24
  25test_expect_success 'create http-accessible bare repository with loose objects' '
  26        cp -R .git "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  27        (cd "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  28         git config core.bare true &&
  29         mkdir -p hooks &&
  30         echo "exec git update-server-info" >hooks/post-update &&
  31         chmod +x hooks/post-update &&
  32         hooks/post-update
  33        ) &&
  34        git remote add public "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
  35        git push public master:master
  36'
  37
  38test_expect_success 'clone http repository' '
  39        git clone $HTTPD_URL/dumb/repo.git clone-tmpl &&
  40        cp -R clone-tmpl clone &&
  41        test_cmp file clone/file
  42'
  43
  44test_expect_success 'create password-protected repository' '
  45        mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/" &&
  46        cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" \
  47               "$HTTPD_DOCUMENT_ROOT_PATH/auth/dumb/repo.git"
  48'
  49
  50setup_askpass_helper
  51
  52test_expect_success 'cloning password-protected repository can fail' '
  53        set_askpass wrong &&
  54        test_must_fail git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-fail &&
  55        expect_askpass both wrong
  56'
  57
  58test_expect_success 'http auth can use user/pass in URL' '
  59        set_askpass wrong &&
  60        git clone "$HTTPD_URL_USER_PASS/auth/dumb/repo.git" clone-auth-none &&
  61        expect_askpass none
  62'
  63
  64test_expect_success 'http auth can use just user in URL' '
  65        set_askpass user@host &&
  66        git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-pass &&
  67        expect_askpass pass user@host
  68'
  69
  70test_expect_success 'http auth can request both user and pass' '
  71        set_askpass user@host &&
  72        git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both &&
  73        expect_askpass both user@host
  74'
  75
  76test_expect_success 'http auth respects credential helper config' '
  77        test_config_global credential.helper "!f() {
  78                cat >/dev/null
  79                echo username=user@host
  80                echo password=user@host
  81        }; f" &&
  82        set_askpass wrong &&
  83        git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-helper &&
  84        expect_askpass none
  85'
  86
  87test_expect_success 'http auth can get username from config' '
  88        test_config_global "credential.$HTTPD_URL.username" user@host &&
  89        set_askpass user@host &&
  90        git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-user &&
  91        expect_askpass pass user@host
  92'
  93
  94test_expect_success 'configured username does not override URL' '
  95        test_config_global "credential.$HTTPD_URL.username" wrong &&
  96        set_askpass user@host &&
  97        git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-user2 &&
  98        expect_askpass pass user@host
  99'
 100
 101test_expect_success 'fetch changes via http' '
 102        echo content >>file &&
 103        git commit -a -m two &&
 104        git push public &&
 105        (cd clone && git pull) &&
 106        test_cmp file clone/file
 107'
 108
 109test_expect_success 'fetch changes via manual http-fetch' '
 110        cp -R clone-tmpl clone2 &&
 111
 112        HEAD=$(git rev-parse --verify HEAD) &&
 113        (cd clone2 &&
 114         git http-fetch -a -w heads/master-new $HEAD $(git config remote.origin.url) &&
 115         git checkout master-new &&
 116         test $HEAD = $(git rev-parse --verify HEAD)) &&
 117        test_cmp file clone2/file
 118'
 119
 120test_expect_success 'http remote detects correct HEAD' '
 121        git push public master:other &&
 122        (cd clone &&
 123         git remote set-head origin -d &&
 124         git remote set-head origin -a &&
 125         git symbolic-ref refs/remotes/origin/HEAD > output &&
 126         echo refs/remotes/origin/master > expect &&
 127         test_cmp expect output
 128        )
 129'
 130
 131test_expect_success 'fetch packed objects' '
 132        cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git &&
 133        (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git &&
 134         git --bare repack -a -d
 135        ) &&
 136        git clone $HTTPD_URL/dumb/repo_pack.git
 137'
 138
 139test_expect_success 'fetch notices corrupt pack' '
 140        cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git &&
 141        (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad1.git &&
 142         p=`ls objects/pack/pack-*.pack` &&
 143         chmod u+w $p &&
 144         printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc
 145        ) &&
 146        mkdir repo_bad1.git &&
 147        (cd repo_bad1.git &&
 148         git --bare init &&
 149         test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad1.git &&
 150         test 0 = `ls objects/pack/pack-*.pack | wc -l`
 151        )
 152'
 153
 154test_expect_success 'fetch notices corrupt idx' '
 155        cp -R "$HTTPD_DOCUMENT_ROOT_PATH"/repo_pack.git "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&
 156        (cd "$HTTPD_DOCUMENT_ROOT_PATH"/repo_bad2.git &&
 157         p=`ls objects/pack/pack-*.idx` &&
 158         chmod u+w $p &&
 159         printf %0256d 0 | dd of=$p bs=256 count=1 seek=1 conv=notrunc
 160        ) &&
 161        mkdir repo_bad2.git &&
 162        (cd repo_bad2.git &&
 163         git --bare init &&
 164         test_must_fail git --bare fetch $HTTPD_URL/dumb/repo_bad2.git &&
 165         test 0 = `ls objects/pack | wc -l`
 166        )
 167'
 168
 169test_expect_success 'did not use upload-pack service' '
 170        grep '/git-upload-pack' <"$HTTPD_ROOT_PATH"/access.log >act
 171        : >exp
 172        test_cmp exp act
 173'
 174
 175stop_httpd
 176test_done