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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html