review.py @ f74b4c5a26b1

Change a tiny bit of formatting.
author Steve Losh <steve@stevelosh.com>
date Sun, 04 Oct 2009 14:21:54 -0400
parents c68fc0a81e6e
children (none)
from __future__ import with_statement

'''A Mercurial extension for code reviewing changesets.
'''

import os
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'):
        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, [
        ('i', 'init', False, 'start code reviewing this repository'),
        ('', 'local-path', '', 'the local path to the code review data'),
        ('', 'remote-path', '', 'the remote path to code review data'),
    ],
    'hg review')
}