#!/bin/sh test_description='fetch handles conflicting refspecs correctly' . ./test-lib.sh D=$(pwd) setup_repository () { git init "$1" && ( cd "$1" && git config remote.origin.url "$D" && shift && for refspec in "$@" do git config --add remote.origin.fetch "$refspec" done ) } verify_stderr () { cat >expected && # We're not interested in the error # "fatal: The remote end hung up unexpectedly": grep -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort && test_cmp expected actual } test_expect_success 'setup' ' git commit --allow-empty -m "Initial" && git branch branch1 && git tag tag1 && git commit --allow-empty -m "First" && git branch branch2 && git tag tag2 ' test_expect_success 'fetch with no conflict' ' setup_repository ok "+refs/heads/*:refs/remotes/origin/*" && ( cd ok && git fetch origin ) ' test_expect_success 'fetch conflict: config vs. config' ' setup_repository ccc \ "+refs/heads/branch1:refs/remotes/origin/branch1" \ "+refs/heads/branch2:refs/remotes/origin/branch1" && ( cd ccc && test_must_fail git fetch origin 2>error && verify_stderr <<-\EOF fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 EOF ) ' test_expect_success 'fetch duplicate: config vs. config' ' setup_repository dcc \ "+refs/heads/*:refs/remotes/origin/*" \ "+refs/heads/branch1:refs/remotes/origin/branch1" && ( cd dcc && git fetch origin ) ' test_expect_success 'fetch conflict: arg overrides config' ' setup_repository aoc \ "+refs/heads/*:refs/remotes/origin/*" && ( cd aoc && git fetch origin refs/heads/branch2:refs/remotes/origin/branch1 ) ' test_expect_success 'fetch conflict: arg vs. arg' ' setup_repository caa && ( cd caa && test_must_fail git fetch origin \ refs/heads/*:refs/remotes/origin/* \ refs/heads/branch2:refs/remotes/origin/branch1 2>error && verify_stderr <<-\EOF fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 EOF ) ' test_expect_success 'fetch conflict: criss-cross args' ' setup_repository xaa \ "+refs/heads/*:refs/remotes/origin/*" && ( cd xaa && git fetch origin \ refs/heads/branch1:refs/remotes/origin/branch2 \ refs/heads/branch2:refs/remotes/origin/branch1 2>error && verify_stderr <<-\EOF warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2 warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1 EOF ) ' test_done