merge-combination-util.sh
73 lines
| 2.4 KiB
| application/x-sh
|
BashLexer
r46892 | # genmerges is the workhorse of the test-merge-combination-*.t tests. | |||
r46891 | ||||
# Given: | ||||
# - a `range` function describing the possible values for file a | ||||
# - a `isgood` function to filter out uninteresting combination | ||||
# - a `createfile` function to actually write the values for file a on the | ||||
# filesystem | ||||
# | ||||
# it print a series of lines that look like: abcd C: output of -T {files} | ||||
# describing the file a at respectively the base, p2, p1, merge | ||||
# revision. "C" indicates that hg merge had conflicts. | ||||
genmerges () { | ||||
(LC_ALL=C type range | grep -q 'function') || (echo >&2 "missing function: range") | ||||
(LC_ALL=C type isgood | grep -q 'function') || (echo >&2 "missing function: isgood") | ||||
(LC_ALL=C type createfile | grep -q 'function') || (echo >&2 "missing function: createfile") | ||||
for base in `range` -; do | ||||
for r1 in `range $base` -; do | ||||
for r2 in `range $base $r1` -; do | ||||
for m in `range $base $r1 $r2` -; do | ||||
line="$base$r1$r2$m" | ||||
isgood $line || continue | ||||
hg init repo | ||||
cd repo | ||||
make_commit () { | ||||
v=$1; msg=$2; file=$3; | ||||
if [ $v != - ]; then | ||||
createfile $v | ||||
else | ||||
if [ -f a ] | ||||
then rm a | ||||
else touch $file | ||||
fi | ||||
fi | ||||
hg commit -q -Am $msg || exit 123 | ||||
} | ||||
echo foo > foo | ||||
make_commit $base base b | ||||
make_commit $r1 r1 c | ||||
hg up -r 0 -q | ||||
make_commit $r2 r2 d | ||||
hg merge -q -r 1 > ../output 2>&1 | ||||
if [ $? -ne 0 ]; then rm -f *.orig; hg resolve -m --all -q; fi | ||||
if [ -s ../output ]; then conflicts=" C"; else conflicts=" "; fi | ||||
make_commit $m m e | ||||
if [ $m = $r1 ] && [ $m = $r2 ] | ||||
then expected= | ||||
elif [ $m = $r1 ] | ||||
then if [ $base = $r2 ] | ||||
then expected= | ||||
else expected=a | ||||
fi | ||||
elif [ $m = $r2 ] | ||||
then if [ $base = $r1 ] | ||||
then expected= | ||||
else expected=a | ||||
fi | ||||
else expected=a | ||||
fi | ||||
got=`hg log -r 3 --template '{files}\n' | tr -d 'e '` | ||||
if [ "$got" = "$expected" ] | ||||
then echo "$line$conflicts: agree on \"$got\"" | ||||
else echo "$line$conflicts: hg said \"$got\", expected \"$expected\"" | ||||
fi | ||||
cd ../ | ||||
rm -rf repo | ||||
done | ||||
done | ||||
done | ||||
done | ||||
} | ||||