]> git.ipfire.org Git - thirdparty/git.git/blame - t/t7110-reset-merge.sh
reset: add a few tests for "git reset --merge"
[thirdparty/git.git] / t / t7110-reset-merge.sh
CommitLineData
c9396690
CC
1#!/bin/sh
2#
3# Copyright (c) 2009 Christian Couder
4#
5
6test_description='Tests for "git reset --merge"'
7
8. ./test-lib.sh
9
10test_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
30test_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
38test_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
52test_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
65test_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
83test_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
94test_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)
108test_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
119test_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)
139test_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)
151test_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
159test_done