Merge branch 'mm/simple-push'
[gitweb.git] / t / t5505-remote.sh
index 5ec668d6d8ac22f161549e5592a49bfdb0f11081..e8af615e6dcdf365416ef9f71825c17a0d601186 100755 (executable)
@@ -107,20 +107,23 @@ test_expect_success 'remove remote' '
 )
 '
 
-test_expect_success 'remove remote protects non-remote branches' '
+test_expect_success 'remove remote protects local branches' '
 (
        cd test &&
-       (cat >expect1 <<EOF
-Note: A non-remote branch was not removed; to delete it, use:
+       { cat >expect1 <<EOF
+Note: A branch outside the refs/remotes/ hierarchy was not removed;
+to delete it, use:
   git branch -d master
 EOF
-    cat >expect2 <<EOF
-Note: Non-remote branches were not removed; to delete them, use:
+       } &&
+       { cat >expect2 <<EOF
+Note: Some branches outside the refs/remotes/ hierarchy were not removed;
+to delete them, use:
   git branch -d foobranch
   git branch -d master
 EOF
-) &&
-       git tag footag
+       } &&
+       git tag footag &&
        git config --add remote.oops.fetch "+refs/*:refs/*" &&
        git remote rm oops 2>actual1 &&
        git branch foobranch &&
@@ -135,7 +138,8 @@ EOF
 
 cat > test/expect << EOF
 * remote origin
-  URL: $(pwd)/one
+  Fetch URL: $(pwd)/one
+  Push  URL: $(pwd)/one
   HEAD branch: master
   Remote branches:
     master new (next fetch will store in remotes/origin)
@@ -151,12 +155,13 @@ cat > test/expect << EOF
     master pushes to master   (local out of date)
     master pushes to upstream (create)
 * remote two
-  URL: ../two
+  Fetch URL: ../two
+  Push  URL: ../three
   HEAD branch (remote HEAD is ambiguous, may be one of the following):
     another
     master
   Local refs configured for 'git push':
-    ahead  forces to master  (fast forwardable)
+    ahead  forces to master  (fast-forwardable)
     master pushes to another (up to date)
 EOF
 
@@ -173,6 +178,7 @@ test_expect_success 'show' '
         git branch --track rebase origin/master &&
         git branch -d -r origin/master &&
         git config --add remote.two.url ../two &&
+        git config --add remote.two.pushurl ../three &&
         git config branch.rebase.rebase true &&
         git config branch.octopus.merge "topic-a topic-b topic-c" &&
         (cd ../one &&
@@ -191,7 +197,8 @@ test_expect_success 'show' '
 
 cat > test/expect << EOF
 * remote origin
-  URL: $(pwd)/one
+  Fetch URL: $(pwd)/one
+  Push  URL: $(pwd)/one
   HEAD branch: (not queried)
   Remote branches: (status not queried)
     master
@@ -297,6 +304,106 @@ test_expect_success 'add --mirror && prune' '
         git rev-parse --verify refs/heads/side)
 '
 
+test_expect_success 'add --mirror=fetch' '
+       mkdir mirror-fetch &&
+       git init mirror-fetch/parent &&
+       (cd mirror-fetch/parent &&
+        test_commit one) &&
+       git init --bare mirror-fetch/child &&
+       (cd mirror-fetch/child &&
+        git remote add --mirror=fetch -f parent ../parent)
+'
+
+test_expect_success 'fetch mirrors act as mirrors during fetch' '
+       (cd mirror-fetch/parent &&
+        git branch new &&
+        git branch -m master renamed
+       ) &&
+       (cd mirror-fetch/child &&
+        git fetch parent &&
+        git rev-parse --verify refs/heads/new &&
+        git rev-parse --verify refs/heads/renamed
+       )
+'
+
+test_expect_success 'fetch mirrors can prune' '
+       (cd mirror-fetch/child &&
+        git remote prune parent &&
+        test_must_fail git rev-parse --verify refs/heads/master
+       )
+'
+
+test_expect_success 'fetch mirrors do not act as mirrors during push' '
+       (cd mirror-fetch/parent &&
+        git checkout HEAD^0
+       ) &&
+       (cd mirror-fetch/child &&
+        git branch -m renamed renamed2 &&
+        git push parent
+       ) &&
+       (cd mirror-fetch/parent &&
+        git rev-parse --verify renamed &&
+        test_must_fail git rev-parse --verify refs/heads/renamed2
+       )
+'
+
+test_expect_success 'add fetch mirror with specific branches' '
+       git init --bare mirror-fetch/track &&
+       (cd mirror-fetch/track &&
+        git remote add --mirror=fetch -t heads/new parent ../parent
+       )
+'
+
+test_expect_success 'fetch mirror respects specific branches' '
+       (cd mirror-fetch/track &&
+        git fetch parent &&
+        git rev-parse --verify refs/heads/new &&
+        test_must_fail git rev-parse --verify refs/heads/renamed
+       )
+'
+
+test_expect_success 'add --mirror=push' '
+       mkdir mirror-push &&
+       git init --bare mirror-push/public &&
+       git init mirror-push/private &&
+       (cd mirror-push/private &&
+        test_commit one &&
+        git remote add --mirror=push public ../public
+       )
+'
+
+test_expect_success 'push mirrors act as mirrors during push' '
+       (cd mirror-push/private &&
+        git branch new &&
+        git branch -m master renamed &&
+        git push public
+       ) &&
+       (cd mirror-push/private &&
+        git rev-parse --verify refs/heads/new &&
+        git rev-parse --verify refs/heads/renamed &&
+        test_must_fail git rev-parse --verify refs/heads/master
+       )
+'
+
+test_expect_success 'push mirrors do not act as mirrors during fetch' '
+       (cd mirror-push/public &&
+        git branch -m renamed renamed2 &&
+        git symbolic-ref HEAD refs/heads/renamed2
+       ) &&
+       (cd mirror-push/private &&
+        git fetch public &&
+        git rev-parse --verify refs/heads/renamed &&
+        test_must_fail git rev-parse --verify refs/heads/renamed2
+       )
+'
+
+test_expect_success 'push mirrors do not allow you to specify refs' '
+       git init mirror-push/track &&
+       (cd mirror-push/track &&
+        test_must_fail git remote add --mirror=push -t new public ../public
+       )
+'
+
 test_expect_success 'add alt && prune' '
        (mkdir alttst &&
         cd alttst &&
@@ -315,6 +422,69 @@ test_expect_success 'add alt && prune' '
         git rev-parse --verify refs/remotes/origin/side2)
 '
 
+cat >test/expect <<\EOF
+some-tag
+EOF
+
+test_expect_success 'add with reachable tags (default)' '
+       (cd one &&
+        >foobar &&
+        git add foobar &&
+        git commit -m "Foobar" &&
+        git tag -a -m "Foobar tag" foobar-tag &&
+        git reset --hard HEAD~1 &&
+        git tag -a -m "Some tag" some-tag) &&
+       (mkdir add-tags &&
+        cd add-tags &&
+        git init &&
+        git remote add -f origin ../one &&
+        git tag -l some-tag >../test/output &&
+        git tag -l foobar-tag >>../test/output &&
+        test_must_fail git config remote.origin.tagopt) &&
+       test_cmp test/expect test/output
+'
+
+cat >test/expect <<\EOF
+some-tag
+foobar-tag
+--tags
+EOF
+
+test_expect_success 'add --tags' '
+       (rm -rf add-tags &&
+        mkdir add-tags &&
+        cd add-tags &&
+        git init &&
+        git remote add -f --tags origin ../one &&
+        git tag -l some-tag >../test/output &&
+        git tag -l foobar-tag >>../test/output &&
+        git config remote.origin.tagopt >>../test/output) &&
+       test_cmp test/expect test/output
+'
+
+cat >test/expect <<\EOF
+--no-tags
+EOF
+
+test_expect_success 'add --no-tags' '
+       (rm -rf add-tags &&
+        mkdir add-no-tags &&
+        cd add-no-tags &&
+        git init &&
+        git remote add -f --no-tags origin ../one &&
+        git tag -l some-tag >../test/output &&
+        git tag -l foobar-tag >../test/output &&
+        git config remote.origin.tagopt >>../test/output) &&
+       (cd one &&
+        git tag -d some-tag foobar-tag) &&
+       test_cmp test/expect test/output
+'
+
+test_expect_success 'reject --no-no-tags' '
+       (cd add-no-tags &&
+        test_must_fail git remote add -f --no-no-tags neworigin ../one)
+'
+
 cat > one/expect << EOF
   apis/master
   apis/side
@@ -361,6 +531,17 @@ test_expect_success 'update with arguments' '
 
 '
 
+test_expect_success 'update --prune' '
+
+       (cd one &&
+        git branch -m side2 side3) &&
+       (cd test &&
+        git remote update --prune &&
+        (cd ../one && git branch -m side3 side2) &&
+        git rev-parse refs/remotes/origin/side3 &&
+        test_must_fail git rev-parse refs/remotes/origin/side2)
+'
+
 cat > one/expect << EOF
   apis/master
   apis/side
@@ -404,6 +585,20 @@ test_expect_success 'update default (overridden, with funny whitespace)' '
 
 '
 
+test_expect_success 'update (with remotes.default defined)' '
+
+       (cd one &&
+        for b in $(git branch -r)
+        do
+               git branch -r -d $b || break
+        done &&
+        git config remotes.default "drosophila" &&
+        git remote update &&
+        git branch -r > output &&
+        test_cmp expect output)
+
+'
+
 test_expect_success '"remote show" does not show symbolic refs' '
 
        git clone one three &&
@@ -436,6 +631,37 @@ test_expect_success 'rename a remote' '
 
 '
 
+test_expect_success 'rename does not update a non-default fetch refspec' '
+
+       git clone one four.one &&
+       (cd four.one &&
+        git config remote.origin.fetch +refs/heads/*:refs/heads/origin/* &&
+        git remote rename origin upstream &&
+        test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/heads/origin/*" &&
+        git rev-parse -q origin/master)
+
+'
+
+test_expect_success 'rename a remote with name part of fetch spec' '
+
+       git clone one four.two &&
+       (cd four.two &&
+        git remote rename origin remote &&
+        git remote rename remote upstream &&
+        test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*")
+
+'
+
+test_expect_success 'rename a remote with name prefix of other remote' '
+
+       git clone one four.three &&
+       (cd four.three &&
+        git remote add o git://example.com/repo.git &&
+        git remote rename o upstream &&
+        test "$(git rev-parse origin/master)" = "$(git rev-parse master)")
+
+'
+
 cat > remotes_origin << EOF
 URL: $(pwd)/one
 Push: refs/heads/master:refs/heads/upstream
@@ -478,15 +704,15 @@ test_expect_success 'remote prune to cause a dangling symref' '
        (
                cd seven &&
                git remote prune origin
-       ) 2>err &&
+       ) >err 2>&1 &&
        grep "has become dangling" err &&
 
-       : And the dangling symref will not cause other annoying errors
+       : And the dangling symref will not cause other annoying errors &&
        (
                cd seven &&
                git branch -a
        ) 2>err &&
-       ! grep "points nowhere" err
+       ! grep "points nowhere" err &&
        (
                cd seven &&
                test_must_fail git branch nomore origin
@@ -494,5 +720,281 @@ test_expect_success 'remote prune to cause a dangling symref' '
        grep "dangling symref" err
 '
 
-test_done
+test_expect_success 'show empty remote' '
 
+       test_create_repo empty &&
+       git clone empty empty-clone &&
+       (
+               cd empty-clone &&
+               git remote show origin
+       )
+'
+
+test_expect_success 'remote set-branches requires a remote' '
+       test_must_fail git remote set-branches &&
+       test_must_fail git remote set-branches --add
+'
+
+test_expect_success 'remote set-branches' '
+       echo "+refs/heads/*:refs/remotes/scratch/*" >expect.initial &&
+       sort <<-\EOF >expect.add &&
+       +refs/heads/*:refs/remotes/scratch/*
+       +refs/heads/other:refs/remotes/scratch/other
+       EOF
+       sort <<-\EOF >expect.replace &&
+       +refs/heads/maint:refs/remotes/scratch/maint
+       +refs/heads/master:refs/remotes/scratch/master
+       +refs/heads/next:refs/remotes/scratch/next
+       EOF
+       sort <<-\EOF >expect.add-two &&
+       +refs/heads/maint:refs/remotes/scratch/maint
+       +refs/heads/master:refs/remotes/scratch/master
+       +refs/heads/next:refs/remotes/scratch/next
+       +refs/heads/pu:refs/remotes/scratch/pu
+       +refs/heads/t/topic:refs/remotes/scratch/t/topic
+       EOF
+       sort <<-\EOF >expect.setup-ffonly &&
+       refs/heads/master:refs/remotes/scratch/master
+       +refs/heads/next:refs/remotes/scratch/next
+       EOF
+       sort <<-\EOF >expect.respect-ffonly &&
+       refs/heads/master:refs/remotes/scratch/master
+       +refs/heads/next:refs/remotes/scratch/next
+       +refs/heads/pu:refs/remotes/scratch/pu
+       EOF
+
+       git clone .git/ setbranches &&
+       (
+               cd setbranches &&
+               git remote rename origin scratch &&
+               git config --get-all remote.scratch.fetch >config-result &&
+               sort <config-result >../actual.initial &&
+
+               git remote set-branches scratch --add other &&
+               git config --get-all remote.scratch.fetch >config-result &&
+               sort <config-result >../actual.add &&
+
+               git remote set-branches scratch maint master next &&
+               git config --get-all remote.scratch.fetch >config-result &&
+               sort <config-result >../actual.replace &&
+
+               git remote set-branches --add scratch pu t/topic &&
+               git config --get-all remote.scratch.fetch >config-result &&
+               sort <config-result >../actual.add-two &&
+
+               git config --unset-all remote.scratch.fetch &&
+               git config remote.scratch.fetch \
+                       refs/heads/master:refs/remotes/scratch/master &&
+               git config --add remote.scratch.fetch \
+                       +refs/heads/next:refs/remotes/scratch/next &&
+               git config --get-all remote.scratch.fetch >config-result &&
+               sort <config-result >../actual.setup-ffonly &&
+
+               git remote set-branches --add scratch pu &&
+               git config --get-all remote.scratch.fetch >config-result &&
+               sort <config-result >../actual.respect-ffonly
+       ) &&
+       test_cmp expect.initial actual.initial &&
+       test_cmp expect.add actual.add &&
+       test_cmp expect.replace actual.replace &&
+       test_cmp expect.add-two actual.add-two &&
+       test_cmp expect.setup-ffonly actual.setup-ffonly &&
+       test_cmp expect.respect-ffonly actual.respect-ffonly
+'
+
+test_expect_success 'remote set-branches with --mirror' '
+       echo "+refs/*:refs/*" >expect.initial &&
+       echo "+refs/heads/master:refs/heads/master" >expect.replace &&
+       git clone --mirror .git/ setbranches-mirror &&
+       (
+               cd setbranches-mirror &&
+               git remote rename origin scratch &&
+               git config --get-all remote.scratch.fetch >../actual.initial &&
+
+               git remote set-branches scratch heads/master &&
+               git config --get-all remote.scratch.fetch >../actual.replace
+       ) &&
+       test_cmp expect.initial actual.initial &&
+       test_cmp expect.replace actual.replace
+'
+
+test_expect_success 'new remote' '
+       git remote add someremote foo &&
+       echo foo >expect &&
+       git config --get-all remote.someremote.url >actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url bar' '
+       git remote set-url someremote bar &&
+       echo bar >expect &&
+       git config --get-all remote.someremote.url >actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url baz bar' '
+       git remote set-url someremote baz bar &&
+       echo baz >expect &&
+       git config --get-all remote.someremote.url >actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url zot bar' '
+       test_must_fail git remote set-url someremote zot bar &&
+       echo baz >expect &&
+       git config --get-all remote.someremote.url >actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push zot baz' '
+       test_must_fail git remote set-url --push someremote zot baz &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push zot' '
+       git remote set-url --push someremote zot &&
+       echo zot >expect &&
+       echo "YYY" >>expect &&
+       echo baz >>expect &&
+       git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push qux zot' '
+       git remote set-url --push someremote qux zot &&
+       echo qux >expect &&
+       echo "YYY" >>expect &&
+       echo baz >>expect &&
+       git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push foo qu+x' '
+       git remote set-url --push someremote foo qu+x &&
+       echo foo >expect &&
+       echo "YYY" >>expect &&
+       echo baz >>expect &&
+       git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push --add aaa' '
+       git remote set-url --push --add someremote aaa &&
+       echo foo >expect &&
+       echo aaa >>expect &&
+       echo "YYY" >>expect &&
+       echo baz >>expect &&
+       git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push bar aaa' '
+       git remote set-url --push someremote bar aaa &&
+       echo foo >expect &&
+       echo bar >>expect &&
+       echo "YYY" >>expect &&
+       echo baz >>expect &&
+       git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push --delete bar' '
+       git remote set-url --push --delete someremote bar &&
+       echo foo >expect &&
+       echo "YYY" >>expect &&
+       echo baz >>expect &&
+       git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --push --delete foo' '
+       git remote set-url --push --delete someremote foo &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --add bbb' '
+       git remote set-url --add someremote bbb &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       echo bbb >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --delete .*' '
+       test_must_fail git remote set-url --delete someremote .\* &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       echo bbb >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --delete bbb' '
+       git remote set-url --delete someremote bbb &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --delete baz' '
+       test_must_fail git remote set-url --delete someremote baz &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --add ccc' '
+       git remote set-url --add someremote ccc &&
+       echo "YYY" >expect &&
+       echo baz >>expect &&
+       echo ccc >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_expect_success 'remote set-url --delete baz' '
+       git remote set-url --delete someremote baz &&
+       echo "YYY" >expect &&
+       echo ccc >>expect &&
+       test_must_fail git config --get-all remote.someremote.pushurl >actual &&
+       echo "YYY" >>actual &&
+       git config --get-all remote.someremote.url >>actual &&
+       cmp expect actual
+'
+
+test_done