]>
Commit | Line | Data |
---|---|---|
f78d1fe2 JK |
1 | #!/bin/sh |
2 | ||
3 | test_description='merge: handle file mode' | |
4 | . ./test-lib.sh | |
5 | ||
6 | test_expect_success 'set up mode change in one branch' ' | |
7 | : >file1 && | |
8 | git add file1 && | |
9 | git commit -m initial && | |
10 | git checkout -b a1 master && | |
11 | : >dummy && | |
12 | git add dummy && | |
13 | git commit -m a && | |
14 | git checkout -b b1 master && | |
15 | test_chmod +x file1 && | |
16 | git add file1 && | |
17 | git commit -m b1 | |
18 | ' | |
19 | ||
20 | do_one_mode () { | |
21 | strategy=$1 | |
22 | us=$2 | |
23 | them=$3 | |
24 | test_expect_success "resolve single mode change ($strategy, $us)" ' | |
25 | git checkout -f $us && | |
26 | git merge -s $strategy $them && | |
27 | git ls-files -s file1 | grep ^100755 | |
28 | ' | |
29 | ||
30 | test_expect_success FILEMODE "verify executable bit on file ($strategy, $us)" ' | |
31 | test -x file1 | |
32 | ' | |
33 | } | |
34 | ||
35 | do_one_mode recursive a1 b1 | |
36 | do_one_mode recursive b1 a1 | |
37 | do_one_mode resolve a1 b1 | |
38 | do_one_mode resolve b1 a1 | |
39 | ||
40 | test_expect_success 'set up mode change in both branches' ' | |
41 | git reset --hard HEAD && | |
42 | git checkout -b a2 master && | |
43 | : >file2 && | |
44 | H=$(git hash-object file2) && | |
45 | test_chmod +x file2 && | |
46 | git commit -m a2 && | |
47 | git checkout -b b2 master && | |
48 | : >file2 && | |
49 | git add file2 && | |
50 | git commit -m b2 && | |
51 | { | |
52 | echo "100755 $H 2 file2" | |
53 | echo "100644 $H 3 file2" | |
54 | } >expect | |
55 | ' | |
56 | ||
57 | do_both_modes () { | |
58 | strategy=$1 | |
59 | test_expect_success "detect conflict on double mode change ($strategy)" ' | |
60 | git reset --hard && | |
61 | git checkout -f a2 && | |
62 | test_must_fail git merge -s $strategy b2 && | |
63 | git ls-files -u >actual && | |
dcbaa0b3 | 64 | test_cmp expect actual && |
f78d1fe2 JK |
65 | git ls-files -s file2 | grep ^100755 |
66 | ' | |
67 | ||
68 | test_expect_success FILEMODE "verify executable bit on file ($strategy)" ' | |
69 | test -x file2 | |
70 | ' | |
71 | } | |
72 | ||
73 | # both sides are equivalent, so no need to run both ways | |
74 | do_both_modes recursive | |
75 | do_both_modes resolve | |
76 | ||
72fac66b JK |
77 | test_expect_success 'set up delete/modechange scenario' ' |
78 | git reset --hard && | |
79 | git checkout -b deletion master && | |
80 | git rm file1 && | |
81 | git commit -m deletion | |
82 | ' | |
83 | ||
84 | do_delete_modechange () { | |
85 | strategy=$1 | |
86 | us=$2 | |
87 | them=$3 | |
88 | test_expect_success "detect delete/modechange conflict ($strategy, $us)" ' | |
89 | git reset --hard && | |
90 | git checkout $us && | |
91 | test_must_fail git merge -s $strategy $them | |
92 | ' | |
93 | } | |
94 | ||
95 | do_delete_modechange recursive b1 deletion | |
96 | do_delete_modechange recursive deletion b1 | |
97 | do_delete_modechange resolve b1 deletion | |
98 | do_delete_modechange resolve deletion b1 | |
99 | ||
f78d1fe2 | 100 | test_done |