apply: do not read from beyond a symbolic link
[gitweb.git] / t / t3200-branch.sh
index b08c9f22951bf447cc769c043a165d087fa5e38d..fcdb867748f3c651fdb58c148016f3da1cf2c9be 100755 (executable)
@@ -14,10 +14,11 @@ test_expect_success 'prepare a trivial repository' '
        echo World >>A &&
        git update-index --add A &&
        git commit -m "Second commit." &&
-       HEAD=$(git rev-parse --verify HEAD)'
+       HEAD=$(git rev-parse --verify HEAD)
+'
 
 test_expect_success 'git branch --help should not have created a bogus branch' '
-       test_might_fail git branch --help </dev/null >/dev/null 2>/dev/null &&
+       test_might_fail git branch --man --help </dev/null >/dev/null 2>&1 &&
        test_path_is_missing .git/refs/heads/--help
 '
 
@@ -75,7 +76,7 @@ test_expect_success 'git branch l should work after branch l/m has been deleted'
 
 test_expect_success 'git branch -m dumps usage' '
        test_expect_code 128 git branch -m 2>err &&
-       test_i18ngrep "too many branches for a rename operation" err
+       test_i18ngrep "branch name required" err
 '
 
 test_expect_success 'git branch -m m m/m should work' '
@@ -317,13 +318,14 @@ test_expect_success 'test tracking setup (non-wildcard, matching)' '
        test $(git config branch.my4.merge) = refs/heads/master
 '
 
-test_expect_success 'test tracking setup (non-wildcard, not matching)' '
+test_expect_success 'tracking setup fails on non-matching refspec' '
        git config remote.local.url . &&
-       git config remote.local.fetch refs/heads/s:refs/remotes/local/s &&
+       git config remote.local.fetch refs/heads/*:refs/remotes/local/* &&
        (git show-ref -q refs/remotes/local/master || git fetch local) &&
-       git branch --track my5 local/master &&
-       ! test "$(git config branch.my5.remote)" = local &&
-       ! test "$(git config branch.my5.merge)" = refs/heads/master
+       git config remote.local.fetch refs/heads/s:refs/remotes/local/s &&
+       test_must_fail git branch --track my5 local/master &&
+       test_must_fail git config branch.my5.remote &&
+       test_must_fail git config branch.my5.merge
 '
 
 test_expect_success 'test tracking setup via config' '
@@ -350,7 +352,7 @@ test_expect_success 'test overriding tracking setup via --no-track' '
 test_expect_success 'no tracking without .fetch entries' '
        git config branch.autosetupmerge true &&
        git branch my6 s &&
-       git config branch.automsetupmerge false &&
+       git config branch.autosetupmerge false &&
        test -z "$(git config branch.my6.remote)" &&
        test -z "$(git config branch.my6.merge)"
 '
@@ -409,17 +411,29 @@ test_expect_success '--set-upstream-to fails on detached HEAD' '
        git checkout -
 '
 
+test_expect_success '--set-upstream-to fails on a missing dst branch' '
+       test_must_fail git branch --set-upstream-to master does-not-exist
+'
+
+test_expect_success '--set-upstream-to fails on a missing src branch' '
+       test_must_fail git branch --set-upstream-to does-not-exist master
+'
+
+test_expect_success '--set-upstream-to fails on a non-ref' '
+       test_must_fail git branch --set-upstream-to HEAD^{}
+'
+
 test_expect_success 'use --set-upstream-to modify HEAD' '
        test_config branch.master.remote foo &&
        test_config branch.master.merge foo &&
-       git branch my12
+       git branch my12 &&
        git branch --set-upstream-to my12 &&
        test "$(git config branch.master.remote)" = "." &&
        test "$(git config branch.master.merge)" = "refs/heads/my12"
 '
 
 test_expect_success 'use --set-upstream-to modify a particular branch' '
-       git branch my13
+       git branch my13 &&
        git branch --set-upstream-to master my13 &&
        test "$(git config branch.my13.remote)" = "." &&
        test "$(git config branch.my13.merge)" = "refs/heads/master"
@@ -430,7 +444,7 @@ test_expect_success '--unset-upstream should fail if given a non-existent branch
 '
 
 test_expect_success 'test --unset-upstream on HEAD' '
-       git branch my14
+       git branch my14 &&
        test_config branch.master.remote foo &&
        test_config branch.master.merge foo &&
        git branch --set-upstream-to my14 &&
@@ -452,7 +466,7 @@ test_expect_success '--unset-upstream should fail on detached HEAD' '
 '
 
 test_expect_success 'test --unset-upstream on a particular branch' '
-       git branch my15
+       git branch my15 &&
        git branch --set-upstream-to master my14 &&
        git branch --unset-upstream my14 &&
        test_must_fail git config branch.my14.remote &&
@@ -858,4 +872,39 @@ test_expect_success '--merged catches invalid object names' '
        test_must_fail git branch --merged 0000000000000000000000000000000000000000
 '
 
+test_expect_success 'tracking with unexpected .fetch refspec' '
+       rm -rf a b c d &&
+       git init a &&
+       (
+               cd a &&
+               test_commit a
+       ) &&
+       git init b &&
+       (
+               cd b &&
+               test_commit b
+       ) &&
+       git init c &&
+       (
+               cd c &&
+               test_commit c &&
+               git remote add a ../a &&
+               git remote add b ../b &&
+               git fetch --all
+       ) &&
+       git init d &&
+       (
+               cd d &&
+               git remote add c ../c &&
+               git config remote.c.fetch "+refs/remotes/*:refs/remotes/*" &&
+               git fetch c &&
+               git branch --track local/a/master remotes/a/master &&
+               test "$(git config branch.local/a/master.remote)" = "c" &&
+               test "$(git config branch.local/a/master.merge)" = "refs/remotes/a/master" &&
+               git rev-parse --verify a >expect &&
+               git rev-parse --verify local/a/master >actual &&
+               test_cmp expect actual
+       )
+'
+
 test_done