]>
Commit | Line | Data |
---|---|---|
2071e05e MH |
1 | #!/bin/sh |
2 | ||
3 | test_description='fetch handles conflicting refspecs correctly' | |
4 | ||
5 | . ./test-lib.sh | |
6 | ||
7 | D=$(pwd) | |
8 | ||
9 | setup_repository () { | |
10 | git init "$1" && ( | |
11 | cd "$1" && | |
12 | git config remote.origin.url "$D" && | |
13 | shift && | |
14 | for refspec in "$@" | |
15 | do | |
16 | git config --add remote.origin.fetch "$refspec" | |
17 | done | |
18 | ) | |
19 | } | |
20 | ||
21 | verify_stderr () { | |
22 | cat >expected && | |
23 | # We're not interested in the error | |
24 | # "fatal: The remote end hung up unexpectedly": | |
f096e6e8 | 25 | grep -E '^(fatal|warning):' <error | grep -v 'hung up' >actual | sort && |
2071e05e MH |
26 | test_cmp expected actual |
27 | } | |
28 | ||
29 | test_expect_success 'setup' ' | |
30 | git commit --allow-empty -m "Initial" && | |
31 | git branch branch1 && | |
32 | git tag tag1 && | |
33 | git commit --allow-empty -m "First" && | |
34 | git branch branch2 && | |
35 | git tag tag2 | |
36 | ' | |
37 | ||
38 | test_expect_success 'fetch with no conflict' ' | |
39 | setup_repository ok "+refs/heads/*:refs/remotes/origin/*" && ( | |
40 | cd ok && | |
41 | git fetch origin | |
42 | ) | |
43 | ' | |
44 | ||
45 | test_expect_success 'fetch conflict: config vs. config' ' | |
46 | setup_repository ccc \ | |
47 | "+refs/heads/branch1:refs/remotes/origin/branch1" \ | |
48 | "+refs/heads/branch2:refs/remotes/origin/branch1" && ( | |
49 | cd ccc && | |
50 | test_must_fail git fetch origin 2>error && | |
51 | verify_stderr <<-\EOF | |
f096e6e8 | 52 | fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 |
2071e05e MH |
53 | EOF |
54 | ) | |
55 | ' | |
56 | ||
57 | test_expect_success 'fetch duplicate: config vs. config' ' | |
58 | setup_repository dcc \ | |
59 | "+refs/heads/*:refs/remotes/origin/*" \ | |
60 | "+refs/heads/branch1:refs/remotes/origin/branch1" && ( | |
61 | cd dcc && | |
62 | git fetch origin | |
63 | ) | |
64 | ' | |
65 | ||
66 | test_expect_success 'fetch conflict: arg overrides config' ' | |
67 | setup_repository aoc \ | |
68 | "+refs/heads/*:refs/remotes/origin/*" && ( | |
69 | cd aoc && | |
70 | git fetch origin refs/heads/branch2:refs/remotes/origin/branch1 | |
71 | ) | |
72 | ' | |
73 | ||
74 | test_expect_success 'fetch conflict: arg vs. arg' ' | |
75 | setup_repository caa && ( | |
76 | cd caa && | |
77 | test_must_fail git fetch origin \ | |
78 | refs/heads/*:refs/remotes/origin/* \ | |
79 | refs/heads/branch2:refs/remotes/origin/branch1 2>error && | |
80 | verify_stderr <<-\EOF | |
f096e6e8 | 81 | fatal: Cannot fetch both refs/heads/branch1 and refs/heads/branch2 to refs/remotes/origin/branch1 |
2071e05e MH |
82 | EOF |
83 | ) | |
84 | ' | |
85 | ||
f096e6e8 | 86 | test_expect_success 'fetch conflict: criss-cross args' ' |
2071e05e MH |
87 | setup_repository xaa \ |
88 | "+refs/heads/*:refs/remotes/origin/*" && ( | |
89 | cd xaa && | |
90 | git fetch origin \ | |
91 | refs/heads/branch1:refs/remotes/origin/branch2 \ | |
f096e6e8 MH |
92 | refs/heads/branch2:refs/remotes/origin/branch1 2>error && |
93 | verify_stderr <<-\EOF | |
94 | warning: refs/remotes/origin/branch1 usually tracks refs/heads/branch1, not refs/heads/branch2 | |
95 | warning: refs/remotes/origin/branch2 usually tracks refs/heads/branch2, not refs/heads/branch1 | |
96 | EOF | |
2071e05e MH |
97 | ) |
98 | ' | |
99 | ||
100 | test_done |