1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
|
#! /bin/sh
set -ex
BASE="$(dirname "$(cd $(dirname "$0") && pwd)")"
. "$BASE/t/test-lib.sh"
GIT_IMERGE="git-imerge"
TMP="$BASE/t/tmp/really-conflicted"
DESCRIPTION="git-imerge test repository with multiple conflicts"
# Set up a test repo with two branches, `c` and `d`, that have commits
# making incompatible changes to the same files `conflictN.txt` in the
# following locations:
#
# 0 5 9
# | | |
# 0 - ********** - c
# *0...6....
# *...1..2..
# *.........
# *.........
# 5 - *....3....
# *4........
# *.....5...
# 8 - *........7
# |
# d
init_test_repo "$TMP" "$DESCRIPTION"
cd "$TMP"
modify c.txt 0
modify d.txt 0
for i in $(seq 0 7)
do
modify conflict$i.txt "original version"
done
commit -m 'm⇒0'
git checkout -b c master --
modify c.txt 1
modify conflict0.txt "c version"
modify conflict4.txt "c version"
commit -m "c⇒1"
modify c.txt 2
commit -m "c⇒2"
modify c.txt 3
commit -m "c⇒3"
modify c.txt 4
modify conflict1.txt "c version"
commit -m "c⇒4"
modify c.txt 5
modify conflict3.txt "c version"
modify conflict6.txt "c version"
commit -m "c⇒5"
modify c.txt 6
modify conflict5.txt "c version"
commit -m "c⇒6"
modify c.txt 7
modify conflict2.txt "c version"
commit -m "c⇒7"
modify c.txt 8
commit -m "c⇒8"
modify c.txt 9
modify conflict7.txt "c version"
commit -m "c⇒9"
git checkout -b d master --
modify d.txt 1
modify conflict0.txt "d version"
modify conflict6.txt "d version"
commit -m "d⇒1"
modify d.txt 2
modify conflict1.txt "d version"
modify conflict2.txt "d version"
commit -m "d⇒2"
modify d.txt 3
commit -m "d⇒3"
modify d.txt 4
commit -m "d⇒4"
modify d.txt 5
modify conflict3.txt "d version"
commit -m "d⇒5"
modify d.txt 6
modify conflict4.txt "d version"
commit -m "d⇒6"
modify d.txt 7
modify conflict5.txt "d version"
commit -m "d⇒7"
modify d.txt 8
modify conflict7.txt "d version"
commit -m "d⇒8"
git checkout c
"$GIT_IMERGE" init --name=c-d d
"$GIT_IMERGE" diagram --commits --frontier
# We expect eight conflicts:
conflict_count=0
while true
do
"$GIT_IMERGE" continue --no-edit 2>&1 | tee autofill.out
if grep -q Traceback autofill.out
then
exit 1
fi
"$GIT_IMERGE" diagram --frontier
if ! grep -q "There was a conflict merging" autofill.out
then
break
fi
for i in $(seq 0 7)
do
if grep -q '====' conflict$i.txt
then
modify conflict$i.txt "merged version"
conflict_count=$(( conflict_count + 1 ))
fi
done
done
if test $conflict_count -ne 8
then
echo "Expected 8 conflicts but there were $conflict_count"
exit 1
fi
# Check the diagram output, which also checks which commits were done
# automatically, which were done manually, and which were skipped
# over. This test is a bit fragile to changes in the filling
# algorithm.
"$GIT_IMERGE" diagram --commits >diagram.out
{
cat <<'EOF'
0 5 9
| | |
0 - ********** - c
**?..*....
*.?.*..*..
*.?.......
*.?.......
5 - *....*....
**?.......
*.?...*...
8 - *........*
|
d
Key:
* = merge done manually
. = merge done automatically
# = conflict that is currently blocking progress
@ = merge was blocked but has been resolved
? = no merge recorded
EOF
} | diff -u - diagram.out || {
echo "diagram disagrees with expectations"
exit 1
}
EXPECTED_TREE=13e5a8955ab8f88dc7fec8278ee2622655c21d7f
GIT_EDITOR=cat "$GIT_IMERGE" simplify --goal=merge --branch=c-d-merge
check_tree c-d-merge $EXPECTED_TREE
"$GIT_IMERGE" simplify --goal=rebase --branch=c-d-rebase
check_tree c-d-rebase $EXPECTED_TREE
"$GIT_IMERGE" simplify --goal=rebase-with-history --branch=c-d-rebase-with-history
check_tree c-d-rebase-with-history $EXPECTED_TREE
"$GIT_IMERGE" simplify --goal=border --branch=c-d-border
check_tree c-d-border $EXPECTED_TREE
"$GIT_IMERGE" simplify --goal=border-with-history --branch=c-d-border-with-history
check_tree c-d-border-with-history $EXPECTED_TREE
"$GIT_IMERGE" simplify --goal=border-with-history2 --branch=c-d-border-with-history2
check_tree c-d-border-with-history2 $EXPECTED_TREE
"$GIT_IMERGE" remove
|