From: Gustav HÃ¥llberg Date: Mon, 24 May 2010 18:19:55 +0000 (+0200) Subject: edit: Allow setting git tree of a patch X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/commitdiff_plain/53055a5601af63a41f68ad68214b8ba4775d4238?hp=5fd79c5f5aa2ea962162260e88f274983cb1e032 edit: Allow setting git tree of a patch Also fix capitalization in edit's short description. Signed-off-by: Gustav HÃ¥llberg --- diff --git a/stgit/commands/edit.py b/stgit/commands/edit.py index f3f731f..79335d0 100644 --- a/stgit/commands/edit.py +++ b/stgit/commands/edit.py @@ -24,7 +24,7 @@ from stgit.commands import common from stgit.lib import git as gitlib, transaction, edit from stgit.out import * -help = 'edit a patch description or diff' +help = 'Edit a patch description or diff' kind = 'patch' usage = ['[options] [--] []'] description = """ @@ -52,18 +52,28 @@ invoked even if such command-line options are given.) If the patch diff is edited but does not apply, no changes are made to the patch at all. The edited patch is saved to a file which you can -feed to "stg edit --file", once you have made sure it does apply.""" +feed to "stg edit --file", once you have made sure it does apply. + +With --set-tree you set the git tree of the patch to the specified +TREE-ISH without changing the tree of any other patches. When used on +the top patch, the index and work tree will be updated to match the +tree. This low-level option is primarily meant to be used by tools +built on top of StGit, such as the Emacs mode. See also the --set-tree +flag of stg push.""" args = [argparse.applied_patches, argparse.unapplied_patches, argparse.hidden_patches] -options = [ - opt('-d', '--diff', action = 'store_true', - short = 'Edit the patch diff'), - opt('-e', '--edit', action = 'store_true', - short = 'Invoke interactive editor'), - ] + (argparse.sign_options() + - argparse.message_options(save_template = True) + - argparse.author_options() + argparse.diff_opts_option()) +options = ( + [ opt('-d', '--diff', action = 'store_true', + short = 'Edit the patch diff'), + opt('-e', '--edit', action = 'store_true', + short = 'Invoke interactive editor') ] + + argparse.sign_options() + + argparse.message_options(save_template = True) + + argparse.author_options() + argparse.diff_opts_option() + + [ opt('-t', '--set-tree', action = 'store', + metavar = 'TREE-ISH', + short = 'Set the git tree of the patch to TREE-ISH') ]) directory = common.DirectoryHasRepositoryLib() @@ -86,6 +96,10 @@ def func(parser, options, args): cd = orig_cd = stack.patches.get(patchname).commit.data + if options.set_tree: + cd = cd.set_tree(stack.repository.rev_parse( + options.set_tree, discard_stderr = True, object_type = 'tree')) + cd, failed_diff = edit.auto_edit_patch( stack.repository, cd, msg = options.message, contains_diff = True, author = options.author, committer = lambda p: p, @@ -128,7 +142,10 @@ def func(parser, options, args): trans.patches[patchname] = stack.repository.commit(cd) try: for pn in popped: - trans.push_patch(pn, iw, allow_interactive = True) + if options.set_tree: + trans.push_tree(pn) + else: + trans.push_patch(pn, iw, allow_interactive = True) except transaction.TransactionHalted: pass try: diff --git a/t/t3300-edit.sh b/t/t3300-edit.sh index 7003a27..09a2f25 100755 --- a/t/t3300-edit.sh +++ b/t/t3300-edit.sh @@ -212,4 +212,19 @@ test_expect_failure 'Fail to set invalid author date' ' test "$(date HEAD)" = "2013-01-28 22:30:00 -0300" ' +test_expect_success 'Set patch tree' ' + p2tree=$(git log -1 --pretty=format:%T $(stg id p2)) && + p4commit=$(stg id p4) && + stg edit --set-tree $p4commit && + test $(git write-tree) = $(git rev-parse ${p4commit}^{tree}) && + grep "^333zz$" foo && + stg pop && + stg edit --set-tree $p2tree p2 && + stg push --set-tree && + test $(git write-tree) = $p2tree && + grep "^333$" foo && + stg edit --set-tree $p2tree p1 && + test "$(echo $(stg series --empty --all))" = "+ p1 0> p2 - p3 ! p4" +' + test_done