From: "David Kågedal" <davidk@lysator.liu.se>
To: kha@treskal.com, catalin.marinas@gmail.com
Cc: git@vger.kernel.org
Subject: [StGit PATCH] Add a --tree flag to stg push
Date: Mon, 18 May 2009 16:50:18 +0200 [thread overview]
Message-ID: <20090518144754.30487.84132.stgit@krank> (raw)
This flag makes the push simply restore the tree that the patch used
before, rather than doing any kind of merge.
---
This scratches a long-time itch for me. The typical use case is when
you want to break up a larg patch inte smaller ones. You back out the
orignal patch, apply a small set of changes from it and then push the
patch back again. But then you don't want to do a merge, with the
possibility of conflict. You simply want to restore to the tree that
the patch had before so you can see what's left to create cleaned-up
patches of. The command "stg push --tree" does just that.
The naming of flags and functions isn't very obvious, and suggestions
for improvements are welcome.
stgit/commands/push.py | 26 ++++++++++++-------
stgit/lib/transaction.py | 28 ++++++++++++++++++++
t/t1207-push-tree.sh | 64 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 108 insertions(+), 10 deletions(-)
create mode 100755 t/t1207-push-tree.sh
diff --git a/stgit/commands/push.py b/stgit/commands/push.py
index 0d25a65..8d4d3fc 100644
--- a/stgit/commands/push.py
+++ b/stgit/commands/push.py
@@ -43,7 +43,9 @@ options = [
opt('-n', '--number', type = 'int',
short = 'Push the specified number of patches'),
opt('--reverse', action = 'store_true',
- short = 'Push the patches in reverse order')
+ short = 'Push the patches in reverse order'),
+ opt('--tree', action = 'store_true',
+ short = 'Push the patch with the original tree')
] + argparse.keep_option() + argparse.merged_option()
directory = common.DirectoryHasRepositoryLib()
@@ -74,14 +76,18 @@ def func(parser, options, args):
if options.reverse:
patches.reverse()
- try:
- if options.merged:
- merged = set(trans.check_merged(patches))
- else:
- merged = set()
+ if options.tree:
for pn in patches:
- trans.push_patch(pn, iw, allow_interactive = True,
- already_merged = pn in merged)
- except transaction.TransactionHalted:
- pass
+ trans.push_tree(pn)
+ else:
+ try:
+ if options.merged:
+ merged = set(trans.check_merged(patches))
+ else:
+ merged = set()
+ for pn in patches:
+ trans.push_patch(pn, iw, allow_interactive = True,
+ already_merged = pn in merged)
+ except transaction.TransactionHalted:
+ pass
return trans.run(iw)
diff --git a/stgit/lib/transaction.py b/stgit/lib/transaction.py
index 4148ff3..1c21938 100644
--- a/stgit/lib/transaction.py
+++ b/stgit/lib/transaction.py
@@ -372,6 +372,34 @@ class StackTransaction(object):
# Update immediately.
update()
+ def push_tree(self, pn):
+ """Push the named patch without updating its tree."""
+ orig_cd = self.patches[pn].data
+ cd = orig_cd.set_committer(None)
+ oldparent = cd.parent
+ cd = cd.set_parent(self.top)
+
+ s = ''
+ if any(getattr(cd, a) != getattr(orig_cd, a) for a in
+ ['parent', 'tree', 'author', 'message']):
+ comm = self.__stack.repository.commit(cd)
+ self.head = comm
+ else:
+ comm = None
+ s = ' (unmodified)'
+ if cd.is_nochange():
+ s = ' (empty)'
+ out.info('Pushed %s%s' % (pn, s))
+
+ if comm:
+ self.patches[pn] = comm
+ if pn in self.hidden:
+ x = self.hidden
+ else:
+ x = self.unapplied
+ del x[x.index(pn)]
+ self.applied.append(pn)
+
def reorder_patches(self, applied, unapplied, hidden = None, iw = None):
"""Push and pop patches to attain the given ordering."""
if hidden is None:
diff --git a/t/t1207-push-tree.sh b/t/t1207-push-tree.sh
new file mode 100755
index 0000000..83f5cbf
--- /dev/null
+++ b/t/t1207-push-tree.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+#
+# Copyright (c) 2006 David Kågedal
+#
+
+test_description='Exercise pushing patches with --tree.'
+
+. ./test-lib.sh
+
+# don't need this repo, but better not drop it, see t1100
+#rm -rf .git
+
+# Need a repo to clone
+test_create_repo foo
+
+test_expect_success \
+ 'Create initial patches' '
+ (
+ cd foo &&
+ stg init &&
+ stg new A -m A &&
+ echo hello world > a &&
+ git add a &&
+ stg refresh
+ stg new B -m B &&
+ echo HELLO WORLD > a &&
+ stg refresh
+ )
+'
+
+test_expect_success \
+ 'Back up and create a partial patch' '
+ (
+ cd foo &&
+ stg pop &&
+ stg new C -m C &&
+ echo hello WORLD > a &&
+ stg refresh
+ )
+'
+
+test_expect_success \
+ 'Reapply patch B' '
+ (
+ cd foo &&
+ stg push --tree B
+ )
+'
+
+test_expect_success \
+ 'Compare results' '
+ (
+ cd foo &&
+ stg pop -a &&
+ stg push &&
+ test "$(echo $(cat a))" = "hello world" &&
+ stg push &&
+ test "$(echo $(cat a))" = "hello WORLD" &&
+ stg push &&
+ test "$(echo $(cat a))" = "HELLO WORLD"
+ )
+'
+
+test_done
next reply other threads:[~2009-05-18 15:16 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-18 14:50 David Kågedal [this message]
2009-05-19 7:25 ` [StGit PATCH] Add a --tree flag to stg push Karl Hasselström
2009-05-19 7:50 ` David Kågedal
2009-05-19 8:03 ` Karl Hasselström
2009-05-19 9:35 ` [StGit PATCH v2] Add a --set-tree " David Kågedal
2009-05-19 10:27 ` 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=20090518144754.30487.84132.stgit@krank \
--to=davidk@lysator.liu.se \
--cc=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).