# HG changeset patch # User Steve Losh # Date 1254680130 14400 # Node ID c68fc0a81e6ef18c6ee8cd7aca227915a9c0a47f # Parent 475c9de60d4f905a828e65d2eb80db8569b3be42 Refactor to create a ReviewDatastore class. diff -r 475c9de60d4f -r c68fc0a81e6e review.py --- 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, [