c68fc0a81e6e

Refactor to create a ReviewDatastore class.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Sun, 04 Oct 2009 14:15:30 -0400
parents 475c9de60d4f
children f74b4c5a26b1
branches/tags (none)
files review.py

Changes

--- a/review.py	Sun Oct 04 13:23:09 2009 -0400
+++ b/review.py	Sun Oct 04 14:15:30 2009 -0400
@@ -4,43 +4,81 @@
 '''
 
 import os
-from mercurial import cmdutil, hg
+from mercurial import cmdutil, hg, util
+
+
+class PreexistingDatastore(Exception):
+    """Raised when trying to initialize a datastore when one seems to exist."""
+    def __init__(self, committed):
+        super(PreexistingDatastore, self).__init__()
+        self.committed = committed
+    
+
+
+def _parse_hgrf(repo):
+    """Parse the .hgreview file and return the data inside."""
+    
+    data = {}
+    lines = [line for line in repo['tip']['.hgreview'] if line.strip()]
+    for line in lines:
+        label, _, path = [i.strip() for i in line.partition('=')]
+        if label == 'local':
+            data['lpath'] = path
+        elif label == 'remote':
+            data['rpath'] = path
+    
+    return data
+
 
+class ReviewDatastore(dict):
+    """The data store for all the reviews so far."""
+    
+    def __init__(self, ui, repo, lpath=None, rpath=None, create=False):
+        if not create:
+            data = _parse_hgrf(repo)
+            self.lpath = data['lpath']
+            self.rpath = data['rpath']
+        else:
+            if '.hgreview' in repo['tip']:
+                raise PreexistingDatastore(True)
+            if os.path.exists(os.path.join(repo.root, '.hgreview')):
+                raise PreexistingDatastore(False)
+            self.lpath = lpath or '.review'
+            self.rpath = rpath or ('../%s-review' % os.path.basename(repo.root))
+        
+        root = os.path.join(repo.root, self.lpath)
+        self.repo = hg.repository(ui, root, create)
+        
+        if create:
+            hgrpath = os.path.join(repo.root, '.hgreview')
+            with open(hgrpath, 'w') as hgrf:
+                hgrf.write('local = %s\n' % self.lpath)
+                hgrf.write('remote = %s\n' % self.rpath)
+            repo.add(['.hgreview'])
+        
 
 def review(ui, repo, *fnames, **opts):
     '''code review a changeset in the current repository
     '''
     if opts.pop('init'):
-        if '.hgreview' in repo['tip']:
-            ui.note('already initialized by someone else\n')
-            review_config = repo['tip']['.hgreview']
-        elif os.path.exists(os.path.join(repo.root, '.hgreview')):
-            ui.warn('the review data has already been initialized, but '
-                'is not recorded!\n'
-                'run "hg commit .hgreview -m\'initialized code review\'" '
-                'to record it permanently\n')
-        else:
-            ui.note('initializing the code review data store and config\n')
-            
-            lpath = opts.pop('local_path') or '.review'
-            dspath = os.path.join(repo.root, lpath)
-            rpath = opts.pop('remote_path')
-            if not rpath:
-                rpath = '../%s-review' % os.path.basename(repo.root)
-            
-            ui.note('creating the datastore\n')
-            hg.repository(cmdutil.remoteui(ui, opts), dspath, create=1)
-            
-            ui.note('creating the .hgreview file\n')
-            hgrpath = os.path.join(repo.root, '.hgreview')
-            with open(hgrpath, 'w') as hgrf:
-                hgrf.write('local = %s\n' % lpath)
-                hgrf.write('remote = %s\n' % rpath)
-            repo.add([hgrpath])
-            
+        ui.note('initializing the code review data store and config\n')
+        try:
+            datastore = ReviewDatastore(ui, repo, lpath=opts.pop('local_path'),
+                rpath=opts.pop('remote_path'), create=True)
             ui.status('the review data has been initialized\n'
                 'run "hg commit .hgreview -m\'initialized code review\'" '
                 'to record it permanently\n')
+            return
+        except PreexistingDatastore, e:
+            if e.committed:
+                ui.note('already initialized by someone else\n')
+            else:
+                raise util.Abort(
+                    'the review data has already been initialized, but '
+                    'is not recorded!\n'
+                    'run "hg commit .hgreview -m\'initialized code review\'" '
+                    'to record it permanently\n')
+        
 
 cmdtable = {
     'review': (review, [