From: Catalin Marinas Date: Mon, 3 Oct 2005 14:35:40 +0000 (+0100) Subject: Optimise 'push' to use git-apply instead of git-read-tree X-Git-Tag: v0.7.1~1 X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/commitdiff_plain/b7c120dcc46defbf562523da11556b40d84c8d93 Optimise 'push' to use git-apply instead of git-read-tree With this patch, 'push' will use 'git-diff-tree | git-apply' first. If this operation fails, it will fall back to the three-way merge with git-read-tree. Signed-off-by: Catalin Marinas --- diff --git a/stgit/git.py b/stgit/git.py index 0fee709..56374bc 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -355,6 +355,15 @@ def commit(message, files = [], parents = [], allowempty = False, return commit_id +def apply_diff(rev1, rev2): + """Apply the diff between rev1 and rev2 onto the current + index. This function doesn't need to raise an exception since it + is only used for fast-pushing a patch. If this operation fails, + the pushing would fall back to the three-way merge. + """ + return os.system('git-diff-tree -p %s %s | git-apply --index 2> /dev/null' + % (rev1, rev2)) == 0 + def merge(base, head1, head2): """Perform a 3-way merge between base, head1 and head2 into the local tree diff --git a/stgit/stack.py b/stgit/stack.py index 03a0060..d411725 100644 --- a/stgit/stack.py +++ b/stgit/stack.py @@ -598,14 +598,17 @@ class Series: # The current patch is empty after merge. patch.set_bottom(head, backup = True) patch.set_top(head, backup = True) - # merge/refresh can fail but the patch needs to be pushed - try: - git.merge(bottom, head, top) - except git.GitException, ex: - print >> sys.stderr, \ - 'The merge failed during "push". ' \ - 'Use "refresh" after fixing the conflicts' - pass + + # Try the fast applying first. If this fails, fall back to the + # three-way merge + if not git.apply_diff(bottom, top): + # merge can fail but the patch needs to be pushed + try: + git.merge(bottom, head, top) + except git.GitException, ex: + print >> sys.stderr, \ + 'The merge failed during "push". ' \ + 'Use "refresh" after fixing the conflicts' append_string(self.__applied_file, name)