git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[StGit PATCH 2/5] stg coalesce: Support --file and --save-template

From
Karl Hasselström <kha@treskal.com>
Date
Dec 14, 2007, 06:32 UTC
Message-ID
<20071214063219.29290.24743.stgit@yoghurt>
In-Reply-To
<20071214062618.29290.70792.stgit@yoghurt>
--save-template was a bit tricky, because we want that
  * if we reached the stage where the message is needed without
    conflicts, the message should be written and no other side effects
    should occur; but
  * if we run into conflicts before reaching that point, behave just
    as if --save-template was not given.
This makes this script
  stg coalesce --save-template <patches>
  if template was saved:
    let user edit template
    if user didn't abort:
      stg coalesce --file <patches>
equivalent to
  stg coalesce <patches>

with the added benefit that the user can abort the whole thing without visible side effects.

Signed-off-by: Karl Hasselström <kha@treskal.com>
---
 stgit/commands/coalesce.py |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/stgit/commands/coalesce.py b/stgit/commands/coalesce.py
index e3e1629..2330231 100644
--- a/stgit/commands/coalesce.py
+++ b/stgit/commands/coalesce.py
@@ -34,11 +34,13 @@ you specify, you will have to resolve them manually just as if you had
 done a sequence of pushes and pops yourself."""
 
 directory = common.DirectoryHasRepositoryLib()
-options = [make_option('-n', '--name', help = 'name of coalesced patch'),
-           make_option('-m', '--message',
-                       help = 'commit message of coalesced patch')]
+options = [make_option('-n', '--name', help = 'name of coalesced patch')
+           ] + utils.make_message_options()
 
-def _coalesce_patches(trans, patches, msg):
+class SaveTemplateDone(Exception):
+    pass
+
+def _coalesce_patches(trans, patches, msg, save_template):
     cd = trans.patches[patches[0]].data
     cd = git.Commitdata(tree = cd.tree, parents = cd.parents)
     for pn in patches[1:]:
@@ -53,12 +55,16 @@ def _coalesce_patches(trans, patches, msg):
         msg = '\n\n'.join('%s\n\n%s' % (pn.ljust(70, '-'),
                                         trans.patches[pn].data.message)
                           for pn in patches)
-        msg = utils.edit_string(msg, '.stgit-coalesce.txt').strip()
+        if save_template:
+            save_template(msg)
+            raise SaveTemplateDone()
+        else:
+            msg = utils.edit_string(msg, '.stgit-coalesce.txt').strip()
     cd = cd.set_message(msg)
 
     return cd
 
-def _coalesce(stack, iw, name, msg, patches):
+def _coalesce(stack, iw, name, msg, save_template, patches):
 
     # If a name was supplied on the command line, make sure it's OK.
     def bad_name(pn):
@@ -75,8 +81,8 @@ def _coalesce(stack, iw, name, msg, patches):
 
     trans = transaction.StackTransaction(stack, 'stg coalesce')
     push_new_patch = bool(set(patches) & set(trans.applied))
-    new_commit_data = _coalesce_patches(trans, patches, msg)
     try:
+        new_commit_data = _coalesce_patches(trans, patches, msg, save_template)
         if new_commit_data:
             # We were able to construct the coalesced commit
             # automatically. So just delete its constituent patches.
@@ -88,7 +94,8 @@ def _coalesce(stack, iw, name, msg, patches):
             to_push = trans.pop_patches(lambda pn: pn in patches)
             for pn in patches:
                 trans.push_patch(pn, iw)
-            new_commit_data = _coalesce_patches(trans, patches, msg)
+            new_commit_data = _coalesce_patches(trans, patches, msg,
+                                                save_template)
             assert not trans.delete_patches(lambda pn: pn in patches)
         make_coalesced_patch(trans, new_commit_data)
 
@@ -98,6 +105,9 @@ def _coalesce(stack, iw, name, msg, patches):
             trans.push_patch(get_name(new_commit_data), iw)
         for pn in to_push:
             trans.push_patch(pn, iw)
+    except SaveTemplateDone:
+        trans.abort(iw)
+        return
     except transaction.TransactionHalted:
         pass
     trans.run(iw)
@@ -109,4 +119,4 @@ def func(parser, options, args):
     if len(patches) < 2:
         raise common.CmdException('Need at least two patches')
     _coalesce(stack, stack.repository.default_iw(),
-              options.name, options.message, patches)
+              options.name, options.message, options.save_template, patches)
Previous: Karl HasselströmNext: Karl Hasselström
Message 3 of 6 in “More experimental patches”
  1. 0/5 More experimental patchesKarl Hasselström, Dec 14, 2007
  2. 1/5 Expose transaction abort functionKarl Hasselström, Dec 14, 2007
  3. 2/5 stg coalesce: Support --file and --save-templateKarl Hasselström, Dec 14, 2007
  4. 3/5 Set exit code to 3 on merge conflictKarl Hasselström, Dec 14, 2007
  5. 4/5 Convert "stg commit" to new infrastructureKarl Hasselström, Dec 14, 2007
  6. 5/5 Make "stg commit" fancierKarl Hasselström, Dec 14, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.