add hg and python
This commit is contained in:
parent
3a742c699f
commit
458120dd40
3709 changed files with 1244309 additions and 1 deletions
218
sys/lib/python/mercurial/hgweb/webutil.py
Normal file
218
sys/lib/python/mercurial/hgweb/webutil.py
Normal file
|
@ -0,0 +1,218 @@
|
|||
# hgweb/webutil.py - utility library for the web interface.
|
||||
#
|
||||
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
|
||||
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
|
||||
#
|
||||
# This software may be used and distributed according to the terms of the
|
||||
# GNU General Public License version 2, incorporated herein by reference.
|
||||
|
||||
import os, copy
|
||||
from mercurial import match, patch, util, error
|
||||
from mercurial.node import hex, nullid
|
||||
|
||||
def up(p):
|
||||
if p[0] != "/":
|
||||
p = "/" + p
|
||||
if p[-1] == "/":
|
||||
p = p[:-1]
|
||||
up = os.path.dirname(p)
|
||||
if up == "/":
|
||||
return "/"
|
||||
return up + "/"
|
||||
|
||||
def revnavgen(pos, pagelen, limit, nodefunc):
|
||||
def seq(factor, limit=None):
|
||||
if limit:
|
||||
yield limit
|
||||
if limit >= 20 and limit <= 40:
|
||||
yield 50
|
||||
else:
|
||||
yield 1 * factor
|
||||
yield 3 * factor
|
||||
for f in seq(factor * 10):
|
||||
yield f
|
||||
|
||||
def nav(**map):
|
||||
l = []
|
||||
last = 0
|
||||
for f in seq(1, pagelen):
|
||||
if f < pagelen or f <= last:
|
||||
continue
|
||||
if f > limit:
|
||||
break
|
||||
last = f
|
||||
if pos + f < limit:
|
||||
l.append(("+%d" % f, hex(nodefunc(pos + f).node())))
|
||||
if pos - f >= 0:
|
||||
l.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
|
||||
|
||||
try:
|
||||
yield {"label": "(0)", "node": hex(nodefunc('0').node())}
|
||||
|
||||
for label, node in l:
|
||||
yield {"label": label, "node": node}
|
||||
|
||||
yield {"label": "tip", "node": "tip"}
|
||||
except error.RepoError:
|
||||
pass
|
||||
|
||||
return nav
|
||||
|
||||
def _siblings(siblings=[], hiderev=None):
|
||||
siblings = [s for s in siblings if s.node() != nullid]
|
||||
if len(siblings) == 1 and siblings[0].rev() == hiderev:
|
||||
return
|
||||
for s in siblings:
|
||||
d = {'node': hex(s.node()), 'rev': s.rev()}
|
||||
d['user'] = s.user()
|
||||
d['date'] = s.date()
|
||||
d['description'] = s.description()
|
||||
d['branch'] = s.branch()
|
||||
if hasattr(s, 'path'):
|
||||
d['file'] = s.path()
|
||||
yield d
|
||||
|
||||
def parents(ctx, hide=None):
|
||||
return _siblings(ctx.parents(), hide)
|
||||
|
||||
def children(ctx, hide=None):
|
||||
return _siblings(ctx.children(), hide)
|
||||
|
||||
def renamelink(fctx):
|
||||
r = fctx.renamed()
|
||||
if r:
|
||||
return [dict(file=r[0], node=hex(r[1]))]
|
||||
return []
|
||||
|
||||
def nodetagsdict(repo, node):
|
||||
return [{"name": i} for i in repo.nodetags(node)]
|
||||
|
||||
def nodebranchdict(repo, ctx):
|
||||
branches = []
|
||||
branch = ctx.branch()
|
||||
# If this is an empty repo, ctx.node() == nullid,
|
||||
# ctx.branch() == 'default', but branchtags() is
|
||||
# an empty dict. Using dict.get avoids a traceback.
|
||||
if repo.branchtags().get(branch) == ctx.node():
|
||||
branches.append({"name": branch})
|
||||
return branches
|
||||
|
||||
def nodeinbranch(repo, ctx):
|
||||
branches = []
|
||||
branch = ctx.branch()
|
||||
if branch != 'default' and repo.branchtags().get(branch) != ctx.node():
|
||||
branches.append({"name": branch})
|
||||
return branches
|
||||
|
||||
def nodebranchnodefault(ctx):
|
||||
branches = []
|
||||
branch = ctx.branch()
|
||||
if branch != 'default':
|
||||
branches.append({"name": branch})
|
||||
return branches
|
||||
|
||||
def showtag(repo, tmpl, t1, node=nullid, **args):
|
||||
for t in repo.nodetags(node):
|
||||
yield tmpl(t1, tag=t, **args)
|
||||
|
||||
def cleanpath(repo, path):
|
||||
path = path.lstrip('/')
|
||||
return util.canonpath(repo.root, '', path)
|
||||
|
||||
def changectx(repo, req):
|
||||
changeid = "tip"
|
||||
if 'node' in req.form:
|
||||
changeid = req.form['node'][0]
|
||||
elif 'manifest' in req.form:
|
||||
changeid = req.form['manifest'][0]
|
||||
|
||||
try:
|
||||
ctx = repo[changeid]
|
||||
except error.RepoError:
|
||||
man = repo.manifest
|
||||
ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
|
||||
|
||||
return ctx
|
||||
|
||||
def filectx(repo, req):
|
||||
path = cleanpath(repo, req.form['file'][0])
|
||||
if 'node' in req.form:
|
||||
changeid = req.form['node'][0]
|
||||
else:
|
||||
changeid = req.form['filenode'][0]
|
||||
try:
|
||||
fctx = repo[changeid][path]
|
||||
except error.RepoError:
|
||||
fctx = repo.filectx(path, fileid=changeid)
|
||||
|
||||
return fctx
|
||||
|
||||
def listfilediffs(tmpl, files, node, max):
|
||||
for f in files[:max]:
|
||||
yield tmpl('filedifflink', node=hex(node), file=f)
|
||||
if len(files) > max:
|
||||
yield tmpl('fileellipses')
|
||||
|
||||
def diffs(repo, tmpl, ctx, files, parity):
|
||||
|
||||
def countgen():
|
||||
start = 1
|
||||
while True:
|
||||
yield start
|
||||
start += 1
|
||||
|
||||
blockcount = countgen()
|
||||
def prettyprintlines(diff):
|
||||
blockno = blockcount.next()
|
||||
for lineno, l in enumerate(diff.splitlines(True)):
|
||||
lineno = "%d.%d" % (blockno, lineno + 1)
|
||||
if l.startswith('+'):
|
||||
ltype = "difflineplus"
|
||||
elif l.startswith('-'):
|
||||
ltype = "difflineminus"
|
||||
elif l.startswith('@'):
|
||||
ltype = "difflineat"
|
||||
else:
|
||||
ltype = "diffline"
|
||||
yield tmpl(ltype,
|
||||
line=l,
|
||||
lineid="l%s" % lineno,
|
||||
linenumber="% 8s" % lineno)
|
||||
|
||||
if files:
|
||||
m = match.exact(repo.root, repo.getcwd(), files)
|
||||
else:
|
||||
m = match.always(repo.root, repo.getcwd())
|
||||
|
||||
diffopts = patch.diffopts(repo.ui, untrusted=True)
|
||||
parents = ctx.parents()
|
||||
node1 = parents and parents[0].node() or nullid
|
||||
node2 = ctx.node()
|
||||
|
||||
block = []
|
||||
for chunk in patch.diff(repo, node1, node2, m, opts=diffopts):
|
||||
if chunk.startswith('diff') and block:
|
||||
yield tmpl('diffblock', parity=parity.next(),
|
||||
lines=prettyprintlines(''.join(block)))
|
||||
block = []
|
||||
if chunk.startswith('diff'):
|
||||
chunk = ''.join(chunk.splitlines(True)[1:])
|
||||
block.append(chunk)
|
||||
yield tmpl('diffblock', parity=parity.next(),
|
||||
lines=prettyprintlines(''.join(block)))
|
||||
|
||||
class sessionvars(object):
|
||||
def __init__(self, vars, start='?'):
|
||||
self.start = start
|
||||
self.vars = vars
|
||||
def __getitem__(self, key):
|
||||
return self.vars[key]
|
||||
def __setitem__(self, key, value):
|
||||
self.vars[key] = value
|
||||
def __copy__(self):
|
||||
return sessionvars(copy.copy(self.vars), self.start)
|
||||
def __iter__(self):
|
||||
separator = self.start
|
||||
for key, value in self.vars.iteritems():
|
||||
yield {'name': key, 'value': str(value), 'separator': separator}
|
||||
separator = '&'
|
Loading…
Add table
Add a link
Reference in a new issue