use struct sha1_array in diff_tree_combined()
[gitweb.git] / t / t5510-fetch.sh
index 169af1edde557f054ea76b8de681c6dd74e436f2..e88dbd50f3368296a0e0487d7ed1675646ee9594 100755 (executable)
@@ -21,27 +21,30 @@ test_expect_success setup '
 
 test_expect_success "clone and setup child repos" '
        git clone . one &&
-       cd one &&
-       echo >file updated by one &&
-       git commit -a -m "updated by one" &&
-       cd .. &&
+       (
+               cd one &&
+               echo >file updated by one &&
+               git commit -a -m "updated by one"
+       ) &&
        git clone . two &&
-       cd two &&
-       git config branch.master.remote one &&
-       git config remote.one.url ../one/.git/ &&
-       git config remote.one.fetch refs/heads/master:refs/heads/one &&
-       cd .. &&
+       (
+               cd two &&
+               git config branch.master.remote one &&
+               git config remote.one.url ../one/.git/ &&
+               git config remote.one.fetch refs/heads/master:refs/heads/one
+       ) &&
        git clone . three &&
-       cd three &&
-       git config branch.master.remote two &&
-       git config branch.master.merge refs/heads/one &&
-       mkdir -p .git/remotes &&
-       {
-               echo "URL: ../two/.git/"
-               echo "Pull: refs/heads/master:refs/heads/two"
-               echo "Pull: refs/heads/one:refs/heads/one"
-       } >.git/remotes/two &&
-       cd .. &&
+       (
+               cd three &&
+               git config branch.master.remote two &&
+               git config branch.master.merge refs/heads/one &&
+               mkdir -p .git/remotes &&
+               {
+                       echo "URL: ../two/.git/"
+                       echo "Pull: refs/heads/master:refs/heads/two"
+                       echo "Pull: refs/heads/one:refs/heads/one"
+               } >.git/remotes/two
+       ) &&
        git clone . bundle &&
        git clone . seven
 '
@@ -71,7 +74,57 @@ test_expect_success "fetch test for-merge" '
                echo "$one_in_two       "
        } >expected &&
        cut -f -2 .git/FETCH_HEAD >actual &&
-       diff expected actual'
+       test_cmp expected actual'
+
+test_expect_success 'fetch --prune on its own works as expected' '
+       cd "$D" &&
+       git clone . prune &&
+       cd prune &&
+       git fetch origin refs/heads/master:refs/remotes/origin/extrabranch &&
+
+       git fetch --prune origin &&
+       test_must_fail git rev-parse origin/extrabranch
+'
+
+test_expect_success 'fetch --prune with a branch name keeps branches' '
+       cd "$D" &&
+       git clone . prune-branch &&
+       cd prune-branch &&
+       git fetch origin refs/heads/master:refs/remotes/origin/extrabranch &&
+
+       git fetch --prune origin master &&
+       git rev-parse origin/extrabranch
+'
+
+test_expect_success 'fetch --prune with a namespace keeps other namespaces' '
+       cd "$D" &&
+       git clone . prune-namespace &&
+       cd prune-namespace &&
+
+       git fetch --prune origin refs/heads/a/*:refs/remotes/origin/a/* &&
+       git rev-parse origin/master
+'
+
+test_expect_success 'fetch --prune --tags does not delete the remote-tracking branches' '
+       cd "$D" &&
+       git clone . prune-tags &&
+       cd prune-tags &&
+       git fetch origin refs/heads/master:refs/tags/sometag &&
+
+       git fetch --prune --tags origin &&
+       git rev-parse origin/master &&
+       test_must_fail git rev-parse somebranch
+'
+
+test_expect_success 'fetch --prune --tags with branch does not delete other remote-tracking branches' '
+       cd "$D" &&
+       git clone . prune-tags-branch &&
+       cd prune-tags-branch &&
+       git fetch origin refs/heads/master:refs/remotes/origin/extrabranch &&
+
+       git fetch --prune --tags origin master &&
+       git rev-parse origin/extrabranch
+'
 
 test_expect_success 'fetch tags when there is no tags' '
 
@@ -113,17 +166,16 @@ test_expect_success 'fetch must not resolve short tag name' '
 
 '
 
-test_expect_success 'fetch must not resolve short remote name' '
+test_expect_success 'fetch can now resolve short remote name' '
 
        cd "$D" &&
-       git update-ref refs/remotes/six/HEAD HEAD
+       git update-ref refs/remotes/six/HEAD HEAD &&
 
        mkdir six &&
        cd six &&
        git init &&
 
-       test_must_fail git fetch .. six:six
-
+       git fetch .. six:six
 '
 
 test_expect_success 'create bundle 1' '
@@ -240,6 +292,38 @@ test_expect_success 'fetch with a non-applying branch.<name>.merge' '
        git fetch blub
 '
 
+# URL supplied to fetch does not match the url of the configured branch's remote
+test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [1]' '
+       one_head=$(cd one && git rev-parse HEAD) &&
+       this_head=$(git rev-parse HEAD) &&
+       git update-ref -d FETCH_HEAD &&
+       git fetch one &&
+       test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
+       test $this_head = "$(git rev-parse --verify HEAD)"
+'
+
+# URL supplied to fetch matches the url of the configured branch's remote and
+# the merge spec matches the branch the remote HEAD points to
+test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [2]' '
+       one_ref=$(cd one && git symbolic-ref HEAD) &&
+       git config branch.master.remote blub &&
+       git config branch.master.merge "$one_ref" &&
+       git update-ref -d FETCH_HEAD &&
+       git fetch one &&
+       test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
+       test $this_head = "$(git rev-parse --verify HEAD)"
+'
+
+# URL supplied to fetch matches the url of the configured branch's remote, but
+# the merge spec does not match the branch the remote HEAD points to
+test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge [3]' '
+       git config branch.master.merge "${one_ref}_not" &&
+       git update-ref -d FETCH_HEAD &&
+       git fetch one &&
+       test $one_head = "$(git rev-parse --verify FETCH_HEAD)" &&
+       test $this_head = "$(git rev-parse --verify HEAD)"
+'
+
 # the strange name is: a\!'b
 test_expect_success 'quoting of a strangely named repo' '
        test_must_fail git fetch "a\\!'\''b" > result 2>&1 &&
@@ -341,6 +425,13 @@ test_expect_success 'fetch into the current branch with --update-head-ok' '
 
 '
 
+test_expect_success 'fetch --dry-run' '
+
+       rm -f .git/FETCH_HEAD &&
+       git fetch --dry-run . &&
+       ! test -f .git/FETCH_HEAD
+'
+
 test_expect_success "should be able to fetch with duplicate refspecs" '
         mkdir dups &&
         cd dups &&