Add patch history support
[stgit] / stgit / commands / common.py
index 836884c..bf8481e 100644 (file)
@@ -98,6 +98,8 @@ def git_id(rev):
                 return series.get_patch(patch).get_old_top()
             elif patch_id == 'bottom.old':
                 return series.get_patch(patch).get_old_bottom()
+            elif patch_id == 'log':
+                return series.get_patch(patch).get_log()
         if patch == 'base' and patch_id == None:
             return read_string(series.get_base_file())
     except RevParseException:
@@ -194,7 +196,7 @@ def push_patches(patches, check_merged = False):
             else:
                 print 'done'
 
-def pop_patches(patches):
+def pop_patches(patches, keep = False):
     """Pop the patches in the list from the stack. It is assumed that
     the patches are listed in the stack reverse order.
     """
@@ -205,10 +207,55 @@ def pop_patches(patches):
         print 'Popping "%s" - "%s" patches...' % (patches[0], p),
     sys.stdout.flush()
 
-    crt_series.pop_patch(p)
+    crt_series.pop_patch(p, keep)
 
     print 'done'
 
+def parse_patches(patch_args, patch_list):
+    """Parse patch_args list for patch names in patch_list and return
+    a list. The names can be individual patches and/or in the
+    patch1..patch2 format.
+    """
+    patches = []
+
+    for name in patch_args:
+        pair = name.split('..')
+        for p in pair:
+            if p and not p in patch_list:
+                raise CmdException, 'Unknown patch name: %s' % p
+
+        if len(pair) == 1:
+            # single patch name
+            pl = pair
+        elif len(pair) == 2:
+            # patch range [p1]..[p2]
+            # inclusive boundary
+            if pair[0]:
+                first = patch_list.index(pair[0])
+            else:
+                first = 0
+            # exclusive boundary
+            if pair[1]:
+                last = patch_list.index(pair[1]) + 1
+            else:
+                last = len(patch_list)
+
+            if last > first:
+                pl = patch_list[first:last]
+            else:
+                pl = patch_list[(last - 1):(first + 1)]
+                pl.reverse()
+        else:
+            raise CmdException, 'Malformed patch name: %s' % name
+
+        for p in pl:
+            if p in patches:
+                raise CmdException, 'Duplicate patch name: %s' % p
+
+        patches += pl
+
+    return patches
+
 def name_email(address):
     """Return a tuple consisting of the name and email parsed from a
     standard 'name <email>' or 'email (name)' string
@@ -241,5 +288,5 @@ def make_patch_name(msg):
     if not msg:
         return None
 
-    subject_line = msg.lstrip().split('\n', 1)[0]
+    subject_line = msg.lstrip().split('\n', 1)[0].lower()
     return re.sub('[\W]+', '-', subject_line).strip('-')