git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Catalin Marinas <catalin.marinas@gmail.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: GIT <git@vger.kernel.org>
Subject: Re: [ANNOUNCE] Stacked GIT 0.7
Date: Mon, 03 Oct 2005 15:44:12 +0100	[thread overview]
Message-ID: <tnxpsqmwthf.fsf@arm.com> (raw)
In-Reply-To: <b0943d9e0510030656l4535bec7u@mail.gmail.com> (Catalin Marinas's message of "Mon, 3 Oct 2005 14:56:39 +0100")

Catalin Marinas <catalin.marinas@gmail.com> wrote:
> After some tests, it looks like 'git-diff-tree -p ... | git-apply
> --index' is about 3 times faster than 'git-read-tree -m' (in the best
> case for git-read-tree with minor modifications of the base). It now
> takes ~0.5s to push a single patch (compared to ~1.5s).

And that's the patch for whoever wants to try. I will also add it to
the repository tonight:


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 <catalin.marinas@gmail.com>
---

 stgit/git.py   |    9 +++++++++
 stgit/stack.py |   19 +++++++++++--------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/stgit/git.py b/stgit/git.py
--- a/stgit/git.py
+++ b/stgit/git.py
@@ -355,6 +355,15 @@ def commit(message, files = [], parents 
 
     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
--- 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)
 


-- 
Catalin

      reply	other threads:[~2005-10-03 14:44 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-10-02  9:17 [ANNOUNCE] Stacked GIT 0.7 Catalin Marinas
2005-10-02 12:10 ` Ingo Molnar
2005-10-02 19:33   ` Catalin Marinas
2005-10-03 13:56     ` Catalin Marinas
2005-10-03 14:44       ` Catalin Marinas [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tnxpsqmwthf.fsf@arm.com \
    --to=catalin.marinas@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=mingo@elte.hu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).