Never skip rebase
[stgit] / stgit / commands / common.py
index 1bc162f..ac53654 100644 (file)
@@ -120,7 +120,7 @@ def check_head_top_equal(crt_series):
 def check_conflicts():
     if git.get_conflicts():
         raise CmdException('Unsolved conflicts. Please fix the conflicts'
-                           ' then use "resolve <files>" or revert the'
+                           ' then use "git add --update <files>" or revert the'
                            ' changes with "status --reset".')
 
 def print_crt_patch(crt_series, branch = None):
@@ -301,9 +301,6 @@ def rebase(crt_series, target):
         # it might be that we use a custom rebase command with its own
         # target type
         tree_id = target
-    if tree_id == git.get_head():
-        out.info('Already at "%s", no need for rebasing.' % target)
-        return
     if target:
         out.start('Rebasing to "%s"' % target)
     else:
@@ -323,7 +320,7 @@ def post_rebase(crt_series, applied, nopush, merged):
 #
 def __end_descr(line):
     return re.match('---\s*$', line) or re.match('diff -', line) or \
-            re.match('Index: ', line)
+            re.match('Index: ', line) or re.match('--- \w', line)
 
 def __split_descr_diff(string):
     """Return the description and the diff from the given string
@@ -355,6 +352,7 @@ def __parse_description(descr):
 
     lasthdr = 0
     end = len(descr_lines)
+    descr_strip = 0
 
     # Parse the patch header
     for pos in range(0, end):
@@ -374,12 +372,16 @@ def __parse_description(descr):
         if subject:
             break
         # get the subject
-        subject = descr_lines[pos]
+        subject = descr_lines[pos][descr_strip:]
+        if re.match('commit [\da-f]{40}$', subject):
+            # 'git show' output, look for the real subject
+            subject = ''
+            descr_strip = 4
         lasthdr = pos + 1
 
     # get the body
     if lasthdr < end:
-        body = reduce(lambda x, y: x + '\n' + y, descr_lines[lasthdr:], '')
+        body = '\n' + '\n'.join(l[descr_strip:] for l in descr_lines[lasthdr:])
 
     return (subject + body, authname, authemail, authdate)
 
@@ -405,7 +407,8 @@ def parse_mail(msg):
         authname = authemail = None
 
     # '\n\t' can be found on multi-line headers
-    descr = __decode_header(msg['subject']).replace('\n\t', ' ')
+    descr = __decode_header(msg['subject'])
+    descr = re.sub('\n[ \t]*', ' ', descr)
     authdate = msg['date']
 
     # remove the '[*PATCH*]' expression in the subject
@@ -418,7 +421,8 @@ def parse_mail(msg):
     # the rest of the message
     msg_text = ''
     for part in msg.walk():
-        if part.get_content_type() == 'text/plain':
+        if part.get_content_type() in ['text/plain',
+                                       'application/octet-stream']:
             msg_text += part.get_payload(decode = True)
 
     rem_descr, diff = __split_descr_diff(msg_text)
@@ -462,7 +466,7 @@ def readonly_constant_property(f):
         return getattr(self, n)
     return property(new_f)
 
-def update_commit_data(cd, options, allow_edit = False):
+def update_commit_data(cd, options):
     """Return a new CommitData object updated according to the command line
     options."""
     # Set the commit message from commandline.
@@ -482,8 +486,9 @@ def update_commit_data(cd, options, allow_edit = False):
             add_sign_line(cd.message, sign_str,
                           cd.committer.name, cd.committer.email))
 
-    # Let user edit the commit message manually.
-    if allow_edit and not options.message:
+    # Let user edit the commit message manually, unless
+    # --save-template or --message was specified.
+    if not getattr(options, 'save_template', None) and not options.message:
         cd = cd.set_message(edit_string(cd.message, '.stgit-new.txt'))
 
     return cd