[RFC] Merge strategy 'applyreject'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Any thoughts on something like the following?

I was talking with Jakub Narebski on #git today about using a
diff/apply pipeline as a merge strategy.

I was talking about implementing this within the merge-recur driver
as an alternative to invoking the RCS 'merge' program.  The idea
would be to take the current branch's file and try to apply the
diff of merge_base and the other branch to it.  If that has any
rejects then try the other direction (apply diff of merge_base and
current to other) and leave the user with whichever one resulted
in the smallest number of rejected lines.

But that's a little bit more work, this is a quick hack.  :-)  


-- >8 --
Create merge strategy 'applyreject'.

The applyreject merge strategy is a two head merge strategy which performs
the merge by obtaining the diff between the common base and the branch
being merged and applies it to the current branch using git-apply --reject.
Consequently any failures are written to .rej files, rather than using
the RCS <<<<<<< ======= >>>>>>> format.

Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx>
---
 .gitignore               |    1 +
 Makefile                 |    1 +
 git-merge-applyreject.sh |   26 ++++++++++++++++++++++++++
 git-merge.sh             |    2 +-
 4 files changed, 29 insertions(+), 1 deletions(-)

diff --git a/.gitignore b/.gitignore
index 0d608fe..0f43ece 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,7 @@ git-ls-tree
 git-mailinfo
 git-mailsplit
 git-merge
+git-merge-applyreject
 git-merge-base
 git-merge-index
 git-merge-tree
diff --git a/Makefile b/Makefile
index 7b3114f..a57dab5 100644
--- a/Makefile
+++ b/Makefile
@@ -161,6 +161,7 @@ SCRIPT_SH = \
 	git-tag.sh git-verify-tag.sh \
 	git-applymbox.sh git-applypatch.sh git-am.sh \
 	git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
+	git-merge-applyreject.sh \
 	git-merge-resolve.sh git-merge-ours.sh \
 	git-lost-found.sh git-quiltimport.sh
 
diff --git a/git-merge-applyreject.sh b/git-merge-applyreject.sh
new file mode 100755
index 0000000..e4c8703
--- /dev/null
+++ b/git-merge-applyreject.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+#
+# Simple merge strategy which produces reject files on failed merges.
+# Only handles two heads and one merge base, thus the command line
+# parameters must be:  base -- head1 head2
+
+base="$1"; shift; [ -z "$base" ] && exit 2
+while [ $# -gt 2 -a "X$1" != "X--" ]
+do
+	shift
+done
+if [ "X$1" = "X--" ]
+then
+	shift
+else
+	exit 2
+fi
+current="$1"; shift; [ -z "$current" ] && exit 2
+incoming="$1"; shift; [ -z "$incoming" ] && exit 2
+[ $# -gt 0 ] && exit 2
+
+git-read-tree --reset $current || exit 2
+git-update-index --refresh 2>/dev/null
+git-diff --binary -M $base $incoming \
+	| git-apply --index --reject --verbose
+[ $? = 0 ] || exit 1
diff --git a/git-merge.sh b/git-merge.sh
index d049e16..e39de0a 100755
--- a/git-merge.sh
+++ b/git-merge.sh
@@ -9,7 +9,7 @@ USAGE='[-n] [--no-commit] [--squash] [-s
 LF='
 '
 
-all_strategies='recursive recur octopus resolve stupid ours'
+all_strategies='recursive recur octopus resolve stupid ours applyreject'
 case "${GIT_USE_RECUR_FOR_RECURSIVE}" in
 '')
 	default_twohead_strategies=recursive ;;
-- 
1.4.2.gc52f

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]