mergetool: Skip autoresolved paths

When mergetool is run without path limiters it loops
over each entry in 'git ls-files -u'.  This includes
autoresolved paths.

Teach mergetool to only merge files listed in 'rerere status'
when rerere is enabled.

There are some subtle but harmless changes in behavior.
We now call cd_to_toplevel when no paths are given.
We do this because 'rerere status' paths are always relative
to the root.  This is beneficial for the non-rerere use as
well in that mergetool now runs against all unmerged files
regardless of the current directory.

This also slightly tweaks the output when run without paths
to be more readable.

The old output:

Merging the files: foo
bar
baz

The new output:

Merging:
foo
bar
baz

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
David Aguilar
2010-08-17 02:22:46 -07:00
committed by Junio C Hamano
parent 3235b7053c
commit bb0a484e98
2 changed files with 57 additions and 17 deletions

View File

@ -264,17 +264,35 @@ merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo fa
last_status=0
rollup_status=0
rerere=false
files_to_merge() {
if test "$rerere" = true
then
git rerere status
else
git ls-files -u | sed -e 's/^[^ ]* //' | sort -u
fi
}
if test $# -eq 0 ; then
files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u)
cd_to_toplevel
if test -e "$GIT_DIR/MERGE_RR"
then
rerere=true
fi
files=$(files_to_merge)
if test -z "$files" ; then
echo "No files need merging"
exit 0
fi
echo Merging the files: "$files"
git ls-files -u |
sed -e 's/^[^ ]* //' |
sort -u |
printf "Merging:\n"
printf "$files\n"
files_to_merge |
while IFS= read i
do
if test $last_status -ne 0; then