changeset 38:60691eefbf67

Moved initialization logic out of the constructors.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 06 Jan 2013 23:01:46 -0800
parents f710528f24b0
children 7ec7cf21840a
files wikked/__init__.py wikked/indexer.py wikked/scm.py wikked/wiki.py
diffstat 4 files changed, 54 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/wikked/__init__.py	Sun Jan 06 22:11:38 2013 -0800
+++ b/wikked/__init__.py	Sun Jan 06 23:01:46 2013 -0800
@@ -15,6 +15,7 @@
 # The main Wiki instance.
 from wiki import Wiki
 wiki = Wiki(root=app.config.get('WIKI_ROOT'), logger=app.logger)
+wiki.start()
 
 # Import views and user loader.
 import wikked.views
--- a/wikked/indexer.py	Sun Jan 06 22:11:38 2013 -0800
+++ b/wikked/indexer.py	Sun Jan 06 23:01:46 2013 -0800
@@ -14,6 +14,9 @@
         if logger is None:
             self.logger = logging.getLogger('wikked.index')
 
+    def open(self):
+        raise NotImplementedError()
+
     def update(self, pages):
         raise NotImplementedError()
 
@@ -24,11 +27,13 @@
 class WhooshWikiIndex(WikiIndex):
     def __init__(self, store_dir, logger=None):
         WikiIndex.__init__(self, store_dir, logger)
-        if not os.path.isdir(store_dir):
-            os.makedirs(store_dir)
-            self.ix = create_in(store_dir, self._getSchema())
+
+    def open(self):
+        if not os.path.isdir(self.store_dir):
+            os.makedirs(self.store_dir)
+            self.ix = create_in(self.store_dir, self._getSchema())
         else:
-            self.ix = open_dir(store_dir)
+            self.ix = open_dir(self.store_dir)
 
     def _getSchema(self):
         schema = Schema(
--- a/wikked/scm.py	Sun Jan 06 22:11:38 2013 -0800
+++ b/wikked/scm.py	Sun Jan 06 23:01:46 2013 -0800
@@ -24,6 +24,9 @@
         if logger is None:
             self.logger = logging.getLogger('wikked.scm')
 
+    def initRepo(self):
+        raise NotImplementedError()
+
     def getSpecialDirs(self):
         raise NotImplementedError()
 
@@ -66,17 +69,8 @@
 class MercurialSourceControl(SourceControl):
     def __init__(self, root, logger=None):
         SourceControl.__init__(self, root, logger)
+
         self.hg = 'hg'
-        if not os.path.isdir(os.path.join(root, '.hg')):
-            self._run('init', root, norepo=True)
-
-        ignore_path = os.path.join(root, '.hgignore')
-        if not os.path.isfile(ignore_path):
-            with open(ignore_path, 'w') as f:
-                f.write('.cache')
-            self._run('add', ignore_path)
-            self._run('commit', ignore_path, '-m', 'Created .hgignore.')
-
         self.log_style = os.path.join(os.path.dirname(__file__), 'resources', 'hg_log.style')
         self.actions = {
                 'A': ACTION_ADD,
@@ -84,6 +78,21 @@
                 'M': ACTION_EDIT
                 }
 
+    def initRepo(self):
+        # Make a Mercurial repo if there's none.
+        if not os.path.isdir(os.path.join(self.root, '.hg')):
+            self.logger.info("Creating Mercurial repository at: " + self.root)
+            self._run('init', self.root, norepo=True)
+
+        # Create a `.hgignore` file is there's none.
+        ignore_path = os.path.join(self.root, '.hgignore')
+        if not os.path.isfile(ignore_path):
+            self.logger.info("Creating `.hgignore` file.")
+            with open(ignore_path, 'w') as f:
+                f.write('.cache')
+            self._run('add', ignore_path)
+            self._run('commit', ignore_path, '-m', 'Created .hgignore.')
+
     def getSpecialDirs(self):
         specials = [ '.hg', '.hgignore', '.hgtags' ]
         return [ os.path.join(self.root, d) for d in specials ]
--- a/wikked/wiki.py	Sun Jan 06 22:11:38 2013 -0800
+++ b/wikked/wiki.py	Sun Jan 06 23:01:46 2013 -0800
@@ -14,6 +14,10 @@
 from auth import UserManager
 
 
+class InitializationError(Exception):
+    pass
+
+
 class FormatterNotFound(Exception):
     pass
 
@@ -247,16 +251,26 @@
             self.config.read(config_path)
 
         self.fs = FileSystem(root, slugify=Page.title_to_url)
-        self.scm = MercurialSourceControl(root, self.logger)
-        self.cache = None #Cache(os.path.join(root, '.cache'))
+        self.auth = UserManager(self.config, logger=self.logger)
         self.index = WhooshWikiIndex(os.path.join(root, '.index'), logger=self.logger)
-        self.auth = UserManager(self.config, logger=self.logger)
+        
+        scm_type = 'hg'
+        if self.config.has_option('wiki', 'scm'):
+            scm_type = self.config.get('wiki', 'scm')
+        if scm_type == 'hg':
+            self.scm = MercurialSourceControl(root, self.logger)
+        else:
+            raise InitializationError("No such source control: " + scm_type)
+
+        if (not self.config.has_option('wiki', 'cache') or
+                self.config.get('wiki', 'cache')):
+            self.cache = Cache(os.path.join(root, '.cache'))
 
         self.fs.excluded.append(config_path)
+        if self.scm is not None:
+            self.fs.excluded += self.scm.getSpecialDirs()
         if self.cache is not None:
             self.fs.excluded.append(self.cache.cache_dir)
-        if self.scm is not None:
-            self.fs.excluded += self.scm.getSpecialDirs()
         if self.index is not None:
             self.fs.excluded.append(self.index.store_dir)
 
@@ -266,6 +280,12 @@
                 }
         self.fs.page_extensions = list(set(itertools.chain(*self.formatters.itervalues())))
 
+    def start(self):
+        if self.scm is not None:
+            self.scm.initRepo()
+        if self.index is not None:
+            self.index.open()
+
     @property
     def root(self):
         return self.fs.root