* [ANNOUNCE] Stacked GIT 0.7
@ 2005-10-02 9:17 Catalin Marinas
2005-10-02 12:10 ` Ingo Molnar
0 siblings, 1 reply; 5+ messages in thread
From: Catalin Marinas @ 2005-10-02 9:17 UTC (permalink / raw)
To: GIT
Stacked GIT 0.7 release is available from http://www.procode.org/stgit/
StGIT is a Python application providing similar functionality to Quilt
(i.e. pushing/popping patches to/from a stack) on top of GIT. These
operations are performed using GIT commands and the patches are stored
as GIT commit objects, allowing easy merging of the StGIT patches into
other repositories using standard GIT functionality.
What's new in this release (the full ChangeLog is in the archive):
* Uses the renamed GIT commands (requires GIT >= 0.99.7)
* 'pick' command to cherry-pick a commit object as an StGIT patch
using a three-way merge. It also allows reverse-applying
* 'commit' command to permanently store the applied patches into
the repository
* 'push' can now fast-forward the patches if the base tree object
has not changed
* The configuration file supports the 'editor' field
* '--version' option for the 'mail' command to generate the e-mail
subject in the form '[PATCH version nr/total]'
* '--showpatch' option for 'refresh' to show the patch content
when editing the patch description
* '--branch' option for several commands to work on a given branch
instead of the current one without switching
* the 'pull' command was updated to follow the 'git pull' API
* '--base' option for 'import' to import a diff file on a
different base and perform a three-way merge with the HEAD
afterwards
* Support for the '.gitignore' file
* Several other optimisations
* Bug fixes
Many thanks to Paolo 'Blaisorblade' Giarrusso, Chuck Lever, Pierre
Ossman and Junio C Hamano for contributing patches to this release.
--
Catalin
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: [ANNOUNCE] Stacked GIT 0.7 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 0 siblings, 1 reply; 5+ messages in thread From: Ingo Molnar @ 2005-10-02 12:10 UTC (permalink / raw) To: Catalin Marinas; +Cc: GIT * Catalin Marinas <catalin.marinas@gmail.com> wrote: > Stacked GIT 0.7 release is available from > http://www.procode.org/stgit/ > > StGIT is a Python application providing similar functionality to Quilt > (i.e. pushing/popping patches to/from a stack) on top of GIT. These > operations are performed using GIT commands and the patches are stored > as GIT commit objects, allowing easy merging of the StGIT patches into > other repositories using standard GIT functionality. i'm wondering - have you (or anyone else) done performance comparisons of quilt vs. stgit, using the same stack of patches? One of the most important features of quilt (for me) is that it's very fast at popping/pushing through hundreds of patches. Ingo ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [ANNOUNCE] Stacked GIT 0.7 2005-10-02 12:10 ` Ingo Molnar @ 2005-10-02 19:33 ` Catalin Marinas 2005-10-03 13:56 ` Catalin Marinas 0 siblings, 1 reply; 5+ messages in thread From: Catalin Marinas @ 2005-10-02 19:33 UTC (permalink / raw) To: Ingo Molnar; +Cc: GIT On 02/10/05, Ingo Molnar <mingo@elte.hu> wrote: > i'm wondering - have you (or anyone else) done performance comparisons > of quilt vs. stgit, using the same stack of patches? One of the most > important features of quilt (for me) is that it's very fast at > popping/pushing through hundreds of patches. I've done some basic comparison and I must admit that Quilt is much faster than StGIT. Popping is done in O(1) and it is equivalent to a switch between two branches with 'git checkout' (can be less than 2 seconds with warm caches). Pushing without merging required (i.e. fast-forwarding) is the same as popping. What's time consuming is pushing when the base of the stack was changed and merging is required. If the base changes do not involve file removals/additions, a push operations takes ~1.5s per patch with warm caches. Most of the time is spent in "git-read-tree -m" (StGIT doesn't consume resources since it mainly calls GIT tools). If the base changes involve file removals/additions, it can take considerably longer since for each file GIT needs to call an external merger. This could be solved by providing a smarter git-merge-index to deal with file removals/additions but the time won't be shorter than ~1.5s per patch. An optimisation would be to keep the patches in diff format and apply them but this would mean losing the advantages of the three-way merging. Another issue is that git-apply doesn't support fuzzy patches, though I could emulate it using patch. But I'm not sure that's a good approach since I don't intend to re-write Quilt in Python. My hope is that git-read-tree will get faster :-). -- Catalin ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [ANNOUNCE] Stacked GIT 0.7 2005-10-02 19:33 ` Catalin Marinas @ 2005-10-03 13:56 ` Catalin Marinas 2005-10-03 14:44 ` Catalin Marinas 0 siblings, 1 reply; 5+ messages in thread From: Catalin Marinas @ 2005-10-03 13:56 UTC (permalink / raw) To: Ingo Molnar; +Cc: GIT On 02/10/05, Catalin Marinas <catalin.marinas@gmail.com> wrote: > An optimisation would be to keep the patches in diff format and apply > them but this would mean losing the advantages of the three-way > merging. 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). Since most of the patches, for routine updates of the base, don't generate conflicts, git-apply should work fine. I'll modify StGIT to use this method by default and fall back to the three-way merge in case it fails. This will also solve the problem with complex modifications of the base of the stack (i.e. file removals/additions) when there won't be any need to call the external index merger if git-apply succeeds. -- Catalin ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [ANNOUNCE] Stacked GIT 0.7 2005-10-03 13:56 ` Catalin Marinas @ 2005-10-03 14:44 ` Catalin Marinas 0 siblings, 0 replies; 5+ messages in thread From: Catalin Marinas @ 2005-10-03 14:44 UTC (permalink / raw) To: Ingo Molnar; +Cc: GIT 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2005-10-03 14:44 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 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 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).