author |
Steve Losh <steve@stevelosh.com> |
date |
Fri, 11 Jun 2010 20:51:49 -0400 |
parents |
1488999c9507 |
children |
e57c86639185 |
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
@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_template('index.html',
read_only=site_read_only,
utils=utils, datastore=datastore, title='',
rcsets=rcsets,
)
#class ReviewWebUI(object):
#def __init__(self, datastore, read_only):
#self.datastore = datastore
#self.read_only = read_only
#@cherrypy.expose
#def index(self):
#rev_max = self.datastore.target['tip'].rev()
#rev_min = rev_max - LOG_PAGE_LEN if rev_max >= LOG_PAGE_LEN else 0
#rcsets = [self.datastore[r] for r in xrange(rev_max, rev_min, -1)]
#return jinja_env.get_template('index.html').render(
#read_only=self.read_only,
#utils=utils, datastore=self.datastore, title='',
#rcsets=rcsets,
#)
#@cherrypy.expose
#def changeset(self, *args, **kwargs):
#if len(args) != 1:
#return 'OH GOD HOW DID THIS GET HERE I AM NOT GOOD WITH LINKS'
#rev_id = args[0]
#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 = self.datastore[rev_id]
#rev = rcset.target[rev_id]
#cu_signoffs = rcset.signoffs_for_current_user()
#cu_signoff = cu_signoffs[0] if cu_signoffs else None
#print cu_signoff
#return jinja_env.get_template('changeset.html').render(
#read_only=self.read_only,
#utils=utils, datastore=self.datastore,
#title='%s:%s' % (rev.rev(), short(rev.node())),
#rcset=rcset, rev=rev, cu_signoff=cu_signoff
#)
#@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()