]> asedeno.scripts.mit.edu Git - git.git/blob - t/t7110-reset-merge.sh
reset: add a few tests for "git reset --merge"
[git.git] / t / t7110-reset-merge.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2009 Christian Couder
4 #
5
6 test_description='Tests for "git reset --merge"'
7
8 . ./test-lib.sh
9
10 test_expect_success setup '
11     for i in 1 2 3; do echo line $i; done >file1 &&
12     cat file1 >file2 &&
13     git add file1 file2 &&
14     test_tick &&
15     git commit -m "Initial commit" &&
16     git tag initial &&
17     echo line 4 >>file1 &&
18     cat file1 >file2 &&
19     test_tick &&
20     git commit -m "add line 4 to file1" file1 &&
21     git tag second
22 '
23
24 # The next test will test the following:
25 #
26 #           working index HEAD target         working index HEAD
27 #           ----------------------------------------------------
28 # file1:     C       C     C    D     --merge  D       D     D
29 # file2:     C       D     D    D     --merge  C       D     D
30 test_expect_success 'reset --merge is ok with changes in file it does not touch' '
31     git reset --merge HEAD^ &&
32     ! grep 4 file1 &&
33     grep 4 file2 &&
34     test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
35     test -z "$(git diff --cached)"
36 '
37
38 test_expect_success 'reset --merge is ok when switching back' '
39     git reset --merge second &&
40     grep 4 file1 &&
41     grep 4 file2 &&
42     test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
43     test -z "$(git diff --cached)"
44 '
45
46 # The next test will test the following:
47 #
48 #           working index HEAD target         working index HEAD
49 #           ----------------------------------------------------
50 # file1:     B       B     C    D     --merge  D       D     D
51 # file2:     C       D     D    D     --merge  C       D     D
52 test_expect_success 'reset --merge discards changes added to index (1)' '
53     git reset --hard second &&
54     cat file1 >file2 &&
55     echo "line 5" >> file1 &&
56     git add file1 &&
57     git reset --merge HEAD^ &&
58     ! grep 4 file1 &&
59     ! grep 5 file1 &&
60     grep 4 file2 &&
61     test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
62     test -z "$(git diff --cached)"
63 '
64
65 test_expect_success 'reset --merge is ok again when switching back (1)' '
66     git reset --hard initial &&
67     echo "line 5" >> file2 &&
68     git add file2 &&
69     git reset --merge second &&
70     ! grep 4 file2 &&
71     ! grep 5 file1 &&
72     grep 4 file1 &&
73     test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
74     test -z "$(git diff --cached)"
75 '
76
77 # The next test will test the following:
78 #
79 #           working index HEAD target         working index HEAD
80 #           ----------------------------------------------------
81 # file1:     C       C     C    D     --merge  D       D     D
82 # file2:     C       C     D    D     --merge  D       D     D
83 test_expect_success 'reset --merge discards changes added to index (2)' '
84     git reset --hard second &&
85     echo "line 4" >> file2 &&
86     git add file2 &&
87     git reset --merge HEAD^ &&
88     ! grep 4 file2 &&
89     test "$(git rev-parse HEAD)" = "$(git rev-parse initial)" &&
90     test -z "$(git diff)" &&
91     test -z "$(git diff --cached)"
92 '
93
94 test_expect_success 'reset --merge is ok again when switching back (2)' '
95     git reset --hard initial &&
96     git reset --merge second &&
97     ! grep 4 file2 &&
98     grep 4 file1 &&
99     test "$(git rev-parse HEAD)" = "$(git rev-parse second)" &&
100     test -z "$(git diff --cached)"
101 '
102
103 # The next test will test the following:
104 #
105 #           working index HEAD target         working index HEAD
106 #           ----------------------------------------------------
107 # file1:     A       B     B    C     --merge  (disallowed)
108 test_expect_success 'reset --merge fails with changes in file it touches' '
109     git reset --hard second &&
110     echo "line 5" >> file1 &&
111     test_tick &&
112     git commit -m "add line 5" file1 &&
113     sed -e "s/line 1/changed line 1/" <file1 >file3 &&
114     mv file3 file1 &&
115     test_must_fail git reset --merge HEAD^ 2>err.log &&
116     grep file1 err.log | grep "not uptodate"
117 '
118
119 test_expect_success 'setup 2 different branches' '
120     git reset --hard second &&
121     git branch branch1 &&
122     git branch branch2 &&
123     git checkout branch1 &&
124     echo "line 5 in branch1" >> file1 &&
125     test_tick &&
126     git commit -a -m "change in branch1" &&
127     git checkout branch2 &&
128     echo "line 5 in branch2" >> file1 &&
129     test_tick &&
130     git commit -a -m "change in branch2" &&
131     git tag third
132 '
133
134 # The next test will test the following:
135 #
136 #           working index HEAD target         working index HEAD
137 #           ----------------------------------------------------
138 # file1:     X       U     B    C     --merge  (disallowed)
139 test_expect_success '"reset --merge HEAD^" fails with pending merge' '
140     test_must_fail git merge branch1 &&
141     test_must_fail git reset --merge HEAD^ &&
142     test "$(git rev-parse HEAD)" = "$(git rev-parse third)" &&
143     test -n "$(git diff --cached)"
144 '
145
146 # The next test will test the following:
147 #
148 #           working index HEAD target         working index HEAD
149 #           ----------------------------------------------------
150 # file1:     X       U     B    B     --merge  (disallowed)
151 test_expect_success '"reset --merge HEAD" fails with pending merge' '
152     git reset --hard third &&
153     test_must_fail git merge branch1 &&
154     test_must_fail git reset --merge HEAD &&
155     test "$(git rev-parse HEAD)" = "$(git rev-parse third)" &&
156     test -n "$(git diff --cached)"
157 '
158
159 test_done