All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.