summaryrefslogtreecommitdiff
path: root/git-resolve-script
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-08-24 04:08:59 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-08-24 04:08:59 (GMT)
commit9585e406224b97b24b46131005b809a6612a3eac (patch)
tree47b47d3fae26e51f2b1d04fd9e898f5a0546da02 /git-resolve-script
parent2a29da7c6d6103c4719c71f6cce88e853260912c (diff)
downloadgit-9585e406224b97b24b46131005b809a6612a3eac.zip
git-9585e406224b97b24b46131005b809a6612a3eac.tar.gz
git-9585e406224b97b24b46131005b809a6612a3eac.tar.bz2
Try to find the optimum merge base while resolving.
The merge-base command acquires a new option, '--all', that causes it to output all the common ancestor candidates. The "git resolve" command then uses it to pick the optimum merge base by picking the one that results in the smallest number of nontrivial merges. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-resolve-script')
-rwxr-xr-xgit-resolve-script36
1 files changed, 35 insertions, 1 deletions
diff --git a/git-resolve-script b/git-resolve-script
index 50d5f83..7c0e3d8 100755
--- a/git-resolve-script
+++ b/git-resolve-script
@@ -49,7 +49,41 @@ if [ "$common" == "$head" ]; then
dropheads
exit 0
fi
-echo "Trying to merge $merge into $head"
+
+# Find an optimum merge base if there are more than one candidates.
+LF='
+'
+common=$(git-merge-base -a $head $merge)
+case "$common" in
+?*"$LF"?*)
+ echo "Trying to find the optimum merge base."
+ G=.tmp-index$$
+ best=
+ best_cnt=-1
+ for c in $common
+ do
+ rm -f $G
+ GIT_INDEX_FILE=$G git-read-tree -m $c $head $merge \
+ 2>/dev/null || continue
+ # Count the paths that are unmerged.
+ cnt=`GIT_INDEX_FILE=$G git-ls-files --unmerged | wc -l`
+ if test $best_cnt -le 0 -o $cnt -le $best_cnt
+ then
+ best=$c
+ best_cnt=$cnt
+ if test "$best_cnt" -eq 0
+ then
+ # Cannot do any better than all trivial merge.
+ break
+ fi
+ fi
+ done
+ rm -f $G
+ common="$best"
+esac
+
+echo "Trying to merge $merge into $head using $common."
+git-update-cache --refresh 2>/dev/null
git-read-tree -u -m $common $head $merge || exit 1
result_tree=$(git-write-tree 2> /dev/null)
if [ $? -ne 0 ]; then