review/extension_ui.py @ 12aeab05829a

Wrap the test output in a more elegant way.
author Steve Losh <steve@stevelosh.com>
date Sun, 04 Oct 2009 22:14:29 -0400
parents e91ac244e5ad
children 7e437c5261bb
'''The review extension's UI.'''

import messages
from api import *
from mercurial import util
from mercurial.node import short

def _init_command(ui, repo, **opts):
    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

def _comment_command(ui, repo, **opts):
    rd = ReviewDatastore(ui, repo)
    rcset = rd[opts.pop('rev')]
    message = opts.pop('message')
    
    if not message:
        raise util.Abort(messages.COMMENT_REQUIRES_MESSAGE)
    
    rcset.add_comment(message=message)
    return

def _signoff_command(ui, repo, **opts):
    rd = ReviewDatastore(ui, repo)
    rcset = rd[opts.pop('rev')]
    message = opts.pop('message')
    
    if not message:
        raise util.Abort(messages.SIGNOFF_REQUIRES_MESSAGE)
    
    yes, no = opts.pop('yes'), opts.pop('no')
    if yes and no:
        raise util.Abort(messages.SIGNOFF_OPINION_CONFLICT)
    opinion = 'yes' if yes else ('no' if no else '')
    
    try:
        rcset.add_signoff(message=message, opinion=opinion,
            force=opts.pop('force'))
    except SignoffExists:
        raise util.Abort(messages.SIGNOFF_EXISTS)
    
    return

def _review_command(ui, repo, **opts):
    rev = opts.pop('rev')
    rd = ReviewDatastore(ui, repo)
    cset = repo[rev]
    rcset = rd[rev]
    
    comment_count = len(rcset.comments)
    author_count = len(set(comment.author for comment in rcset.comments))
    
    ui.write(messages.REVIEW_LOG_CSET % (cset.rev(), short(cset.node())))
    ui.write(messages.REVIEW_LOG_AUTHOR % cset.user())
    ui.write(messages.REVIEW_LOG_SUMMARY % cset.description().split('\n')[0])
    
    ui.write(messages.REVIEW_LOG_SIGNOFFS % len(rcset.signoffs))
    ui.write(messages.REVIEW_LOG_COMMENTS % (comment_count, author_count))


def review(ui, repo, *fnames, **opts):
    '''code review a changeset in the current repository
    '''
    if opts.pop('init'):
        return _init_command(ui, repo, **opts)
    elif opts.pop('comment'):
        return _comment_command(ui, repo, **opts)
    elif opts.pop('signoff'):
        return _signoff_command(ui, repo, **opts)
    else:
        return _review_command(ui, repo, **opts)


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'),
        ('s', 'signoff', False, 'sign off'),
        ('', 'yes', False, 'sign off as stating the changeset is good'),
        ('', 'no', False, 'sign off as stating the changeset is bad'),
        ('m', 'message', '', 'use <text> as the comment or signoff message'),
        ('', 'force', False, 'overwrite an existing signoff'),
        ('r', 'rev', '.', 'the revision to review'),
    ],
    'hg review')
}