From: "Karl Hasselström" <kha@treskal.com>
To: Catalin Marinas <catalin.marinas@gmail.com>
Cc: git@vger.kernel.org, Jakub Narebski <jnareb@gmail.com>
Subject: [StGit PATCH 2/2] Implement "stg refresh --edit" again
Date: Fri, 04 Jul 2008 08:40:36 +0200 [thread overview]
Message-ID: <20080704064036.9637.52951.stgit@yoghurt> (raw)
In-Reply-To: <20080704063755.9637.23750.stgit@yoghurt>
The -e/--edit flag to "stg refresh" was dropped between v0.13 and
v0.14, causing severe user dissatisfaction. This patch restores it,
along with -m/--message, -f/--file, --sign, --ack, --author,
--authname, --authemail, and --authdate.
I omitted the --committer options on purpose; I think they are a
mistake. Falsifying the committer info is not a common operation, and
if one wishes to do it for some reason, one can always set the
GIT_COMMITTER_* environment variables.
Signed-off-by: Karl Hasselström <kha@treskal.com>
---
stgit/commands/coalesce.py | 2 +-
stgit/commands/edit.py | 3 ++-
stgit/commands/new.py | 3 ++-
stgit/commands/refresh.py | 44 +++++++++++++++++++++++++++++++++-----------
stgit/utils.py | 18 ++++++++++++------
5 files changed, 50 insertions(+), 20 deletions(-)
diff --git a/stgit/commands/coalesce.py b/stgit/commands/coalesce.py
index 1a34934..f3954ce 100644
--- a/stgit/commands/coalesce.py
+++ b/stgit/commands/coalesce.py
@@ -35,7 +35,7 @@ done a sequence of pushes and pops yourself."""
directory = common.DirectoryHasRepositoryLib()
options = [make_option('-n', '--name', help = 'name of coalesced patch')
- ] + utils.make_message_options()
+ ] + utils.make_message_options(save_template = True)
class SaveTemplateDone(Exception):
pass
diff --git a/stgit/commands/edit.py b/stgit/commands/edit.py
index a9e8991..a83ec9c 100644
--- a/stgit/commands/edit.py
+++ b/stgit/commands/edit.py
@@ -60,7 +60,8 @@ options = [make_option('-d', '--diff',
action = 'store_true'),
make_option('-e', '--edit', action = 'store_true',
help = 'invoke interactive editor'),
- ] + (utils.make_sign_options() + utils.make_message_options()
+ ] + (utils.make_sign_options()
+ + utils.make_message_options(save_template = True)
+ utils.make_author_committer_options()
+ utils.make_diff_opts_option())
diff --git a/stgit/commands/new.py b/stgit/commands/new.py
index c4ee4e1..f468ab0 100644
--- a/stgit/commands/new.py
+++ b/stgit/commands/new.py
@@ -38,7 +38,8 @@ line of the commit message."""
directory = common.DirectoryHasRepositoryLib()
options = (utils.make_author_committer_options()
- + utils.make_message_options() + utils.make_sign_options())
+ + utils.make_message_options(save_template = True)
+ + utils.make_sign_options())
def func(parser, options, args):
"""Create a new patch."""
diff --git a/stgit/commands/refresh.py b/stgit/commands/refresh.py
index 7afc55e..37cb559 100644
--- a/stgit/commands/refresh.py
+++ b/stgit/commands/refresh.py
@@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from optparse import make_option
from stgit.commands import common
-from stgit.lib import git, transaction
+from stgit.lib import git, transaction, edit
from stgit import utils
help = 'generate a new commit for the current patch'
@@ -53,7 +53,11 @@ options = [make_option('-u', '--update', action = 'store_true',
help = ('only include changes from the index, not'
' from the work tree')),
make_option('-p', '--patch',
- help = 'refresh PATCH instead of the topmost patch')]
+ help = 'refresh PATCH instead of the topmost patch'),
+ make_option('-e', '--edit', action = 'store_true',
+ help = 'invoke an editor for the patch description')
+ ] + (utils.make_message_options(save_template = False)
+ + utils.make_sign_options() + utils.make_author_options())
def get_patch(stack, given_patch):
"""Get the name of the patch we are to refresh."""
@@ -116,9 +120,12 @@ def make_temp_patch(stack, patch_name, paths, temp_index):
return trans.run(stack.repository.default_iw,
print_current_patch = False), temp_name
-def absorb_applied(trans, iw, patch_name, temp_name):
+def absorb_applied(trans, iw, patch_name, temp_name, edit_fun):
"""Absorb the temp patch (C{temp_name}) into the given patch
- (C{patch_name}), which must be applied.
+ (C{patch_name}), which must be applied. If the absorption
+ succeeds, call C{edit_fun} on the resulting
+ L{CommitData<stgit.lib.git.CommitData>} before committing it and
+ commit the return value.
@return: C{True} if we managed to absorb the temp patch, C{False}
if we had to leave it for the user to deal with."""
@@ -136,7 +143,7 @@ def absorb_applied(trans, iw, patch_name, temp_name):
temp_cd = trans.patches[temp_name].data
assert trans.patches[patch_name] == temp_cd.parent
trans.patches[patch_name] = trans.stack.repository.commit(
- trans.patches[patch_name].data.set_tree(temp_cd.tree))
+ edit_fun(trans.patches[patch_name].data.set_tree(temp_cd.tree)))
popped = trans.delete_patches(lambda pn: pn == temp_name, quiet = True)
assert not popped # the temp patch was topmost
temp_absorbed = True
@@ -148,9 +155,12 @@ def absorb_applied(trans, iw, patch_name, temp_name):
pass
return temp_absorbed
-def absorb_unapplied(trans, iw, patch_name, temp_name):
+def absorb_unapplied(trans, iw, patch_name, temp_name, edit_fun):
"""Absorb the temp patch (C{temp_name}) into the given patch
- (C{patch_name}), which must be unapplied.
+ (C{patch_name}), which must be unapplied. If the absorption
+ succeeds, call C{edit_fun} on the resulting
+ L{CommitData<stgit.lib.git.CommitData>} before committing it and
+ commit the return value.
@param iw: Not used.
@return: C{True} if we managed to absorb the temp patch, C{False}
@@ -174,7 +184,7 @@ def absorb_unapplied(trans, iw, patch_name, temp_name):
# It worked. Refresh the patch with the new tree, and delete
# the temp patch.
trans.patches[patch_name] = trans.stack.repository.commit(
- patch_cd.set_tree(new_tree))
+ edit_fun(patch_cd.set_tree(new_tree)))
popped = trans.delete_patches(lambda pn: pn == temp_name, quiet = True)
assert not popped # the temp patch was not applied
return True
@@ -183,13 +193,13 @@ def absorb_unapplied(trans, iw, patch_name, temp_name):
# leave the temp patch for the user.
return False
-def absorb(stack, patch_name, temp_name):
+def absorb(stack, patch_name, temp_name, edit_fun):
"""Absorb the temp patch into the target patch."""
trans = transaction.StackTransaction(stack, 'refresh')
iw = stack.repository.default_iw
f = { True: absorb_applied, False: absorb_unapplied
}[patch_name in trans.applied]
- if f(trans, iw, patch_name, temp_name):
+ if f(trans, iw, patch_name, temp_name, edit_fun):
def info_msg(): pass
else:
def info_msg():
@@ -223,4 +233,16 @@ def func(parser, options, args):
stack, patch_name, paths, temp_index = path_limiting)
if retval != utils.STGIT_SUCCESS:
return retval
- return absorb(stack, patch_name, temp_name)
+ def edit_fun(cd):
+ cd, failed_diff = edit.auto_edit_patch(
+ stack.repository, cd, msg = options.message, contains_diff = False,
+ author = options.author, committer = lambda p: p,
+ sign_str = options.sign_str)
+ assert not failed_diff
+ if options.edit:
+ cd, failed_diff = edit.interactive_edit_patch(
+ stack.repository, cd, edit_diff = False,
+ diff_flags = [], replacement_diff = None)
+ assert not failed_diff
+ return cd
+ return absorb(stack, patch_name, temp_name, edit_fun)
diff --git a/stgit/utils.py b/stgit/utils.py
index 2983ea8..c40e666 100644
--- a/stgit/utils.py
+++ b/stgit/utils.py
@@ -264,13 +264,13 @@ def add_sign_line(desc, sign_str, name, email):
desc = desc + '\n'
return '%s\n%s\n' % (desc, sign_str)
-def make_message_options():
+def make_message_options(save_template):
def no_dup(parser):
if parser.values.message != None:
raise optparse.OptionValueError(
'Cannot give more than one --message or --file')
def no_combine(parser):
- if (parser.values.message != None
+ if (save_template and parser.values.message != None
and parser.values.save_template != None):
raise optparse.OptionValueError(
'Cannot give both --message/--file and --save-template')
@@ -299,15 +299,18 @@ def make_message_options():
parser.values.save_template = w
no_combine(parser)
m = optparse.make_option
- return [m('-m', '--message', action = 'callback', callback = msg_callback,
+ opts = [m('-m', '--message', action = 'callback', callback = msg_callback,
dest = 'message', type = 'string',
help = 'use MESSAGE instead of invoking the editor'),
m('-f', '--file', action = 'callback', callback = file_callback,
dest = 'message', type = 'string', metavar = 'FILE',
- help = 'use FILE instead of invoking the editor'),
+ help = 'use FILE instead of invoking the editor')]
+ if save_template:
+ opts.append(
m('--save-template', action = 'callback', callback = templ_callback,
metavar = 'FILE', dest = 'save_template', type = 'string',
- help = 'save the message template to FILE and exit')]
+ help = 'save the message template to FILE and exit'))
+ return opts
def make_diff_opts_option():
def diff_opts_callback(option, opt_str, value, parser):
@@ -368,8 +371,11 @@ def make_person_options(person, short):
callback_args = (f,), help = 'set the %s %s' % (person, f))
for f in ['name', 'email', 'date']])
+def make_author_options():
+ return make_person_options('author', 'auth')
+
def make_author_committer_options():
- return (make_person_options('author', 'auth')
+ return (make_author_options()
+ make_person_options('committer', 'comm'))
# Exit codes.
next prev parent reply other threads:[~2008-07-04 6:42 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-04 6:40 [StGit PATCH 0/2] stg refresh -e/--edit Karl Hasselström
2008-07-04 6:40 ` [StGit PATCH 1/2] Refactor stgit.commands.edit Karl Hasselström
2008-07-04 6:40 ` Karl Hasselström [this message]
2008-07-04 7:32 ` [StGit PATCH 2/2] Implement "stg refresh --edit" again Jakub Narebski
2008-07-07 20:56 ` Catalin Marinas
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=20080704064036.9637.52951.stgit@yoghurt \
--to=kha@treskal.com \
--cc=catalin.marinas@gmail.com \
--cc=git@vger.kernel.org \
--cc=jnareb@gmail.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.