From: Catalin Marinas Date: Wed, 24 May 2006 21:03:40 +0000 (+0100) Subject: Add the --update option to pick X-Git-Tag: v0.14.3~488 X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/commitdiff_plain/d0bfda1a1a21cb1f4ef661051199f98fd4869752 Add the --update option to pick This option updates the current patch with changes from the picked commit or patch. This option is useful when work is done on a temporary patch but the changes need to be folded back into existing patches. Note that three-way merging is not supported with this option (I'm not sure it is even needed). Signed-off-by: Catalin Marinas --- diff --git a/stgit/commands/pick.py b/stgit/commands/pick.py index e932cf0..3ff6269 100644 --- a/stgit/commands/pick.py +++ b/stgit/commands/pick.py @@ -39,6 +39,9 @@ options = [make_option('-n', '--name', action = 'store_true'), make_option('--fold', help = 'fold the commit object into the current patch', + action = 'store_true'), + make_option('--update', + help = 'like fold but only update the current patch files', action = 'store_true')] @@ -54,7 +57,7 @@ def func(parser, options, args): commit_str = args[0] - if options.fold: + if options.fold or options.update: if not crt_series.get_current(): raise CmdException, 'No patches applied' else: @@ -85,6 +88,18 @@ def func(parser, options, args): git.merge(bottom, git.get_head(), top) print 'done' + elif options.update: + rev1 = git_id('//bottom') + rev2 = git_id('//top') + files = git.barefiles(rev1, rev2).split('\n') + + print 'Updating with commit %s...' % commit_id, + sys.stdout.flush() + + if not git.apply_diff(bottom, top, files = files): + raise CmdException, 'Patch updating failed' + + print 'done' else: message = commit.get_log() author_name, author_email, author_date = \ diff --git a/stgit/git.py b/stgit/git.py index 716609c..05d851d 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -119,6 +119,13 @@ def _input(cmd, file_desc): if p.wait(): raise GitException, '%s failed' % str(cmd) +def _input_str(cmd, string): + p = popen2.Popen3(cmd, True) + p.tochild.write(string) + p.tochild.close() + if p.wait(): + raise GitException, '%s failed' % str(cmd) + def _output(cmd): p=popen2.Popen3(cmd, True) output = p.fromchild.read() @@ -460,7 +467,7 @@ def commit(message, files = None, parents = None, allowempty = False, return commit_id -def apply_diff(rev1, rev2, check_index = True): +def apply_diff(rev1, rev2, check_index = True, files = None): """Apply the diff between rev1 and rev2 onto the current index. This function doesn't need to raise an exception since it is only used for fast-pushing a patch. If this operation fails, @@ -470,10 +477,18 @@ def apply_diff(rev1, rev2, check_index = True): index_opt = '--index' else: index_opt = '' - cmd = 'git-diff-tree -p %s %s | git-apply %s 2> /dev/null' \ - % (rev1, rev2, index_opt) - return os.system(cmd) == 0 + if not files: + files = [] + + diff_str = diff(files, rev1, rev2) + if diff_str: + try: + _input_str('git-apply %s' % index_opt, diff_str) + except GitException: + return False + + return True def merge(base, head1, head2): """Perform a 3-way merge between base, head1 and head2 into the