Refactoring: pass more than one file to resolved()
[stgit] / stgit / commands / common.py
index 652039f..a0ec90e 100644 (file)
@@ -28,8 +28,6 @@ from stgit.run import *
 from stgit import stack, git, basedir
 from stgit.config import config, file_extensions
 
-crt_series = None
-
 
 # Command exception class
 class CmdException(StgException):
@@ -74,11 +72,19 @@ def parse_rev(rev):
     # No, we can't parse that.
     raise RevParseException
 
-def git_id(rev):
+def git_id(crt_series, rev):
     """Return the GIT id
     """
     if not rev:
         return None
+
+    # try a GIT revision first
+    try:
+        return git.rev_parse(rev + '^{commit}')
+    except git.GitException:
+        pass
+
+    # try an StGIT patch name
     try:
         patch, branch, patch_id = parse_rev(rev)
         if branch == None:
@@ -105,27 +111,30 @@ def git_id(rev):
             return series.get_base()
     except RevParseException:
         pass
-    return git.rev_parse(rev + '^{commit}')
+    except stack.StackException:
+        pass
+
+    raise CmdException, 'Unknown patch or revision: %s' % rev
 
 def check_local_changes():
     if git.local_changes():
         raise CmdException, \
               'local changes in the tree. Use "refresh" or "status --reset"'
 
-def check_head_top_equal():
+def check_head_top_equal(crt_series):
     if not crt_series.head_top_equal():
         raise CmdException(
 """HEAD and top are not the same. This can happen if you
-   modify a branch with git. The "assimilate" command can
-   fix this situation.""")
+   modify a branch with git. "stg repair --help" explains
+   more about what to do next.""")
 
 def check_conflicts():
-    if os.path.exists(os.path.join(basedir.get(), 'conflicts')):
+    if git.get_conflicts():
         raise CmdException, \
               'Unsolved conflicts. Please resolve them first or\n' \
               '  revert the changes with "status --reset"'
 
-def print_crt_patch(branch = None):
+def print_crt_patch(crt_series, branch = None):
     if not branch:
         patch = crt_series.get_current()
     else:
@@ -136,29 +145,20 @@ def print_crt_patch(branch = None):
     else:
         out.info('No patches applied')
 
-def resolved(filename, reset = None):
+def resolved(filenames, reset = None):
     if reset:
-        reset_file = filename + file_extensions()[reset]
-        if os.path.isfile(reset_file):
-            if os.path.isfile(filename):
-                os.remove(filename)
-            os.rename(reset_file, filename)
-
-    git.update_cache([filename], force = True)
-
-    for ext in file_extensions().values():
-        fn = filename + ext
-        if os.path.isfile(fn):
-            os.remove(fn)
+        stage = {'ancestor': 1, 'current': 2, 'patched': 3}[reset]
+        Run('git', 'checkout-index', '--no-create', '--stage=%d' % stage,
+            '--stdin', '-z').input_nulterm(filenames).no_output()
+    git.add(filenames)
+    for filename in filenames:
+        os.utime(filename, None) # update the access and modificatied times
 
 def resolved_all(reset = None):
     conflicts = git.get_conflicts()
-    if conflicts:
-        for filename in conflicts:
-            resolved(filename, reset)
-        os.remove(os.path.join(basedir.get(), 'conflicts'))
+    resolved(conflicts, reset)
 
-def push_patches(patches, check_merged = False):
+def push_patches(crt_series, patches, check_merged = False):
     """Push multiple patches onto the stack. This function is shared
     between the push and pull commands
     """
@@ -197,7 +197,7 @@ def push_patches(patches, check_merged = False):
             else:
                 out.done()
 
-def pop_patches(patches, keep = False):
+def pop_patches(crt_series, 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.
     """
@@ -319,7 +319,7 @@ def address_or_alias(addr_str):
                  for addr in addr_str.split(',')]
     return ', '.join([addr for addr in addr_list if addr])
 
-def prepare_rebase():
+def prepare_rebase(crt_series):
     # pop all patches
     applied = crt_series.get_applied()
     if len(applied) > 0:
@@ -328,9 +328,9 @@ def prepare_rebase():
         out.done()
     return applied
 
-def rebase(target):
+def rebase(crt_series, target):
     try:
-        tree_id = git_id(target)
+        tree_id = git_id(crt_series, target)
     except:
         # it might be that we use a custom rebase command with its own
         # target type
@@ -345,12 +345,12 @@ def rebase(target):
     git.rebase(tree_id = tree_id)
     out.done()
 
-def post_rebase(applied, nopush, merged):
+def post_rebase(crt_series, applied, nopush, merged):
     # memorize that we rebased to here
     crt_series._set_field('orig-base', git.get_head())
     # push the patches back
     if not nopush:
-        push_patches(applied, merged)
+        push_patches(crt_series, applied, merged)
 
 #
 # Patch description/e-mail/diff parsing
@@ -471,11 +471,11 @@ def parse_mail(msg):
 
     return (descr, authname, authemail, authdate, diff)
 
-def parse_patch(fobj):
-    """Parse the input file and return (description, authname,
+def parse_patch(text):
+    """Parse the input text and return (description, authname,
     authemail, authdate, diff)
     """
-    descr, diff = __split_descr_diff(fobj.read())
+    descr, diff = __split_descr_diff(text)
     descr, authname, authemail, authdate = __parse_description(descr)
 
     # we don't yet have an agreed place for the creation date.
@@ -502,14 +502,14 @@ class _Directory(object):
     @readonly_constant_property
     def git_dir(self):
         try:
-            return Run('git-rev-parse', '--git-dir'
+            return Run('git', 'rev-parse', '--git-dir'
                        ).discard_stderr().output_one_line()
         except RunException:
             raise DirectoryException('No git repository found')
     @readonly_constant_property
     def __topdir_path(self):
         try:
-            lines = Run('git-rev-parse', '--show-cdup'
+            lines = Run('git', 'rev-parse', '--show-cdup'
                         ).discard_stderr().output_lines()
             if len(lines) == 0:
                 return '.'
@@ -522,12 +522,12 @@ class _Directory(object):
     @readonly_constant_property
     def is_inside_git_dir(self):
         return { 'true': True, 'false': False
-                 }[Run('git-rev-parse', '--is-inside-git-dir'
+                 }[Run('git', 'rev-parse', '--is-inside-git-dir'
                        ).output_one_line()]
     @readonly_constant_property
     def is_inside_worktree(self):
         return { 'true': True, 'false': False
-                 }[Run('git-rev-parse', '--is-inside-work-tree'
+                 }[Run('git', 'rev-parse', '--is-inside-work-tree'
                        ).output_one_line()]
     def cd_to_topdir(self):
         os.chdir(self.__topdir_path)