t / t5801-remote-helpers.shon commit commit_tree: take a pointer/len pair rather than a const strbuf (3ffefb5)
   1#!/bin/sh
   2#
   3# Copyright (c) 2010 Sverre Rabbelier
   4#
   5
   6test_description='Test remote-helper import and export commands'
   7
   8. ./test-lib.sh
   9. "$TEST_DIRECTORY"/lib-gpg.sh
  10
  11compare_refs() {
  12        git --git-dir="$1/.git" rev-parse --verify $2 >expect &&
  13        git --git-dir="$3/.git" rev-parse --verify $4 >actual &&
  14        test_cmp expect actual
  15}
  16
  17test_expect_success 'setup repository' '
  18        git init server &&
  19        (cd server &&
  20         echo content >file &&
  21         git add file &&
  22         git commit -m one)
  23'
  24
  25test_expect_success 'cloning from local repo' '
  26        git clone "testgit::${PWD}/server" local &&
  27        test_cmp server/file local/file
  28'
  29
  30test_expect_success 'create new commit on remote' '
  31        (cd server &&
  32         echo content >>file &&
  33         git commit -a -m two)
  34'
  35
  36test_expect_success 'pulling from local repo' '
  37        (cd local && git pull) &&
  38        test_cmp server/file local/file
  39'
  40
  41test_expect_success 'pushing to local repo' '
  42        (cd local &&
  43        echo content >>file &&
  44        git commit -a -m three &&
  45        git push) &&
  46        compare_refs local HEAD server HEAD
  47'
  48
  49test_expect_success 'fetch new branch' '
  50        (cd server &&
  51         git reset --hard &&
  52         git checkout -b new &&
  53         echo content >>file &&
  54         git commit -a -m five
  55        ) &&
  56        (cd local &&
  57         git fetch origin new
  58        ) &&
  59        compare_refs server HEAD local FETCH_HEAD
  60'
  61
  62test_expect_success 'fetch multiple branches' '
  63        (cd local &&
  64         git fetch
  65        ) &&
  66        compare_refs server master local refs/remotes/origin/master &&
  67        compare_refs server new local refs/remotes/origin/new
  68'
  69
  70test_expect_success 'push when remote has extra refs' '
  71        (cd local &&
  72         git reset --hard origin/master &&
  73         echo content >>file &&
  74         git commit -a -m six &&
  75         git push
  76        ) &&
  77        compare_refs local master server master
  78'
  79
  80test_expect_success 'push new branch by name' '
  81        (cd local &&
  82         git checkout -b new-name  &&
  83         echo content >>file &&
  84         git commit -a -m seven &&
  85         git push origin new-name
  86        ) &&
  87        compare_refs local HEAD server refs/heads/new-name
  88'
  89
  90test_expect_failure 'push new branch with old:new refspec' '
  91        (cd local &&
  92         git push origin new-name:new-refspec
  93        ) &&
  94        compare_refs local HEAD server refs/heads/new-refspec
  95'
  96
  97test_expect_success 'forced push' '
  98        (cd local &&
  99        git checkout -b force-test &&
 100        echo content >> file &&
 101        git commit -a -m eight &&
 102        git push origin force-test &&
 103        echo content >> file &&
 104        git commit -a --amend -m eight-modified &&
 105        git push --force origin force-test
 106        ) &&
 107        compare_refs local refs/heads/force-test server refs/heads/force-test
 108'
 109
 110test_expect_success 'cloning without refspec' '
 111        GIT_REMOTE_TESTGIT_REFSPEC="" \
 112        git clone "testgit::${PWD}/server" local2 2>error &&
 113        grep "This remote helper should implement refspec capability" error &&
 114        compare_refs local2 HEAD server HEAD
 115'
 116
 117test_expect_success 'pulling without refspecs' '
 118        (cd local2 &&
 119        git reset --hard &&
 120        GIT_REMOTE_TESTGIT_REFSPEC="" git pull 2>../error) &&
 121        grep "This remote helper should implement refspec capability" error &&
 122        compare_refs local2 HEAD server HEAD
 123'
 124
 125test_expect_success 'pushing without refspecs' '
 126        test_when_finished "(cd local2 && git reset --hard origin)" &&
 127        (cd local2 &&
 128        echo content >>file &&
 129        git commit -a -m ten &&
 130        GIT_REMOTE_TESTGIT_REFSPEC="" &&
 131        export GIT_REMOTE_TESTGIT_REFSPEC &&
 132        test_must_fail git push 2>../error) &&
 133        grep "remote-helper doesn.t support push; refspec needed" error
 134'
 135
 136test_expect_success 'pulling without marks' '
 137        (cd local2 &&
 138        GIT_REMOTE_TESTGIT_NO_MARKS=1 git pull) &&
 139        compare_refs local2 HEAD server HEAD
 140'
 141
 142test_expect_failure 'pushing without marks' '
 143        test_when_finished "(cd local2 && git reset --hard origin)" &&
 144        (cd local2 &&
 145        echo content >>file &&
 146        git commit -a -m twelve &&
 147        GIT_REMOTE_TESTGIT_NO_MARKS=1 git push) &&
 148        compare_refs local2 HEAD server HEAD
 149'
 150
 151test_expect_success 'push all with existing object' '
 152        (cd local &&
 153        git branch dup2 master &&
 154        git push origin --all
 155        ) &&
 156        compare_refs local dup2 server dup2
 157'
 158
 159test_expect_success 'push ref with existing object' '
 160        (cd local &&
 161        git branch dup master &&
 162        git push origin dup
 163        ) &&
 164        compare_refs local dup server dup
 165'
 166
 167test_expect_success GPG 'push signed tag' '
 168        (cd local &&
 169        git checkout master &&
 170        git tag -s -m signed-tag signed-tag &&
 171        git push origin signed-tag
 172        ) &&
 173        compare_refs local signed-tag^{} server signed-tag^{} &&
 174        test_must_fail compare_refs local signed-tag server signed-tag
 175'
 176
 177test_expect_success GPG 'push signed tag with signed-tags capability' '
 178        (cd local &&
 179        git checkout master &&
 180        git tag -s -m signed-tag signed-tag-2 &&
 181        GIT_REMOTE_TESTGIT_SIGNED_TAGS=1 git push origin signed-tag-2
 182        ) &&
 183        compare_refs local signed-tag-2 server signed-tag-2
 184'
 185
 186test_expect_success 'push update refs' '
 187        (cd local &&
 188        git checkout -b update master &&
 189        echo update >>file &&
 190        git commit -a -m update &&
 191        git push origin update &&
 192        git rev-parse --verify remotes/origin/update >expect &&
 193        git rev-parse --verify testgit/origin/heads/update >actual &&
 194        test_cmp expect actual
 195        )
 196'
 197
 198test_expect_success 'push update refs disabled by no-private-update' '
 199        (cd local &&
 200        echo more-update >>file &&
 201        git commit -a -m more-update &&
 202        git rev-parse --verify testgit/origin/heads/update >expect &&
 203        GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE=t git push origin update &&
 204        git rev-parse --verify testgit/origin/heads/update >actual &&
 205        test_cmp expect actual
 206        )
 207'
 208
 209test_expect_success 'push update refs failure' '
 210        (cd local &&
 211        git checkout update &&
 212        echo "update fail" >>file &&
 213        git commit -a -m "update fail" &&
 214        git rev-parse --verify testgit/origin/heads/update >expect &&
 215        test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
 216                git push origin update &&
 217        git rev-parse --verify testgit/origin/heads/update >actual &&
 218        test_cmp expect actual
 219        )
 220'
 221
 222clean_mark () {
 223        cut -f 2 -d ' ' "$1" |
 224        git cat-file --batch-check |
 225        grep commit |
 226        sort >$(basename "$1")
 227}
 228
 229cmp_marks () {
 230        test_when_finished "rm -rf git.marks testgit.marks" &&
 231        clean_mark ".git/testgit/$1/git.marks" &&
 232        clean_mark ".git/testgit/$1/testgit.marks" &&
 233        test_cmp git.marks testgit.marks
 234}
 235
 236test_expect_success 'proper failure checks for fetching' '
 237        (cd local &&
 238        test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
 239        cat error &&
 240        grep -q "Error while running fast-import" error
 241        )
 242'
 243
 244test_expect_success 'proper failure checks for pushing' '
 245        (cd local &&
 246        git checkout -b crash master &&
 247        echo crash >>file &&
 248        git commit -a -m crash &&
 249        test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
 250        cmp_marks origin
 251        )
 252'
 253
 254test_expect_success 'push messages' '
 255        (cd local &&
 256        git checkout -b new_branch master &&
 257        echo new >>file &&
 258        git commit -a -m new &&
 259        git push origin new_branch &&
 260        git fetch origin &&
 261        echo new >>file &&
 262        git commit -a -m new &&
 263        git push origin new_branch 2> msg &&
 264        ! grep "\[new branch\]" msg
 265        )
 266'
 267
 268test_done