Add the 'sync' command
[stgit] / stgit / commands / common.py
index d986711..466f584 100644 (file)
@@ -109,7 +109,7 @@ def git_id(rev):
 def check_local_changes():
     if git.local_changes():
         raise CmdException, \
-              'local changes in the tree. Use "refresh" to commit them'
+              'local changes in the tree. Use "refresh" or "status --reset"'
 
 def check_head_top_equal():
     if not crt_series.head_top_equal():
@@ -120,7 +120,9 @@ def check_head_top_equal():
 
 def check_conflicts():
     if os.path.exists(os.path.join(basedir.get(), 'conflicts')):
-        raise CmdException, 'Unsolved conflicts. Please resolve them first'
+        raise CmdException, \
+              'Unsolved conflicts. Please resolve them first or\n' \
+              '  revert the changes with "status --reset"'
 
 def print_crt_patch(branch = None):
     if not branch:
@@ -214,7 +216,7 @@ def pop_patches(patches, keep = False):
 
         print 'done'
 
-def parse_patches(patch_args, patch_list):
+def parse_patches(patch_args, patch_list, boundary = 0, ordered = False):
     """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.
@@ -236,12 +238,26 @@ def parse_patches(patch_args, patch_list):
             if pair[0]:
                 first = patch_list.index(pair[0])
             else:
-                first = 0
+                first = -1
             # exclusive boundary
             if pair[1]:
                 last = patch_list.index(pair[1]) + 1
             else:
-                last = len(patch_list)
+                last = -1
+
+            # only cross the boundary if explicitly asked
+            if not boundary:
+                boundary = len(patch_list)
+            if first < 0:
+                if last <= boundary:
+                    first = 0
+                else:
+                    first = boundary
+            if last < 0:
+                if first < boundary:
+                    last = boundary
+                else:
+                    last = len(patch_list)
 
             if last > first:
                 pl = patch_list[first:last]
@@ -257,6 +273,9 @@ def parse_patches(patch_args, patch_list):
 
         patches += pl
 
+    if ordered:
+        patches = [p for p in patch_list if p in patches]
+
     return patches
 
 def name_email(address):
@@ -294,14 +313,15 @@ def patch_name_from_msg(msg):
     subject_line = msg[:30].lstrip().split('\n', 1)[0].lower()
     return re.sub('[\W]+', '-', subject_line).strip('-')
 
-def make_patch_name(msg, unacceptable, default_name = 'patch'):
+def make_patch_name(msg, unacceptable, default_name = 'patch',
+                    alternative = True):
     """Return a patch name generated from the given commit message,
     guaranteed to make unacceptable(name) be false. If the commit
     message is empty, base the name on default_name instead."""
     patchname = patch_name_from_msg(msg)
     if not patchname:
-        patchname = 'patch'
-    if unacceptable(patchname):
+        patchname = default_name
+    if alternative and unacceptable(patchname):
         suffix = 0
         while unacceptable('%s-%d' % (patchname, suffix)):
             suffix += 1