From: Catalin Marinas <catalin.marinas@gmail.com>
To: git@vger.kernel.org
Cc: "Karl Hasselström" <kha@treskal.com>
Subject: [StGit PATCH] Convert "sink" to the new infrastructure
Date: Fri, 12 Sep 2008 23:01:27 +0100 [thread overview]
Message-ID: <20080912215613.10270.20599.stgit@localhost.localdomain> (raw)
This patch converts the sink command to use stgit.lib. The behaviour
is also changed slightly so that it only allows to sink a set of
patches if there are applied once, otherwise it is equivalent to a
push. The new implementation also allows to bring a patch forward
towards the top based on the --to argument.
Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com>
---
Before the final patch, I need to write a better test script.
I'm not sure about the conflict resolution. In this implementation, if
a conflict happens, the transaction is aborted. In case we allow
conflicts, I have to dig further on how to implement it with the new
transaction mechanism (I think "delete" does this).
An additional point - the transaction object supports functions like
pop_patches and push_patch. Should we change them for consistency and
simplicity? I.e., apart from current pop_patches with predicate add
functions that support popping a list or a single patch. The same goes
for push_patch.
stgit/commands/sink.py | 79 ++++++++++++++++++++++++++++++------------------
1 files changed, 49 insertions(+), 30 deletions(-)
diff --git a/stgit/commands/sink.py b/stgit/commands/sink.py
index d8f79b4..cb94f99 100644
--- a/stgit/commands/sink.py
+++ b/stgit/commands/sink.py
@@ -16,13 +16,10 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
-import sys, os
-from optparse import OptionParser, make_option
-
-from stgit.commands.common import *
-from stgit.utils import *
-from stgit import stack, git
+from optparse import make_option
+from stgit.commands import common
+from stgit.lib import transaction
help = 'send patches deeper down the stack'
usage = """%prog [-t <target patch>] [-n] [<patches>]
@@ -32,7 +29,7 @@ push the specified <patches> (the current patch by default), and
then push back into place the formerly-applied patches (unless -n
is also given)."""
-directory = DirectoryGotoToplevel()
+directory = common.DirectoryHasRepositoryLib()
options = [make_option('-n', '--nopush',
help = 'do not push the patches back after sinking',
action = 'store_true'),
@@ -42,33 +39,55 @@ options = [make_option('-n', '--nopush',
def func(parser, options, args):
"""Sink patches down the stack.
"""
+ stack = directory.repository.current_stack
- check_local_changes()
- check_conflicts()
- check_head_top_equal(crt_series)
-
- oldapplied = crt_series.get_applied()
- unapplied = crt_series.get_unapplied()
- all = unapplied + oldapplied
-
- if options.to and not options.to in oldapplied:
- raise CmdException('Cannot sink below %s, since it is not applied'
- % options.to)
+ if not stack.patchorder.applied:
+ raise common.CmdException('No patches applied')
+ if options.to and not options.to in stack.patchorder.applied:
+ raise common.CmdException('Cannot sink below %s since it is not applied'
+ % options.to)
if len(args) > 0:
- patches = parse_patches(args, all)
+ patches = common.parse_patches(args, stack.patchorder.all)
else:
- current = crt_series.get_current()
- if not current:
- raise CmdException('No patch applied')
- patches = [current]
+ # current patch
+ patches = stack.patchorder.applied[-1:]
+
+ if not patches:
+ raise common.CmdException('No patches to sink')
+ if options.to and options.to in patches:
+ raise common.CmdException('Cannot have a sinked patch as target')
+
+ trans = transaction.StackTransaction(stack, 'sink')
+
+ # pop any patches to be sinked in case they are applied
+ to_push = trans.pop_patches(lambda pn: pn in patches)
+
+ if options.to:
+ if options.to in to_push:
+ # this is the case where sinking actually brings some
+ # patches forward
+ for p in to_push:
+ if p == options.to:
+ del to_push[:to_push.index(p)]
+ break
+ trans.push_patch(p)
+ else:
+ # target patch below patches to be sinked
+ to_pop = trans.applied[trans.applied.index(options.to):]
+ to_push = to_pop + to_push
+ trans.pop_patches(lambda pn: pn in to_pop)
+ else:
+ # pop all the remaining patches
+ to_push = trans.applied + to_push
+ trans.pop_patches(lambda pn: True)
- if oldapplied:
- crt_series.pop_patch(options.to or oldapplied[0])
- push_patches(crt_series, patches)
+ # push the sinked patches
+ for p in patches:
+ trans.push_patch(p)
if not options.nopush:
- newapplied = crt_series.get_applied()
- def not_reapplied_yet(p):
- return not p in newapplied
- push_patches(crt_series, filter(not_reapplied_yet, oldapplied))
+ for p in to_push:
+ trans.push_patch(p)
+
+ trans.run()
next reply other threads:[~2008-09-12 22:02 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-12 22:01 Catalin Marinas [this message]
2008-09-14 8:51 ` [StGit PATCH] Convert "sink" to the new infrastructure Karl Hasselström
2008-09-14 21:19 ` Catalin Marinas
2008-09-15 7:57 ` Karl Hasselström
2008-09-15 16:44 ` Catalin Marinas
2008-09-16 7:40 ` Karl Hasselström
2008-09-16 14:59 ` Catalin Marinas
2008-09-16 19:36 ` Karl Hasselström
2008-09-17 11:55 ` Catalin Marinas
2008-09-17 13:04 ` Karl Hasselström
2008-09-17 13:09 ` Karl Hasselström
2008-09-17 16:01 ` Catalin Marinas
2008-09-18 7:10 ` Karl Hasselström
2008-09-18 11:24 ` Catalin Marinas
2008-09-17 16:09 ` Catalin Marinas
2008-09-18 7:24 ` Karl Hasselström
2008-09-18 11:31 ` Catalin Marinas
2008-09-18 15:47 ` Karl Hasselström
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=20080912215613.10270.20599.stgit@localhost.localdomain \
--to=catalin.marinas@gmail.com \
--cc=git@vger.kernel.org \
--cc=kha@treskal.com \
/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).