--- 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, [