3 test_description
='check tg index-merge-one-file works correctly'
9 version1
="$(printf '%s\n' one two three | git hash-object -w -t blob --stdin)" || die
10 version2
="$(printf '%s\n' alpha beta gamma | git hash-object -w -t blob --stdin)" || die
11 version3
="$(printf '%s\n' setup check | git hash-object -w -t blob --stdin)" || die
19 tg_exec_path
="$(tg --exec-path)" && [ -n "$tg_exec_path" ] || die
20 tg_imof
="$tg_exec_path/tg--index-merge-one-file"
21 [ -f "$tg_imof" ] && [ -x "$tg_imof" ] || die
23 write_script run-index-merge-one-file
<<EOT || die
25 "$tg_imof" \$USE_STRATEGY "\$@"
28 # $1, $2, $3 => "<n>" in $version<n> for hash of base (1), ours (2), theirs (3) stages
29 # $4 file name to use for all three
32 [ "$1$2$3" = "000" ] ||
34 [ -z "$1" ] ||
[ "$1" = "0" ] ||
35 eval printf \''100644 %s 1\011%s\n'\' "\"\$version$1\"" '"$4"' #'
36 [ -z "$2" ] ||
[ "$2" = "0" ] ||
37 eval printf \''100644 %s 2\011%s\n'\' "\"\$version$2\"" '"$4"' #'
38 [ -z "$1" ] ||
[ "$3" = "0" ] ||
39 eval printf \''100644 %s 3\011%s\n'\' "\"\$version$3\"" '"$4"' #'
40 } | git update-index
--index-info
45 # 1, 2 or 3 is $version<n> hash at stage 0
46 # -1 is 2 or more stage >0 entries but no stage 0 entries
47 # $2 expected file name for all entries
53 while read mode
hash stage name junk
&& [ -n "$name" ]; do
55 [ "$name" = "$2" ] || badname
=1
56 [ "$mode" = "100644" ] || badmode
=1
57 [ "$stage" != "0" ] || sawstage0
="${hash:-1}"
59 $(git ls-files --full-name -s :/)
61 [ -z "$badname" ] || say_color error
"# found wrong name in index"
62 [ -z "$badmode" ] || say_color error
"# found wrong (not 100644) mode in index"
64 if [ "$1" = "0" ]; then
65 if [ $cnt -gt 0 ]; then
67 say_color error
"# expected no index entries, found $cnt"
69 elif [ "$1" = "-1" ]; then
70 if [ $cnt -lt 2 ]; then
72 say_color error
"# expected at least 2 index entries, found $cnt"
74 if [ -n "$sawstage0" ]; then
76 say_color error
"# expected only conflict index stages but found stage 0"
79 eval check
="\"\$version$1\""
80 if [ $cnt -ne 1 ]; then
82 say_color error
"# expected exactly one index entry, found $cnt"
83 elif [ -z "$sawstage0" ]; then
85 say_color error
"# expected exactly one stage 0 index entry"
86 elif [ "$check" != "$sawstage0" ]; then
88 say_color error
"# expected stage 0 hash $check but found $sawstage0"
91 [ -z "$isbad" ] || git ls-files
--full-name --abbrev -s |
sed 's/^/# /'
96 if [ "$1" = "3" ]; then
107 'r') strat
="--remove";;
108 't') strat
="--theirs";;
109 'm') strat
="--merge";;
113 sane_unset USE_STRATEGY
114 [ -z "$strat" ] || USE_STRATEGY
="$strat" && export USE_STRATEGY
115 rm -f ".toolran" ".git/index-save"
116 cp -f ".git/index" ".git/index-save"
117 #ucnt="$(( $(git ls-files --unmerged --full-name --abbrev :/ | wc -l) ))" || :
118 git merge-index
"$PWD/run-index-merge-one-file" -a ||
:
121 GIT_INDEX_FILE
=".git/index-save" && export GIT_INDEX_FILE
&&
122 ucnt
="$(( $(git ls-files --unmerged --full-name --abbrev :/ | wc -l) ))" ||
: &&
126 say_color error
"git merge-index did not run our tool"
131 test_expect_success
'setup' '
132 prepare_test 1 2 3 test &&
133 git ls-files --full-name --abbrev -s >lsfiles &&
134 test_cmp lsfiles check
137 while read base ours theirs strategy tgresult gresult
; do
138 test_expect_success
"b=$base o=$ours t=$theirs s=$strategy r=$tgresult .topdeps" '
139 prepare_test "$base" "$ours" "$theirs" ".topdeps" &&
140 run_index_merge "$strategy" &&
141 check_table "$tgresult" ".topdeps"
143 test_expect_success
"b=$base o=$ours t=$theirs s=$strategy r=$tgresult .topmsg" '
144 prepare_test "$base" "$ours" "$theirs" ".topmsg" &&
145 run_index_merge "$strategy" &&
146 check_table "$tgresult" ".topmsg"
148 test_expect_success
"b=$base o=$ours t=$theirs s=$strategy r=$gresult testfile" '
149 prepare_test "$base" "$ours" "$theirs" "testfile" &&
150 run_index_merge "$strategy" &&
151 check_table "$gresult" "testfile"
154 # BASE OURS THEIRS STRATEGY TGRESULT GRESULT
155 # where BASE, OURS, THEIRS can be 0 (none), 1 (version1) or 2 (version2)
156 # STRATEGY is 'r' (remove), 't' (theirs), 'o' (ours) or 'm' (merge)
157 # RESULT is 0, 1, 2 or 3 (conflicted)