Add the --update option to pick
authorCatalin Marinas <catalin.marinas@gmail.com>
Wed, 24 May 2006 21:03:40 +0000 (22:03 +0100)
committerCatalin Marinas <catalin.marinas@gmail.com>
Wed, 24 May 2006 21:03:40 +0000 (22:03 +0100)
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 <catalin.marinas@gmail.com>
stgit/commands/pick.py
stgit/git.py

index e932cf0..3ff6269 100644 (file)
@@ -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 = \
index 716609c..05d851d 100644 (file)
@@ -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