author |
Steve Losh <steve@stevelosh.com> |
date |
Fri, 11 Jun 2010 20:59:24 -0400 |
parents |
e57c86639185 |
children |
93e7fb8a1323 |
from __future__ import with_statement
"""The review extension's web UI."""
import sys, os
from hashlib import md5
from mercurial import commands, cmdutil, hg, templatefilters
from mercurial.node import short, hex
from mercurial.util import email
import api
def unbundle():
package_path = os.path.split(os.path.realpath(__file__))[0]
template_path = os.path.join(package_path, 'web_templates')
media_path = os.path.join(package_path, 'web_media')
top_path = os.path.split(package_path)[0]
bundled_path = os.path.join(top_path, 'bundled')
flask_path = os.path.join(bundled_path, 'flask')
jinja2_path = os.path.join(bundled_path, 'jinja2')
werkzeug_path = os.path.join(bundled_path, 'werkzeug')
simplejson_path = os.path.join(bundled_path, 'simplejson')
sys.path.insert(0, flask_path)
sys.path.insert(0, werkzeug_path)
sys.path.insert(0, jinja2_path)
sys.path.insert(0, simplejson_path)
unbundle()
from flask import Flask, render_template
app = Flask(__name__)
LOG_PAGE_LEN = 1000000
def _item_gravatar(item):
return 'http://www.gravatar.com/avatar/%s/' % md5(email(item.author)).hexdigest()
def _line_type(line):
return 'rem' if line[0] == '-' else 'add' if line[0] == '+' else 'con'
utils = {
'node_short': short,
'basename': os.path.basename,
'md5': md5,
'email': email,
'templatefilters': templatefilters,
'len': len,
'item_gravatar': _item_gravatar,
'line_type': _line_type,
}
datastore = None
site_read_only = False
def _render(template, **kwargs):
return render_template(template, read_only=site_read_only, utils=utils,
datastore=datastore, **kwargs)
@app.route('/')
def index():
rev_max = datastore.target['tip'].rev()
rev_min = rev_max - LOG_PAGE_LEN if rev_max >= LOG_PAGE_LEN else 0
rcsets = [datastore[r] for r in xrange(rev_max, rev_min, -1)]
return _render('index.html', title='', rcsets=rcsets)
@app.route('/changeset/<revhash>/')
def changeset(revhash):
#if kwargs and not self.read_only:
#signoff = kwargs.get('signoff', None)
#if signoff:
#if signoff not in ['yes', 'no', 'neutral']:
#return 'Invalid signoff type.'
#if signoff == 'neutral':
#signoff = ''
#body = kwargs.get('new-signoff-body', '')
#rcset = self.datastore[rev_id]
#rcset.add_signoff(body, signoff, force=True)
#raise cherrypy.HTTPRedirect("/changeset/%s/" % rev_id)
#filename = kwargs.get('filename', '')
#lines = str(kwargs['lines']) if 'lines' in kwargs else ''
#if lines:
#lines = lines.split(',')
#body = kwargs['new-comment-body']
#if body:
#rcset = self.datastore[rev_id]
#rcset.add_comment(body, filename, lines)
#raise cherrypy.HTTPRedirect("/changeset/%s/" % rev_id)
rcset = datastore[revhash]
rev = rcset.target[revhash]
cu_signoffs = rcset.signoffs_for_current_user()
cu_signoff = cu_signoffs[0] if cu_signoffs else None
return _render('changeset.html',
title='%s:%s' % (rev.rev(), short(rev.node())),
rcset=rcset, rev=rev, cu_signoff=cu_signoff
)
#class ReviewWebUI(object):
#@cherrypy.expose
#def pull(self, **kwargs):
#if not self.read_only:
#if 'path' not in kwargs:
#return 'OH GOD HOW DID THIS GET HERE I AM NOT GOOD WITH LINKS'
#path = kwargs['path']
#commands.pull(
#self.datastore.repo.ui, self.datastore.repo, path, **{
#'update': True
#}
#)
#raise cherrypy.HTTPRedirect("/")
#@cherrypy.expose
#def push(self, **kwargs):
#if not self.read_only:
#if 'path' not in kwargs:
#return 'OH GOD HOW DID THIS GET HERE I AM NOT GOOD WITH LINKS'
#path = kwargs['path']
#commands.push(
#self.datastore.repo.ui,self.datastore.repo, path, **{}
#)
#raise cherrypy.HTTPRedirect("/")
def load_interface(ui, repo, read_only=False, open=False, address='127.0.0.1', port=8080):
if open:
import webbrowser
webbrowser.open('http://localhost:%d/' % port)
global datastore, site_read_only
datastore = api.ReviewDatastore(ui, repo)
site_read_only = read_only
app.debug = True
app.run()