summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/ext/vcs/vcs.py145
1 files changed, 84 insertions, 61 deletions
diff --git a/ranger/ext/vcs/vcs.py b/ranger/ext/vcs/vcs.py
index a0f4b5d7..5c456120 100644
--- a/ranger/ext/vcs/vcs.py
+++ b/ranger/ext/vcs/vcs.py
@@ -78,21 +78,14 @@ class Vcs(object):  # pylint: disable=too-many-instance-attributes
 
         self.root, self.repodir, self.repotype, self.links = self._find_root(self.path)
         self.is_root = True if self.obj.path == self.root else False
-
+        self.in_repodir = False
         self.rootvcs = None
-        self.rootinit = False
-        self.head = None
-        self.branch = None
-        self.updatetime = None
         self.track = False
-        self.in_repodir = False
-        self.status_subpaths = None
 
         if self.root:
             if self.is_root:
                 self.rootvcs = self
-                self.__class__ = getattr(getattr(ranger.ext.vcs, self.repotype),
-                                         self.REPOTYPES[self.repotype]['class'])
+                self.__class__ = globals()[self.REPOTYPES[self.repotype]['class'] + 'Root']
 
                 if not os.access(self.repodir, os.R_OK):
                     self.obj.vcsremotestatus = 'unknown'
@@ -106,7 +99,7 @@ class Vcs(object):  # pylint: disable=too-many-instance-attributes
                 if self.rootvcs.root is None:
                     return
                 self.rootvcs.links |= self.links
-                self.__class__ = self.rootvcs.__class__
+                self.__class__ = globals()[self.REPOTYPES[self.repotype]['class']]
                 self.track = self.rootvcs.track
 
                 if self.path == self.repodir or self.path.startswith(self.repodir + '/'):
@@ -160,6 +153,62 @@ class Vcs(object):  # pylint: disable=too-many-instance-attributes
 
         return (None, None, None, None)
 
+    def check(self):
+        """Check health"""
+        if not self.in_repodir \
+                and (not self.track or (not self.is_root and self._get_repotype(self.path)[0])):
+            self.__init__(self.obj)
+            return False
+        elif self.track and not os.path.exists(self.repodir):
+            self.rootvcs.update_tree(purge=True)  # pylint: disable=no-member
+            return False
+        return True
+
+    # Action interface
+
+    def action_add(self, filelist):
+        """Adds files to the index"""
+        raise NotImplementedError
+
+    def action_reset(self, filelist):
+        """Removes files from the index"""
+        raise NotImplementedError
+
+    # Data interface
+
+    def data_status_root(self):
+        """Returns status of self.root cheaply"""
+        raise NotImplementedError
+
+    def data_status_subpaths(self):
+        """Returns a dict indexed by subpaths not in sync with their status as values.
+           Paths are given relative to self.root"""
+        raise NotImplementedError
+
+    def data_status_remote(self):
+        """
+        Returns remote status of repository
+        One of ('sync', 'ahead', 'behind', 'diverged', 'none')
+        """
+        raise NotImplementedError
+
+    def data_branch(self):
+        """Returns the current named branch, if this makes sense for the backend. None otherwise"""
+        raise NotImplementedError
+
+    def data_info(self, rev=None):
+        """Returns info string about revision rev. None in special cases"""
+        raise NotImplementedError
+
+
+class VcsRoot(Vcs):  # pylint: disable=abstract-method
+    """Vcs root"""
+    rootinit = False
+    head = None
+    branch = None
+    updatetime = None
+    status_subpaths = None
+
     def _status_root(self):
         """Returns root status"""
         if self.status_subpaths is None:
@@ -264,17 +313,6 @@ class Vcs(object):  # pylint: disable=too-many-instance-attributes
         self.updatetime = time.time()
         return True
 
-    def check(self):
-        """Check health"""
-        if not self.in_repodir \
-                and (not self.track or (not self.is_root and self._get_repotype(self.path)[0])):
-            self.__init__(self.obj)
-            return False
-        elif self.track and not os.path.exists(self.repodir):
-            self.rootvcs.update_tree(purge=True)
-            return False
-        return True
-
     def check_outdated(self):
         """Check if root is outdated"""
         if self.updatetime is None:
@@ -322,42 +360,6 @@ class Vcs(object):  # pylint: disable=too-many-instance-attributes
                     return status
         return 'sync'
 
-    # Action interface
-
-    def action_add(self, filelist):
-        """Adds files to the index"""
-        raise NotImplementedError
-
-    def action_reset(self, filelist):
-        """Removes files from the index"""
-        raise NotImplementedError
-
-    # Data interface
-
-    def data_status_root(self):
-        """Returns status of self.root cheaply"""
-        raise NotImplementedError
-
-    def data_status_subpaths(self):
-        """Returns a dict indexed by subpaths not in sync with their status as values.
-           Paths are given relative to self.root"""
-        raise NotImplementedError
-
-    def data_status_remote(self):
-        """
-        Returns remote status of repository
-        One of ('sync', 'ahead', 'behind', 'diverged', 'none')
-        """
-        raise NotImplementedError
-
-    def data_branch(self):
-        """Returns the current named branch, if this makes sense for the backend. None otherwise"""
-        raise NotImplementedError
-
-    def data_info(self, rev=None):
-        """Returns info string about revision rev. None in special cases"""
-        raise NotImplementedError
-
 
 class VcsThread(threading.Thread):  # pylint: disable=too-many-instance-attributes
     """VCS thread"""
@@ -444,8 +446,29 @@ class VcsThread(threading.Thread):  # pylint: disable=too-many-instance-attribut
         self.queue.put(dirobj)
         self.awoken.set()
 
+
 # Backend imports
-import ranger.ext.vcs.bzr  # NOQA pylint: disable=wrong-import-position
-import ranger.ext.vcs.git  # NOQA pylint: disable=wrong-import-position
-import ranger.ext.vcs.hg  # NOQA pylint: disable=wrong-import-position
-import ranger.ext.vcs.svn  # NOQA pylint: disable=wrong-import-position
+from .bzr import Bzr  # NOQA pylint: disable=wrong-import-position
+from .git import Git  # NOQA pylint: disable=wrong-import-position
+from .hg import Hg  # NOQA pylint: disable=wrong-import-position
+from .svn import SVN  # NOQA pylint: disable=wrong-import-position
+
+
+class BzrRoot(VcsRoot, Bzr):
+    ''' Bzr root '''
+    pass
+
+
+class GitRoot(VcsRoot, Git):
+    ''' Git root '''
+    pass
+
+
+class HgRoot(VcsRoot, Hg):
+    ''' Hg root '''
+    pass
+
+
+class SVNRoot(VcsRoot, SVN):
+    ''' SVN root '''
+    pass