Re-add the interactive merge
[stgit] / stgit / commands / common.py
index 2672dcf..7d9df02 100644 (file)
@@ -27,7 +27,7 @@ from stgit.out import *
 from stgit.run import *
 from stgit import stack, git, basedir
 from stgit.config import config, file_extensions
-
+from stgit.lib import stack as libstack
 
 # Command exception class
 class CmdException(StgException):
@@ -77,6 +77,14 @@ def git_id(crt_series, rev):
     """
     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:
@@ -103,7 +111,10 @@ def git_id(crt_series, 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():
@@ -114,11 +125,11 @@ 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 "repair" 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"'
@@ -134,27 +145,9 @@ def print_crt_patch(crt_series, branch = None):
     else:
         out.info('No patches applied')
 
-def resolved(filename, 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)
-
 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'))
+    git.resolved(conflicts, reset)
 
 def push_patches(crt_series, patches, check_merged = False):
     """Push multiple patches onto the stack. This function is shared
@@ -469,11 +462,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.
@@ -500,14 +493,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 '.'
@@ -520,12 +513,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)
@@ -548,3 +541,11 @@ class DirectoryGotoToplevel(DirectoryInWorktree):
     def setup(self):
         DirectoryInWorktree.setup(self)
         self.cd_to_topdir()
+
+class DirectoryHasRepositoryLib(_Directory):
+    """For commands that use the new infrastructure in stgit.lib.*."""
+    def __init__(self):
+        self.needs_current_series = False
+    def setup(self):
+        # This will throw an exception if we don't have a repository.
+        self.repository = libstack.Repository.default()