review/extension_ui.py @ 1596046f752c

Add the author count to the review command.
author Steve Losh <steve@stevelosh.com>
date Sun, 04 Oct 2009 18:57:18 -0400
parents cdd63ba4a8f8
children e92ab6fb652e
'''The review extension's UI.'''

import messages
from api import *
from mercurial import util

def review(ui, repo, *fnames, **opts):
    '''code review a changeset in the current repository
    '''
    if opts.pop('init'):
        ui.note(messages.INIT_START)
        try:
            ReviewDatastore(ui, repo, lpath=opts.pop('local_path'),
                rpath=opts.pop('remote_path'), create=True)
            ui.status(messages.INIT_SUCCESS)
            return
        except PreexistingDatastore, e:
            if e.committed:
                ui.note(messages.INIT_EXISTS_COMMITTED)
            else:
                raise util.Abort(messages.INIT_EXISTS_UNCOMMITTED)
            return
    elif opts.pop('comment'):
        rd = ReviewDatastore(ui, repo)
        message = opts.pop('message')
        
        if not message:
            raise util.Abort(messages.COMMENT_REQUIRES_MESSAGE)
        
        rd.add_comment(message=message)
        return
    
    # No other options matched, so we're at the basic review command.
    rev = opts.pop('rev')
    rd = ReviewDatastore(ui, repo)
    cset = repo[rev]
    rcset = rd[rev]
    
    author_count = len(set(comment.author for comment in rcset.comments))
    
    ui.write('comments:  %d comments from %d authors\n' % (
        len(rcset.comments), author_count))
    ui.write('signoffs:  %d signoffs\n' % len(rcset.signoffs))


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'),
        ('c', 'comment', False, 'add a comment'),
        ('m', 'message', '', 'use <text> as the comment or signoff message'),
        ('r', 'rev', '.', 'the revision to review'),
    ],
    'hg review')
}