##// END OF EJS Templates
merge util.esystem and util.system.
merge util.esystem and util.system.

File last commit:

r1864:7a09785d default
r1882:c0320567 default
Show More
hgweb.py
1199 lines | 40.6 KiB | text/x-python | PythonLexer
mpm@selenic.com
hgweb.py: kill #! line, clean up copyright notice...
r238 # hgweb.py - web interface to a mercurial repository
jake@edge2.net
moving hgweb to mercurial subdir
r131 #
mpm@selenic.com
hgweb.py: kill #! line, clean up copyright notice...
r238 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
mpm@selenic.com
More whitespace cleanups...
r575 # Copyright 2005 Matt Mackall <mpm@selenic.com>
jake@edge2.net
moving hgweb to mercurial subdir
r131 #
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
Peter van Dijk
changed template escape filter, added urlescape filter; audited all templates for insertion bugs; added note to manifest.py about newlines in filenames
r1650 import os, cgi, sys, urllib
Josef "Jeff" Sipek
[hgweb] Static content serving
r1777 import mimetypes
mpm@selenic.com
Clean up hgweb imports...
r1213 from demandload import demandload
mpm@selenic.com
Add missing import for hgwebdir
r1217 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser")
Bryan O'Sullivan
Fix up representation of dates in hgweb....
r1320 demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer util")
Matt Mackall
hgweb: make viewing of non-text work in hgweb...
r1411 demandload(globals(), "mimetypes")
mpm@selenic.com
Clean up hgweb imports...
r1213 from node import *
Benoit Boissinot
i18n first part: make '_' available for files who need it
r1400 from i18n import gettext as _
mpm@selenic.com
Revamped templated hgweb
r138
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157 def templatepath():
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 for f in "templates", "../templates":
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157 p = os.path.join(os.path.dirname(__file__), f)
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if os.path.isdir(p):
Lee Cantey
Fix 'hg serve' not using CSS....
r1795 return os.path.normpath(p)
Lee Cantey
Fixes running 'hg serve' with Windows executable and no explicit template path configured....
r1834 else:
# executable version (py2exe) doesn't support __file__
if hasattr(sys, 'frozen'):
return os.path.join(sys.prefix, "templates")
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157
Bryan O'Sullivan
Fix up representation of dates in hgweb....
r1320 def age(x):
mpm@selenic.com
Revamped templated hgweb
r138 def plural(t, c):
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if c == 1:
return t
mpm@selenic.com
Revamped templated hgweb
r138 return t + "s"
def fmt(t, c):
return "%d %s" % (c, plural(t, c))
now = time.time()
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 then = x[0]
Bryan O'Sullivan
Fix up representation of dates in hgweb....
r1320 delta = max(1, int(now - then))
mpm@selenic.com
Revamped templated hgweb
r138
scales = [["second", 1],
["minute", 60],
["hour", 3600],
["day", 3600 * 24],
["week", 3600 * 24 * 7],
["month", 3600 * 24 * 30],
["year", 3600 * 24 * 365]]
scales.reverse()
for t, s in scales:
n = delta / s
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if n >= 2 or s == 1:
return fmt(t, n)
jake@edge2.net
moving hgweb to mercurial subdir
r131
def nl2br(text):
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 return text.replace('\n', '<br/>\n')
jake@edge2.net
moving hgweb to mercurial subdir
r131
def obfuscate(text):
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 return ''.join(['&#%d;' % ord(c) for c in text])
mpm@selenic.com
Revamped templated hgweb
r138
def up(p):
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if p[0] != "/":
p = "/" + p
if p[-1] == "/":
p = p[:-1]
mpm@selenic.com
Revamped templated hgweb
r138 up = os.path.dirname(p)
if up == "/":
return "/"
return up + "/"
jake@edge2.net
moving hgweb to mercurial subdir
r131
Benoit Boissinot
Make hgweb work when the repository is empty (no 00changelog.i)
r1418 def get_mtime(repo_path):
hg_path = os.path.join(repo_path, ".hg")
cl_path = os.path.join(hg_path, "00changelog.i")
if os.path.exists(os.path.join(cl_path)):
return os.stat(cl_path).st_mtime
else:
return os.stat(hg_path).st_mtime
Thomas Arendsen Hein
Allow serving static files from hgwebdir to fix CSS and favicon.
r1793 def staticfile(directory, fname):
Thomas Arendsen Hein
Make hgweb.staticfile() more secure and portable....
r1825 """return a file inside directory with guessed content-type header
fname always uses '/' as directory separator and isn't allowed to
contain unusual path components.
Content-type is guessed using the mimetypes module.
Return an empty string if fname is illegal or file not found.
Thomas Arendsen Hein
Allow serving static files from hgwebdir to fix CSS and favicon.
r1793
Thomas Arendsen Hein
Make hgweb.staticfile() more secure and portable....
r1825 """
parts = fname.split('/')
path = directory
for part in parts:
if (part in ('', os.curdir, os.pardir) or
os.sep in part or os.altsep is not None and os.altsep in part):
return ""
path = os.path.join(path, part)
Thomas Arendsen Hein
Allow serving static files from hgwebdir to fix CSS and favicon.
r1793 try:
Thomas Arendsen Hein
Make hgweb.staticfile() more secure and portable....
r1825 os.stat(path)
ct = mimetypes.guess_type(path)[0] or "text/plain"
return "Content-type: %s\n\n%s" % (ct, file(path).read())
except (TypeError, OSError):
# illegal fname or unreadable file
Thomas Arendsen Hein
Allow serving static files from hgwebdir to fix CSS and favicon.
r1793 return ""
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class hgrequest(object):
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 def __init__(self, inp=None, out=None, env=None):
self.inp = inp or sys.stdin
self.out = out or sys.stdout
self.env = env or os.environ
Benoit Boissinot
allow empty values for url so we can have /?tip
r1407 self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 def write(self, *things):
for thing in things:
if hasattr(thing, "__iter__"):
for part in thing:
self.write(part)
else:
try:
Vincent Wagelaar
Fix TypeError
r1160 self.out.write(str(thing))
Thomas Arendsen Hein
Added missing 'import errno', and use errno for EPIPE, too.
r1174 except socket.error, inst:
if inst[0] != errno.ECONNRESET:
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 raise
def header(self, headers=[('Content-type','text/html')]):
for header in headers:
self.out.write("%s: %s\r\n" % header)
self.out.write("\r\n")
def httphdr(self, type, file="", size=0):
headers = [('Content-type', type)]
if file:
headers.append(('Content-disposition', 'attachment; filename=%s' % file))
if size > 0:
headers.append(('Content-length', str(size)))
self.header(headers)
jake@edge2.net
change template to a generator...
r135
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class templater(object):
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def __init__(self, mapfile, filters={}, defaults={}):
mpm@selenic.com
Revamped templated hgweb
r138 self.cache = {}
self.map = {}
self.base = os.path.dirname(mapfile)
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 self.filters = filters
mpm@selenic.com
Add globals to templater/fixup RSS...
r601 self.defaults = defaults
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Revamped templated hgweb
r138 for l in file(mapfile):
m = re.match(r'(\S+)\s*=\s*"(.*)"$', l)
jake@edge2.net
added template support for some hgweb output, also, template files for...
r133 if m:
mpm@selenic.com
Revamped templated hgweb
r138 self.cache[m.group(1)] = m.group(2)
else:
m = re.match(r'(\S+)\s*=\s*(\S+)', l)
if m:
self.map[m.group(1)] = os.path.join(self.base, m.group(2))
jake@edge2.net
added template support for some hgweb output, also, template files for...
r133 else:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise LookupError(_("unknown map entry '%s'") % l)
jake@edge2.net
added template support for some hgweb output, also, template files for...
r133
mpm@selenic.com
Revamped templated hgweb
r138 def __call__(self, t, **map):
mpm@selenic.com
Add globals to templater/fixup RSS...
r601 m = self.defaults.copy()
m.update(map)
mpm@selenic.com
Revamped templated hgweb
r138 try:
tmpl = self.cache[t]
except KeyError:
tmpl = self.cache[t] = file(self.map[t]).read()
Josef "Jeff" Sipek
Added support for #foo%bar# syntax...
r974 return self.template(tmpl, self.filters, **m)
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 def template(self, tmpl, filters={}, **map):
Josef "Jeff" Sipek
Added support for #foo%bar# syntax...
r974 while tmpl:
m = re.search(r"#([a-zA-Z0-9]+)((%[a-zA-Z0-9]+)*)((\|[a-zA-Z0-9]+)*)#", tmpl)
if m:
yield tmpl[:m.start(0)]
v = map.get(m.group(1), "")
v = callable(v) and v(**map) or v
format = m.group(2)
fl = m.group(4)
if format:
q = v.__iter__
for i in q():
lm = map.copy()
lm.update(i)
yield self(format[1:], **lm)
v = ""
elif fl:
for f in fl.split("|")[1:]:
v = filters[f](v)
yield v
tmpl = tmpl[m.end(0):]
else:
yield tmpl
return
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Add a multi-repository server...
r941 common_filters = {
Peter van Dijk
changed template escape filter, added urlescape filter; audited all templates for insertion bugs; added note to manifest.py about newlines in filenames
r1650 "escape": lambda x: cgi.escape(x, True),
"urlescape": urllib.quote,
TK Soh
hgweb: add strip and rstrip filters to handle summary
r1445 "strip": lambda x: x.strip(),
mpm@selenic.com
Add a multi-repository server...
r941 "age": age,
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 "date": lambda x: util.datestr(x),
mpm@selenic.com
Add a multi-repository server...
r941 "addbreaks": nl2br,
"obfuscate": obfuscate,
"short": (lambda x: x[:12]),
"firstline": (lambda x: x.splitlines(1)[0]),
"permissions": (lambda x: x and "-rwxr-xr-x" or "-rw-r--r--"),
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"),
mpm@selenic.com
Add a multi-repository server...
r941 }
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class hgweb(object):
mpm@selenic.com
hgweb: change startup argument processing...
r987 def __init__(self, repo, name=None):
if type(repo) == type(""):
mpm@selenic.com
Clean up hgweb imports...
r1213 self.repo = hg.repository(ui.ui(), repo)
mpm@selenic.com
hgweb: change startup argument processing...
r987 else:
self.repo = repo
jake@edge2.net
added template support for some hgweb output, also, template files for...
r133
mpm@selenic.com
hgweb: watch changelog for changes...
r258 self.mtime = -1
Thomas Arendsen Hein
Use path relative to document root as reponame if published via a web server....
r1172 self.reponame = name
mpm@selenic.com
Various cleanups for tarball support...
r1078 self.archives = 'zip', 'gz', 'bz2'
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: watch changelog for changes...
r258 def refresh(self):
Benoit Boissinot
Make hgweb work when the repository is empty (no 00changelog.i)
r1418 mtime = get_mtime(self.repo.root)
if mtime != self.mtime:
self.mtime = mtime
mpm@selenic.com
Clean up hgweb imports...
r1213 self.repo = hg.repository(self.repo.ui, self.repo.root)
Florian La Roche
Fix cut and paste error in hgweb.py
r1275 self.maxchanges = int(self.repo.ui.config("web", "maxchanges", 10))
self.maxfiles = int(self.repo.ui.config("web", "maxfiles", 10))
mpm@selenic.com
hgweb: Make maxfiles, maxchanges, and allowpull proper config options
r964 self.allowpull = self.repo.ui.configbool("web", "allowpull", True)
mpm@selenic.com
hgweb: watch changelog for changes...
r258
Thomas Arendsen Hein
hgweb: Added archive download buttons to manifest page.
r1498 def archivelist(self, nodeid):
for i in self.archives:
if self.repo.ui.configbool("web", "allow" + i, False):
yield {"type" : i, "node" : nodeid}
mpm@selenic.com
Revamped templated hgweb
r138 def listfiles(self, files, mf):
for f in files[:self.maxfiles]:
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t("filenodelink", node=hex(mf[f]), file=f)
mpm@selenic.com
Revamped templated hgweb
r138 if len(files) > self.maxfiles:
yield self.t("fileellipses")
def listfilediffs(self, files, changeset):
for f in files[:self.maxfiles]:
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t("filedifflink", node=hex(changeset), file=f)
mpm@selenic.com
Revamped templated hgweb
r138 if len(files) > self.maxfiles:
yield self.t("fileellipses")
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 def siblings(self, siblings=[], rev=None, hiderev=None, **args):
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if not rev:
rev = lambda x: ""
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 siblings = [s for s in siblings if s != nullid]
if len(siblings) == 1 and rev(siblings[0]) == hiderev:
Benoit Boissinot
hgweb: hide trivial parent (like in show_changeset)
r1416 return
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 for s in siblings:
yield dict(node=hex(s), rev=rev(s), **args)
mpm@selenic.com
[PATCH 1/5]: cleaning the template parent management in hgweb...
r569
Matt Mackall
hgweb: show copy/rename links in file history
r1653 def renamelink(self, fl, node):
r = fl.renamed(node)
if r:
return [dict(file=r[0], node=hex(r[1]))]
return []
mpm@selenic.com
[PATCH] Add tags to hgweb...
r568 def showtag(self, t1, node=nullid, **args):
for t in self.repo.nodetags(node):
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t(t1, tag=t, **args)
mpm@selenic.com
[PATCH] Add tags to hgweb...
r568
mpm@selenic.com
Revamped templated hgweb
r138 def diff(self, node1, node2, files):
Benoit Boissinot
make the order of the arguments for filterfiles consistent...
r1626 def filterfiles(filters, files):
Benoit Boissinot
fix for hgweb.filterfiles...
r1627 l = [x for x in files if x in filters]
mpm@selenic.com
Whitespace cleanups...
r515
Benoit Boissinot
make the order of the arguments for filterfiles consistent...
r1626 for t in filters:
Benoit Boissinot
fix for hgweb.filterfiles...
r1627 if t and t[-1] != os.sep:
Benoit Boissinot
make the order of the arguments for filterfiles consistent...
r1626 t += os.sep
l += [x for x in files if x.startswith(t)]
mpm@selenic.com
Revamped templated hgweb
r138 return l
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: alternating colors for multifile diffs
r172 parity = [0]
def diffblock(diff, f, fn):
yield self.t("diffblock",
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 lines=prettyprintlines(diff),
parity=parity[0],
file=f,
filenode=hex(fn or nullid))
mpm@selenic.com
hgweb: alternating colors for multifile diffs
r172 parity[0] = 1 - parity[0]
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
hgweb: alternating colors for multifile diffs
r172 def prettyprintlines(diff):
mpm@selenic.com
Revamped templated hgweb
r138 for l in diff.splitlines(1):
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 if l.startswith('+'):
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t("difflineplus", line=l)
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 elif l.startswith('-'):
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t("difflineminus", line=l)
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 elif l.startswith('@'):
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t("difflineat", line=l)
mpm@selenic.com
Revamped templated hgweb
r138 else:
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 yield self.t("diffline", line=l)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Revamped templated hgweb
r138 r = self.repo
cl = r.changelog
mf = r.manifest
change1 = cl.read(node1)
change2 = cl.read(node2)
mmap1 = mf.read(change1[0])
mmap2 = mf.read(change2[0])
mpm@selenic.com
hgweb: fix date bug in hgweb diff generation
r1333 date1 = util.datestr(change1[2])
date2 = util.datestr(change2[2])
jake@edge2.net
moving hgweb to mercurial subdir
r131
Thomas Arendsen Hein
Distinguish removed and deleted files. Tests are not fixed yet....
r1619 modified, added, removed, deleted, unknown = r.changes(node1, node2)
kreijack@inwind.REMOVEME.it
this patch permits hgweb to show the deleted files in the changeset diff...
r645 if files:
Benoit Boissinot
make the order of the arguments for filterfiles consistent...
r1626 modified, added, removed = map(lambda x: filterfiles(files, x),
Thomas Arendsen Hein
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
r1618 (modified, added, removed))
jake@edge2.net
moving hgweb to mercurial subdir
r131
mason@suse.com
Add new bdiff based unidiff generation.
r1637 diffopts = self.repo.ui.diffopts()
showfunc = diffopts['showfunc']
ignorews = diffopts['ignorews']
Thomas Arendsen Hein
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
r1618 for f in modified:
mpm@selenic.com
Revamped templated hgweb
r138 to = r.file(f).read(mmap1[f])
tn = r.file(f).read(mmap2[f])
mason@suse.com
Add new bdiff based unidiff generation.
r1637 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f,
showfunc=showfunc, ignorews=ignorews), f, tn)
Thomas Arendsen Hein
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
r1618 for f in added:
mpm@selenic.com
hgweb: fix non-existent source or destination for diff...
r265 to = None
mpm@selenic.com
Revamped templated hgweb
r138 tn = r.file(f).read(mmap2[f])
mason@suse.com
Add new bdiff based unidiff generation.
r1637 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f,
showfunc=showfunc, ignorews=ignorews), f, tn)
Thomas Arendsen Hein
Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
r1618 for f in removed:
mpm@selenic.com
Revamped templated hgweb
r138 to = r.file(f).read(mmap1[f])
mpm@selenic.com
hgweb: fix non-existent source or destination for diff...
r265 tn = None
mason@suse.com
Add new bdiff based unidiff generation.
r1637 yield diffblock(mdiff.unidiff(to, date1, tn, date2, f,
showfunc=showfunc, ignorews=ignorews), f, tn)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: Fix navigate to 0 bug
r180 def changelog(self, pos):
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def changenav(**map):
Johannes Stezenbach
fix changenav for maxchanges != 10...
r1703 def seq(factor, maxchanges=None):
if maxchanges:
yield maxchanges
if maxchanges >= 20 and maxchanges <= 40:
yield 50
else:
yield 1 * factor
yield 3 * factor
mpm@selenic.com
Revamped templated hgweb
r138 for f in seq(factor * 10):
yield f
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: make navigation of changesets a bit nicer
r173 l = []
Johannes Stezenbach
fix changenav for maxchanges != 10...
r1703 last = 0
for f in seq(1, self.maxchanges):
if f < self.maxchanges or f <= last:
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 continue
if f > count:
break
Johannes Stezenbach
fix changenav for maxchanges != 10...
r1703 last = f
mpm@selenic.com
hgweb: make navigation of changesets a bit nicer
r173 r = "%d" % f
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if pos + f < count:
l.append(("+" + r, pos + f))
if pos - f >= 0:
l.insert(0, ("-" + r, pos - f))
mpm@selenic.com
hgweb: make navigation of changesets a bit nicer
r173
Josef "Jeff" Sipek
hgweb: Changed changelog page to list format syntax
r975 yield {"rev": 0, "label": "(0)"}
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
hgweb: make navigation of changesets a bit nicer
r173 for label, rev in l:
Josef "Jeff" Sipek
hgweb: Changed changelog page to list format syntax
r975 yield {"label": label, "rev": rev}
mpm@selenic.com
hgweb: make navigation of changesets a bit nicer
r173
Matt Mackall
hgweb: add shortcuts for all the web commands / fix empty arg bug
r1409 yield {"label": "tip", "rev": "tip"}
jake@edge2.net
moving hgweb to mercurial subdir
r131
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def changelist(**map):
mpm@selenic.com
Prettify the web interface...
r142 parity = (start - end) & 1
mpm@selenic.com
Revamped templated hgweb
r138 cl = self.repo.changelog
l = [] # build a list in forward order for efficiency
mpm@selenic.com
hgweb: change number navigation tidy up...
r351 for i in range(start, end):
mpm@selenic.com
Revamped templated hgweb
r138 n = cl.node(i)
changes = cl.read(n)
hn = hex(n)
jake@edge2.net
moving hgweb to mercurial subdir
r131
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 l.insert(0, {"parity": parity,
"author": changes[1],
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 "parent": self.siblings(cl.parents(n), cl.rev,
cl.rev(n) - 1),
"child": self.siblings(cl.children(n), cl.rev,
cl.rev(n) + 1),
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 "changelogtag": self.showtag("changelogtag",n),
"manifest": hex(changes[0]),
"desc": changes[4],
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 "date": changes[2],
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 "files": self.listfilediffs(changes[3], n),
"rev": i,
"node": hn})
mpm@selenic.com
Prettify the web interface...
r142 parity = 1 - parity
mpm@selenic.com
Revamped templated hgweb
r138
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 for e in l:
yield e
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: add tags links and manifest links...
r168 cl = self.repo.changelog
mf = cl.read(cl.tip())[0]
count = cl.count()
mpm@selenic.com
hgweb: change number navigation tidy up...
r351 start = max(0, pos - self.maxchanges + 1)
end = min(count, start + self.maxchanges)
pos = end - 1
mpm@selenic.com
Revamped templated hgweb
r138
mpm@selenic.com
Prettify the web interface...
r142 yield self.t('changelog',
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 changenav=changenav,
manifest=hex(mf),
rev=pos, changesets=count, entries=changelist)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Add multiple keyword search to hgweb...
r538 def search(self, query):
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def changelist(**map):
mpm@selenic.com
Add multiple keyword search to hgweb...
r538 cl = self.repo.changelog
count = 0
qw = query.lower().split()
def revgen():
for i in range(cl.count() - 1, 0, -100):
l = []
for j in range(max(0, i - 100), i):
n = cl.node(j)
changes = cl.read(n)
mpm@selenic.com
Minor tweak to the revgen algorithm
r1023 l.append((n, j, changes))
l.reverse()
mpm@selenic.com
Add multiple keyword search to hgweb...
r538 for e in l:
yield e
for n, i, changes in revgen():
miss = 0
for q in qw:
if not (q in changes[1].lower() or
q in changes[4].lower() or
q in " ".join(changes[3][:20]).lower()):
miss = 1
break
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if miss:
continue
mpm@selenic.com
Add multiple keyword search to hgweb...
r538
count += 1
hn = hex(n)
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 yield self.t('searchentry',
parity=count & 1,
author=changes[1],
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 parent=self.siblings(cl.parents(n), cl.rev),
child=self.siblings(cl.children(n), cl.rev),
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 changelogtag=self.showtag("changelogtag",n),
manifest=hex(changes[0]),
desc=changes[4],
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 date=changes[2],
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 files=self.listfilediffs(changes[3], n),
rev=i,
node=hn)
mpm@selenic.com
Add multiple keyword search to hgweb...
r538
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if count >= self.maxchanges:
break
mpm@selenic.com
Add multiple keyword search to hgweb...
r538
cl = self.repo.changelog
mf = cl.read(cl.tip())[0]
yield self.t('search',
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 query=query,
manifest=hex(mf),
entries=changelist)
mpm@selenic.com
Add multiple keyword search to hgweb...
r538
mpm@selenic.com
Revamped templated hgweb
r138 def changeset(self, nodeid):
cl = self.repo.changelog
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 n = self.repo.lookup(nodeid)
nodeid = hex(n)
mpm@selenic.com
Revamped templated hgweb
r138 changes = cl.read(n)
mpm@selenic.com
[PATCH 4/5]: cleaning the template parent management in hgweb...
r598 p1 = cl.parents(n)[0]
mpm@selenic.com
Whitespace cleanups...
r515
jake@edge2.net
added template support for some hgweb output, also, template files for...
r133 files = []
mpm@selenic.com
Revamped templated hgweb
r138 mf = self.repo.manifest.read(changes[0])
jake@edge2.net
moving hgweb to mercurial subdir
r131 for f in changes[3]:
mpm@selenic.com
Revamped templated hgweb
r138 files.append(self.t("filenodelink",
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 filenode=hex(mf.get(f, nullid)), file=f))
mpm@selenic.com
Revamped templated hgweb
r138
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def diff(**map):
kreijack@inwind.REMOVEME.it
this patch permits hgweb to show the deleted files in the changeset diff...
r645 yield self.diff(p1, n, None)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Revamped templated hgweb
r138 yield self.t('changeset',
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 diff=diff,
rev=cl.rev(n),
node=nodeid,
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 parent=self.siblings(cl.parents(n), cl.rev),
child=self.siblings(cl.children(n), cl.rev),
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 changesettag=self.showtag("changesettag",n),
manifest=hex(changes[0]),
author=changes[1],
desc=changes[4],
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 date=changes[2],
Wojciech Milkowski
tarball support v0.3...
r1076 files=files,
Thomas Arendsen Hein
hgweb: Added archive download buttons to manifest page.
r1498 archives=self.archivelist(nodeid))
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Revamped templated hgweb
r138 def filelog(self, f, filenode):
cl = self.repo.changelog
fl = self.repo.file(f)
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 filenode = hex(fl.lookup(filenode))
mpm@selenic.com
Revamped templated hgweb
r138 count = fl.count()
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def entries(**map):
mpm@selenic.com
Revamped templated hgweb
r138 l = []
mpm@selenic.com
Prettify the web interface...
r142 parity = (count - 1) & 1
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Revamped templated hgweb
r138 for i in range(count):
n = fl.node(i)
lr = fl.linkrev(n)
cn = cl.node(lr)
cs = cl.read(cl.node(lr))
jake@edge2.net
added template support for some hgweb output, also, template files for...
r133
Josef "Jeff" Sipek
hgweb: Changed file revision page to list format syntax
r978 l.insert(0, {"parity": parity,
"filenode": hex(n),
"filerev": i,
"file": f,
"node": hex(cn),
"author": cs[1],
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 "date": cs[2],
Matt Mackall
hgweb: show copy/rename links in file history
r1653 "rename": self.renamelink(fl, n),
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 "parent": self.siblings(fl.parents(n),
fl.rev, file=f),
"child": self.siblings(fl.children(n),
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 fl.rev, file=f),
Josef "Jeff" Sipek
hgweb: Changed file revision page to list format syntax
r978 "desc": cs[4]})
mpm@selenic.com
Prettify the web interface...
r142 parity = 1 - parity
mpm@selenic.com
Revamped templated hgweb
r138
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 for e in l:
yield e
mpm@selenic.com
Revamped templated hgweb
r138
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 yield self.t("filelog", file=f, filenode=filenode, entries=entries)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Revamped templated hgweb
r138 def filerevision(self, f, node):
fl = self.repo.file(f)
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 n = fl.lookup(node)
node = hex(n)
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201 text = fl.read(n)
mpm@selenic.com
Revamped templated hgweb
r138 changerev = fl.linkrev(n)
cl = self.repo.changelog
cn = cl.node(changerev)
cs = cl.read(cn)
mfn = cs[0]
mpm@selenic.com
Prettify the web interface...
r142
Matt Mackall
hgweb: make viewing of non-text work in hgweb...
r1411 mt = mimetypes.guess_type(f)[0]
rawtext = text
if util.binary(text):
text = "(binary:%s)" % mt
mpm@selenic.com
Prettify the web interface...
r142 def lines():
for l, t in enumerate(text.splitlines(1)):
Josef "Jeff" Sipek
hgweb: Changed file page to list format syntax
r976 yield {"line": t,
"linenumber": "% 6d" % (l + 1),
"parity": l & 1}
mpm@selenic.com
hgweb: add file permissions...
r359
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 yield self.t("filerevision",
file=f,
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 filenode=node,
path=up(f),
text=lines(),
Matt Mackall
hgweb: make viewing of non-text work in hgweb...
r1411 raw=rawtext,
mimetype=mt,
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 rev=changerev,
node=hex(cn),
manifest=hex(mfn),
author=cs[1],
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 date=cs[2],
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 parent=self.siblings(fl.parents(n), fl.rev, file=f),
child=self.siblings(fl.children(n), fl.rev, file=f),
Matt Mackall
hgweb: show copy/rename links in file history
r1653 rename=self.renamelink(fl, n),
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 permissions=self.repo.manifest.readflags(mfn)[f])
mpm@selenic.com
Revamped templated hgweb
r138
def fileannotate(self, f, node):
bcache = {}
ncache = {}
fl = self.repo.file(f)
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 n = fl.lookup(node)
node = hex(n)
mpm@selenic.com
Revamped templated hgweb
r138 changerev = fl.linkrev(n)
cl = self.repo.changelog
cn = cl.node(changerev)
cs = cl.read(cn)
mfn = cs[0]
jake@edge2.net
moving hgweb to mercurial subdir
r131
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def annotate(**map):
mpm@selenic.com
Prettify the web interface...
r142 parity = 1
last = None
mpm@selenic.com
Revamped templated hgweb
r138 for r, l in fl.annotate(n):
try:
cnode = ncache[r]
except KeyError:
cnode = ncache[r] = self.repo.changelog.node(r)
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Revamped templated hgweb
r138 try:
name = bcache[r]
except KeyError:
cl = self.repo.changelog.read(cnode)
Thomas Arendsen Hein
Move generating short username to display in hg/hgweb annotate to ui module.
r1129 bcache[r] = name = self.repo.ui.shortuser(cl[1])
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Prettify the web interface...
r142 if last != cnode:
parity = 1 - parity
last = cnode
Josef "Jeff" Sipek
hgweb: Changed annotate page to list format syntax
r977 yield {"parity": parity,
"node": hex(cnode),
"rev": r,
"author": name,
"file": f,
"line": l}
mpm@selenic.com
Revamped templated hgweb
r138
yield self.t("fileannotate",
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 file=f,
filenode=node,
annotate=annotate,
path=up(f),
rev=changerev,
node=hex(cn),
manifest=hex(mfn),
author=cs[1],
mpm@selenic.com
hgweb: pass date tuples around rather than whole changesets for dates
r1324 date=cs[2],
Matt Mackall
hgweb: show copy/rename links in file history
r1653 rename=self.renamelink(fl, n),
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 parent=self.siblings(fl.parents(n), fl.rev, file=f),
child=self.siblings(fl.children(n), fl.rev, file=f),
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 permissions=self.repo.manifest.readflags(mfn)[f])
jake@edge2.net
added annotate...
r136
mpm@selenic.com
Revamped templated hgweb
r138 def manifest(self, mnode, path):
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 man = self.repo.manifest
mn = man.lookup(mnode)
mnode = hex(mn)
mf = man.read(mn)
rev = man.rev(mn)
mpm@selenic.com
Revamped templated hgweb
r138 node = self.repo.changelog.node(rev)
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 mff = man.readflags(mn)
mpm@selenic.com
Revamped templated hgweb
r138
files = {}
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Revamped templated hgweb
r138 p = path[1:]
Matt Mackall
hgweb: fix breakage on manifest subdirs from path cleaning
r1649 if p and p[-1] != "/":
p += "/"
mpm@selenic.com
Revamped templated hgweb
r138 l = len(p)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Revamped templated hgweb
r138 for f,n in mf.items():
if f[:l] != p:
continue
remain = f[l:]
if "/" in remain:
short = remain[:remain.find("/") + 1] # bleah
mpm@selenic.com
Prettify the web interface...
r142 files[short] = (f, None)
mpm@selenic.com
Revamped templated hgweb
r138 else:
short = os.path.basename(remain)
files[short] = (f, n)
jake@edge2.net
moving hgweb to mercurial subdir
r131
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def filelist(**map):
mpm@selenic.com
Prettify the web interface...
r142 parity = 0
mpm@selenic.com
Revamped templated hgweb
r138 fl = files.keys()
fl.sort()
for f in fl:
full, fnode = files[f]
Josef "Jeff" Sipek
hgweb: Changed manifest page to list format syntax
r979 if not fnode:
continue
yield {"file": full,
"manifest": mnode,
"filenode": hex(fnode),
"parity": parity,
"basename": f,
"permissions": mff[full]}
mpm@selenic.com
Prettify the web interface...
r142 parity = 1 - parity
mpm@selenic.com
Revamped templated hgweb
r138
Josef "Jeff" Sipek
hgweb: Changed manifest page to list format syntax
r979 def dirlist(**map):
parity = 0
fl = files.keys()
fl.sort()
for f in fl:
full, fnode = files[f]
if fnode:
continue
yield {"parity": parity,
"path": os.path.join(path, f),
"manifest": mnode,
Josef "Jeff" Sipek
Merge with MPM
r980 "basename": f[:-1]}
Josef "Jeff" Sipek
hgweb: Changed manifest page to list format syntax
r979 parity = 1 - parity
mpm@selenic.com
hgweb: convert index entries to list expansion style
r982
mpm@selenic.com
Revamped templated hgweb
r138 yield self.t("manifest",
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 manifest=mnode,
rev=rev,
node=hex(node),
path=path,
up=up(path),
fentries=filelist,
Thomas Arendsen Hein
hgweb: Added archive download buttons to manifest page.
r1498 dentries=dirlist,
archives=self.archivelist(hex(node)))
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: add tags links and manifest links...
r168 def tags(self):
cl = self.repo.changelog
mf = cl.read(cl.tip())[0]
mpm@selenic.com
rework all code using tags...
r343 i = self.repo.tagslist()
i.reverse()
mpm@selenic.com
hgweb: add tags links and manifest links...
r168
Peter van Dijk
implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
r1767 def entries(notip=False, **map):
mpm@selenic.com
hgweb: add tags links and manifest links...
r168 parity = 0
for k,n in i:
Peter van Dijk
implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
r1767 if notip and k == "tip": continue
Josef "Jeff" Sipek
Added support for #foo%bar# syntax...
r974 yield {"parity": parity,
"tag": k,
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579 "tagmanifest": hex(cl.read(n)[0]),
"date": cl.read(n)[2],
Josef "Jeff" Sipek
Added support for #foo%bar# syntax...
r974 "node": hex(n)}
mpm@selenic.com
hgweb: add tags links and manifest links...
r168 parity = 1 - parity
yield self.t("tags",
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 manifest=hex(mf),
Peter van Dijk
implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
r1767 entries=lambda **x: entries(False, **x),
entriesnotip=lambda **x: entries(True, **x))
mpm@selenic.com
hgweb: add tags links and manifest links...
r168
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 def summary(self):
cl = self.repo.changelog
mf = cl.read(cl.tip())[0]
i = self.repo.tagslist()
i.reverse()
def tagentries(**map):
parity = 0
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579 count = 0
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 for k,n in i:
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579 if k == "tip": # skip tip
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 continue;
count += 1
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579 if count > 10: # limit to 10 tags
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 break;
c = cl.read(n)
m = c[0]
t = c[2]
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 yield self.t("tagentry",
parity = parity,
tag = k,
node = hex(n),
date = t,
Josef "Jeff" Sipek
[hgweb] gitweb style: File annotate converted, file revision made more like the deafault style...
r1575 tagmanifest = hex(m))
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 parity = 1 - parity
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 def changelist(**map):
parity = 0
cl = self.repo.changelog
l = [] # build a list in forward order for efficiency
for i in range(start, end):
n = cl.node(i)
changes = cl.read(n)
hn = hex(n)
t = changes[2]
l.insert(0, self.t(
'shortlogentry',
parity = parity,
author = changes[1],
manifest = hex(changes[0]),
desc = changes[4],
date = t,
rev = i,
node = hn))
parity = 1 - parity
yield l
cl = self.repo.changelog
mf = cl.read(cl.tip())[0]
count = cl.count()
start = max(0, count - self.maxchanges)
end = min(count, start + self.maxchanges)
pos = end - 1
yield self.t("summary",
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579 desc = self.repo.ui.config("web", "description", "unknown"),
owner = (self.repo.ui.config("ui", "username") or # preferred
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 self.repo.ui.config("web", "contact") or # deprecated
self.repo.ui.config("web", "author", "unknown")), # also
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579 lastchange = (0, 0), # FIXME
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 manifest = hex(mf),
tags = tagentries,
shortlog = changelist)
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579
mpm@selenic.com
Revamped templated hgweb
r138 def filediff(self, file, changeset):
cl = self.repo.changelog
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 n = self.repo.lookup(changeset)
changeset = hex(n)
mpm@selenic.com
Revamped templated hgweb
r138 p1 = cl.parents(n)[0]
cs = cl.read(n)
mf = self.repo.manifest.read(cs[0])
mpm@selenic.com
Whitespace cleanups...
r515
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def diff(**map):
mpm@selenic.com
Revamped templated hgweb
r138 yield self.diff(p1, n, file)
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
Revamped templated hgweb
r138 yield self.t("filediff",
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 file=file,
filenode=hex(mf.get(file, nullid)),
node=changeset,
rev=self.repo.changelog.rev(n),
Muli Ben-Yehuda
- duplicate the parent link logic to show child links...
r1606 parent=self.siblings(cl.parents(n), cl.rev),
child=self.siblings(cl.children(n), cl.rev),
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 diff=diff)
mpm@selenic.com
Whitespace cleanups...
r515
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 def archive(self, req, cnode, type):
mpm@selenic.com
Various cleanups for tarball support...
r1078 cs = self.repo.changelog.read(cnode)
mnode = cs[0]
mf = self.repo.manifest.read(mnode)
rev = self.repo.manifest.rev(mnode)
reponame = re.sub(r"\W+", "-", self.reponame)
name = "%s-%s/" % (reponame, short(cnode))
mpm@selenic.com
hgweb: add mdiff / fix sorting of archives
r1112 files = mf.keys()
files.sort()
Wojciech Milkowski
tarball support v0.3 pt 2
r1077 if type == 'zip':
Thomas Arendsen Hein
Fixed import needed to serve zip files which broke because of other changes.
r1165 tmp = tempfile.mkstemp()[1]
mpm@selenic.com
Various cleanups for tarball support...
r1078 try:
zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED)
mpm@selenic.com
hgweb: add mdiff / fix sorting of archives
r1112 for f in files:
mpm@selenic.com
Various cleanups for tarball support...
r1078 zf.writestr(name + f, self.repo.file(f).read(mf[f]))
zf.close()
Wojciech Milkowski
tarball support v0.3...
r1076
mpm@selenic.com
Various cleanups for tarball support...
r1078 f = open(tmp, 'r')
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.httphdr('application/zip', name[:-1] + '.zip',
mpm@selenic.com
Various cleanups for tarball support...
r1078 os.path.getsize(tmp))
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(f.read())
mpm@selenic.com
Various cleanups for tarball support...
r1078 f.close()
finally:
os.unlink(tmp)
Wojciech Milkowski
tarball support v0.3...
r1076
Wojciech Milkowski
tarball support v0.3 pt 2
r1077 else:
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 tf = tarfile.TarFile.open(mode='w|' + type, fileobj=req.out)
mpm@selenic.com
Various cleanups for tarball support...
r1078 mff = self.repo.manifest.readflags(mnode)
Wojciech Milkowski
tarball support v0.3 pt 2
r1077 mtime = int(time.time())
Wojciech Milkowski
tarball support v0.3...
r1076
Edouard Gomez
Output Content-encoding for tar.gz and tar.bz2 snapshots...
r1185 if type == "gz":
encoding = "gzip"
else:
encoding = "x-bzip2"
Thomas Arendsen Hein
Cleanup of tabs and trailing spaces.
r1308 req.header([('Content-type', 'application/x-tar'),
Edouard Gomez
Output Content-encoding for tar.gz and tar.bz2 snapshots...
r1185 ('Content-disposition', 'attachment; filename=%s%s%s' %
(name[:-1], '.tar.', type)),
('Content-encoding', encoding)])
mpm@selenic.com
hgweb: add mdiff / fix sorting of archives
r1112 for fname in files:
mpm@selenic.com
Various cleanups for tarball support...
r1078 rcont = self.repo.file(fname).read(mf[fname])
Wojciech Milkowski
tarball support v0.3 pt 2
r1077 finfo = tarfile.TarInfo(name + fname)
finfo.mtime = mtime
finfo.size = len(rcont)
finfo.mode = mff[fname] and 0755 or 0644
tf.addfile(finfo, StringIO.StringIO(rcont))
tf.close()
Wojciech Milkowski
tarball support v0.3...
r1076
mpm@selenic.com
Revamped templated hgweb
r138 # add tags to things
# tags -> list of changesets corresponding to tags
# find tag, changeset, file
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 def run(self, req=hgrequest()):
Matt Mackall
Clean up paths passed to hgweb...
r1646 def clean(path):
Lee Cantey
Fix manifest view on Windows
r1864 p = util.normpath(path)
Matt Mackall
Clean up paths passed to hgweb...
r1646 if p[:2] == "..":
raise "suspicious path"
return p
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857 def header(**map):
yield self.t("header", **map)
def footer(**map):
yield self.t("footer", **map)
Matt Mackall
hgweb: add shortcuts for all the web commands / fix empty arg bug
r1409
Benoit Boissinot
hgweb: allow urls to be shorter by using shortcuts...
r1406 def expand_form(form):
shortcuts = {
Matt Mackall
hgweb: add shortcuts for all the web commands / fix empty arg bug
r1409 'cl': [('cmd', ['changelog']), ('rev', None)],
Benoit Boissinot
hgweb: allow urls to be shorter by using shortcuts...
r1406 'cs': [('cmd', ['changeset']), ('node', None)],
Matt Mackall
hgweb: add shortcuts for all the web commands / fix empty arg bug
r1409 'f': [('cmd', ['file']), ('filenode', None)],
'fl': [('cmd', ['filelog']), ('filenode', None)],
'fd': [('cmd', ['filediff']), ('node', None)],
'fa': [('cmd', ['annotate']), ('filenode', None)],
'mf': [('cmd', ['manifest']), ('manifest', None)],
'ca': [('cmd', ['archive']), ('node', None)],
'tags': [('cmd', ['tags'])],
'tip': [('cmd', ['changeset']), ('node', ['tip'])],
Josef "Jeff" Sipek
[hgweb] Static content serving
r1777 'static': [('cmd', ['static']), ('file', None)]
Benoit Boissinot
hgweb: allow urls to be shorter by using shortcuts...
r1406 }
Matt Mackall
hgweb: add shortcuts for all the web commands / fix empty arg bug
r1409
Benoit Boissinot
hgweb: allow urls to be shorter by using shortcuts...
r1406 for k in shortcuts.iterkeys():
if form.has_key(k):
for name, value in shortcuts[k]:
if value is None:
value = form[k]
form[name] = value
del form[k]
Jeff Sipek
[PATCH] Propagate the template map though recursively...
r857
mpm@selenic.com
hgweb: watch changelog for changes...
r258 self.refresh()
jake@edge2.net
making hgweb class
r132
Benoit Boissinot
hgweb: allow urls to be shorter by using shortcuts...
r1406 expand_form(req.form)
mpm@selenic.com
hgweb: change startup argument processing...
r987 t = self.repo.ui.config("web", "templates", templatepath())
Josef "Jeff" Sipek
[hgweb] Static content serving
r1777 static = self.repo.ui.config("web", "static", os.path.join(t,"static"))
mpm@selenic.com
hgweb: add [web] section to hgrc...
r938 m = os.path.join(t, "map")
mpm@selenic.com
Add web:style option
r986 style = self.repo.ui.config("web", "style", "")
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if req.form.has_key('style'):
style = req.form['style'][0]
mpm@selenic.com
Add web:style option
r986 if style:
b = os.path.basename("map-" + style)
mpm@selenic.com
Fix RSS feeds
r983 p = os.path.join(t, b)
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if os.path.isfile(p):
m = p
mpm@selenic.com
Whitespace cleanups...
r515
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 port = req.env["SERVER_PORT"]
mpm@selenic.com
Add globals to templater/fixup RSS...
r601 port = port != "80" and (":" + port) or ""
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 uri = req.env["REQUEST_URI"]
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if "?" in uri:
uri = uri.split("?")[0]
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 url = "http://%s%s%s" % (req.env["SERVER_NAME"], port, uri)
Thomas Arendsen Hein
Use path relative to document root as reponame if published via a web server....
r1172 if not self.reponame:
self.reponame = (self.repo.ui.config("web", "name")
or uri.strip('/') or self.repo.root)
mpm@selenic.com
Add globals to templater/fixup RSS...
r601
mpm@selenic.com
Add a multi-repository server...
r941 self.t = templater(m, common_filters,
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 {"url": url,
"repo": self.reponame,
"header": header,
"footer": footer,
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 })
mpm@selenic.com
hgweb: add template filters, template style maps, and raw pages...
r201
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if not req.form.has_key('cmd'):
req.form['cmd'] = [self.t.cache['default'],]
mpm@selenic.com
Whitespace
r937
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if req.form['cmd'][0] == 'changelog':
mpm@selenic.com
Add multiple keyword search to hgweb...
r538 c = self.repo.changelog.count() - 1
hi = c
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if req.form.has_key('rev'):
hi = req.form['rev'][0]
mpm@selenic.com
hgweb: don't blow up on search for unknown keys
r166 try:
hi = self.repo.changelog.rev(self.repo.lookup(hi))
mpm@selenic.com
hgweb: fix scope for RepoError
r1219 except hg.RepoError:
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(self.search(hi))
mpm@selenic.com
Add multiple keyword search to hgweb...
r538 return
mpm@selenic.com
More whitespace cleanups...
r575
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(self.changelog(hi))
mpm@selenic.com
Whitespace cleanups...
r515
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'changeset':
req.write(self.changeset(req.form['node'][0]))
mpm@selenic.com
Revamped templated hgweb
r138
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'manifest':
Matt Mackall
Clean up paths passed to hgweb...
r1646 req.write(self.manifest(req.form['manifest'][0],
clean(req.form['path'][0])))
mpm@selenic.com
Revamped templated hgweb
r138
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'tags':
req.write(self.tags())
mpm@selenic.com
hgweb: add tags links and manifest links...
r168
Josef "Jeff" Sipek
[hgweb] Initial import of the "gitweb" style
r1572 elif req.form['cmd'][0] == 'summary':
req.write(self.summary())
Josef "Jeff" Sipek
Remove tabs, and trailing whitespace from hgweb.py
r1579
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'filediff':
Matt Mackall
Clean up paths passed to hgweb...
r1646 req.write(self.filediff(clean(req.form['file'][0]),
req.form['node'][0]))
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'file':
Matt Mackall
Clean up paths passed to hgweb...
r1646 req.write(self.filerevision(clean(req.form['file'][0]),
req.form['filenode'][0]))
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'annotate':
Matt Mackall
Clean up paths passed to hgweb...
r1646 req.write(self.fileannotate(clean(req.form['file'][0]),
req.form['filenode'][0]))
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'filelog':
Matt Mackall
Clean up paths passed to hgweb...
r1646 req.write(self.filelog(clean(req.form['file'][0]),
req.form['filenode'][0]))
jake@edge2.net
added annotate...
r136
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'heads':
req.httphdr("application/mercurial-0.1")
mpm@selenic.com
make pull work for multiple heads...
r222 h = self.repo.heads()
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(" ".join(map(hex, h)) + "\n")
mpm@selenic.com
make pull work for multiple heads...
r222
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'branches':
req.httphdr("application/mercurial-0.1")
jake@edge2.net
making hgweb class
r132 nodes = []
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if req.form.has_key('nodes'):
nodes = map(bin, req.form['nodes'][0].split(" "))
mpm@selenic.com
Revamped templated hgweb
r138 for b in self.repo.branches(nodes):
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(" ".join(map(hex, b)) + "\n")
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'between':
req.httphdr("application/mercurial-0.1")
jake@edge2.net
making hgweb class
r132 nodes = []
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if req.form.has_key('pairs'):
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 pairs = [map(bin, p.split("-"))
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 for p in req.form['pairs'][0].split(" ")]
mpm@selenic.com
Revamped templated hgweb
r138 for b in self.repo.between(pairs):
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(" ".join(map(hex, b)) + "\n")
jake@edge2.net
making hgweb class
r132
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'changegroup':
req.httphdr("application/mercurial-0.1")
jake@edge2.net
making hgweb class
r132 nodes = []
mpm@selenic.com
hgweb: Make maxfiles, maxchanges, and allowpull proper config options
r964 if not self.allowpull:
mpm@selenic.com
hgweb: add view-only support...
r197 return
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 if req.form.has_key('roots'):
nodes = map(bin, req.form['roots'][0].split(" "))
jake@edge2.net
moving hgweb to mercurial subdir
r131
jake@edge2.net
making hgweb class
r132 z = zlib.compressobj()
Vadim Gelfer
add preoutgoing and outgoing hooks....
r1736 f = self.repo.changegroup(nodes, 'serve')
Matt Mackall
Protocol switch from using generators to stream-like objects....
r635 while 1:
chunk = f.read(4096)
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 if not chunk:
break
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(z.compress(chunk))
jake@edge2.net
making hgweb class
r132
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(z.flush())
jake@edge2.net
moving hgweb to mercurial subdir
r131
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 elif req.form['cmd'][0] == 'archive':
Matt Mackall
Allows abbreviated hashes in hgweb
r1369 changeset = self.repo.lookup(req.form['node'][0])
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 type = req.form['type'][0]
mpm@selenic.com
Various cleanups for tarball support...
r1078 if (type in self.archives and
self.repo.ui.configbool("web", "allow" + type, False)):
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 self.archive(req, changeset, type)
mpm@selenic.com
Various cleanups for tarball support...
r1078 return
Wojciech Milkowski
tarball support v0.3 pt 2
r1077
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(self.t("error"))
Wojciech Milkowski
tarball support v0.3...
r1076
Josef "Jeff" Sipek
[hgweb] Static content serving
r1777 elif req.form['cmd'][0] == 'static':
fname = req.form['file'][0]
Thomas Arendsen Hein
Allow serving static files from hgwebdir to fix CSS and favicon.
r1793 req.write(staticfile(static, fname)
Thomas Arendsen Hein
Fixed wrong (copy&paste) usage of tmpl instead of self.t in hgweb.
r1796 or self.t("error", error="%r not found" % fname))
Josef "Jeff" Sipek
[hgweb] Static content serving
r1777
jake@edge2.net
making hgweb class
r132 else:
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(self.t("error"))
jake@edge2.net
moving hgweb to mercurial subdir
r131
mpm@selenic.com
hgweb: change startup argument processing...
r987 def create_server(repo):
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158
mpm@selenic.com
hgweb: add [web] section to hgrc...
r938 def openlog(opt, default):
if opt and opt != '-':
return open(opt, 'w')
return default
mpm@selenic.com
hgweb: change startup argument processing...
r987 address = repo.ui.config("web", "address", "")
port = int(repo.ui.config("web", "port", 8000))
use_ipv6 = repo.ui.configbool("web", "ipv6")
accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
mpm@selenic.com
hgweb: add [web] section to hgrc...
r938
Samuel Tardieu
Add an option to hg serve to serve file using IPv6
r825 class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
Bryan O'Sullivan
Fix problem with "hg serve" on systems not providing IPv6.
r881 address_family = getattr(socket, 'AF_INET6', None)
def __init__(self, *args, **kwargs):
if self.address_family is None:
Benoit Boissinot
i18n part2: use '_' for all strings who are part of the user interface
r1402 raise hg.RepoError(_('IPv6 not available on this system'))
Bryan O'Sullivan
Fix problem with "hg serve" on systems not providing IPv6.
r881 BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
Samuel Tardieu
Add an option to hg serve to serve file using IPv6
r825
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158 class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler):
mpm@selenic.com
[PATCH] Get "hg serve" to optionally log accesses and errors to files...
r605 def log_error(self, format, *args):
errorlog.write("%s - - [%s] %s\n" % (self.address_string(),
self.log_date_time_string(),
format % args))
mpm@selenic.com
Whitespace
r937
mpm@selenic.com
[PATCH] Get "hg serve" to optionally log accesses and errors to files...
r605 def log_message(self, format, *args):
accesslog.write("%s - - [%s] %s\n" % (self.address_string(),
self.log_date_time_string(),
format % args))
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158 def do_POST(self):
mpm@selenic.com
hgweb: ignore pipe errors...
r271 try:
self.do_hgweb()
except socket.error, inst:
Thomas Arendsen Hein
Added missing 'import errno', and use errno for EPIPE, too.
r1174 if inst[0] != errno.EPIPE:
Thomas Arendsen Hein
Some more spacing/indentation/linebreak cleanups to hgweb.py.
r1063 raise
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158
def do_GET(self):
mpm@selenic.com
hgweb: ignore pipe errors...
r271 self.do_POST()
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158
def do_hgweb(self):
query = ""
p = self.path.find("?")
if p:
query = self.path[p + 1:]
query = query.replace('+', ' ')
mpm@selenic.com
Whitespace cleanups...
r515
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158 env = {}
env['GATEWAY_INTERFACE'] = 'CGI/1.1'
env['REQUEST_METHOD'] = self.command
mpm@selenic.com
[PATCH] Add RSS support to hgweb...
r599 env['SERVER_NAME'] = self.server.server_name
env['SERVER_PORT'] = str(self.server.server_port)
env['REQUEST_URI'] = "/"
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158 if query:
env['QUERY_STRING'] = query
host = self.address_string()
if host != self.client_address[0]:
env['REMOTE_HOST'] = host
env['REMOTE_ADDR'] = self.client_address[0]
if self.headers.typeheader is None:
env['CONTENT_TYPE'] = self.headers.type
else:
env['CONTENT_TYPE'] = self.headers.typeheader
length = self.headers.getheader('content-length')
if length:
env['CONTENT_LENGTH'] = length
accept = []
for line in self.headers.getallmatchingheaders('accept'):
if line[:1] in "\t\n\r ":
accept.append(line.strip())
else:
accept = accept + line[7:].split(',')
env['HTTP_ACCEPT'] = ','.join(accept)
Vincent Wagelaar
Saving sys.argv and sys.stderr is not needed anymore
r1180 req = hgrequest(self.rfile, self.wfile, env)
self.send_response(200, "Script output follows")
hg.run(req)
mpm@selenic.com
Add 'hg serve' command for stand-alone server...
r158
mpm@selenic.com
hgweb: change startup argument processing...
r987 hg = hgweb(repo)
Samuel Tardieu
Add an option to hg serve to serve file using IPv6
r825 if use_ipv6:
return IPv6HTTPServer((address, port), hgwebhandler)
else:
return BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
mpm@selenic.com
[PATCH] Get "hg serve" to print the URL being served...
r603
mpm@selenic.com
Add a multi-repository server...
r941 # This is a stopgap
Eric Hopper
Convert all classes to new-style classes by deriving them from object.
r1559 class hgwebdir(object):
mpm@selenic.com
Add a multi-repository server...
r941 def __init__(self, config):
Vincent Wagelaar
Make sure the repository names don't have slashes at the at or else in some...
r1181 def cleannames(items):
Vadim Gelfer
hgwebdir: export collections of repos...
r1829 return [(name.strip(os.sep), path) for name, path in items]
Vincent Wagelaar
Make sure the repository names don't have slashes at the at or else in some...
r1181
Vadim Gelfer
hgwebdir: export collections of repos...
r1829 if isinstance(config, (list, tuple)):
Vincent Wagelaar
Make sure the repository names don't have slashes at the at or else in some...
r1181 self.repos = cleannames(config)
Vadim Gelfer
hgwebdir: export collections of repos...
r1829 elif isinstance(config, dict):
Vincent Wagelaar
Make sure the repository names don't have slashes at the at or else in some...
r1181 self.repos = cleannames(config.items())
Thomas Arendsen Hein
Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
r1143 self.repos.sort()
else:
cp = ConfigParser.SafeConfigParser()
cp.read(config)
Vadim Gelfer
hgwebdir: export collections of repos...
r1829 self.repos = []
if cp.has_section('paths'):
self.repos.extend(cleannames(cp.items('paths')))
if cp.has_section('collections'):
for prefix, root in cp.items('collections'):
for path in util.walkrepos(root):
repo = os.path.normpath(path)
name = repo
if name.startswith(prefix):
name = name[len(prefix):]
self.repos.append((name.lstrip(os.sep), repo))
Thomas Arendsen Hein
Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
r1143 self.repos.sort()
mpm@selenic.com
Add a multi-repository server...
r941
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 def run(self, req=hgrequest()):
mpm@selenic.com
Add a multi-repository server...
r941 def header(**map):
yield tmpl("header", **map)
def footer(**map):
yield tmpl("footer", **map)
Thomas Arendsen Hein
Cleaned up hgweb.hgwebdir.run()
r1142 m = os.path.join(templatepath(), "map")
mpm@selenic.com
Add a multi-repository server...
r941 tmpl = templater(m, common_filters,
{"header": header, "footer": footer})
def entries(**map):
parity = 0
Thomas Arendsen Hein
Use ConfigParser only in hgwebdir.__init__()
r1141 for name, path in self.repos:
mpm@selenic.com
Clean up hgweb imports...
r1213 u = ui.ui()
Thomas Arendsen Hein
Make .hg/hgrc optional for repositories published by hgwebdir.
r1170 try:
Benoit Boissinot
make readconfig take a filename instead of a file pointer as argument...
r1473 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
Thomas Arendsen Hein
Make .hg/hgrc optional for repositories published by hgwebdir.
r1170 except IOError:
pass
Thomas Arendsen Hein
Don't create repo objects in hgwebdir, ui object is enough.
r1140 get = u.config
mpm@selenic.com
Add a multi-repository server...
r941
Vincent Wagelaar
Make sure the repository names don't have slashes at the at or else in some...
r1181 url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name])
Thomas Arendsen Hein
Cleaned up hgweb.hgwebdir.run()
r1142 .replace("//", "/"))
mpm@selenic.com
Minor hgwebdir tweaks...
r1022
mpm@selenic.com
hgwebdir: Fix date display
r1348 # update time with local timezone
TK Soh
hgweb: fix traceback by skipping invalid repo paths
r1524 try:
d = (get_mtime(path), util.makedate()[1])
except OSError:
continue
mpm@selenic.com
hgwebdir: Fix date display
r1348
mpm@selenic.com
hgweb: use ui:username rather than web:contact...
r1260 yield dict(contact=(get("ui", "username") or # preferred
get("web", "contact") or # deprecated
get("web", "author", "unknown")), # also
Thomas Arendsen Hein
Longer variable names in hgwebdir: l->repos, v->name, r->path
r1130 name=get("web", "name", name),
benoit.boissinot@ens-lyon.fr
pep-0008 cleanup...
r1062 url=url,
parity=parity,
shortdesc=get("web", "description", "unknown"),
mpm@selenic.com
hgwebdir: Fix date display
r1348 lastupdate=d)
mpm@selenic.com
Add a multi-repository server...
r941
parity = 1 - parity
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 virtual = req.env.get("PATH_INFO", "").strip('/')
Thomas Arendsen Hein
Cleaned up hgweb.hgwebdir.run()
r1142 if virtual:
Thomas Arendsen Hein
Use ConfigParser only in hgwebdir.__init__()
r1141 real = dict(self.repos).get(virtual)
if real:
Thomas Arendsen Hein
Catch IOErrors and RepoErrors when serving repositories via hgweb.
r1554 try:
hgweb(real).run(req)
except IOError, inst:
req.write(tmpl("error", error=inst.strerror))
except hg.RepoError, inst:
req.write(tmpl("error", error=str(inst)))
Ollivier Robert
Use a template for the error message.
r1123 else:
Vincent Wagelaar
Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object....
r1159 req.write(tmpl("notfound", repo=virtual))
Thomas Arendsen Hein
Cleaned up hgweb.hgwebdir.run()
r1142 else:
Thomas Arendsen Hein
Allow serving static files from hgwebdir to fix CSS and favicon.
r1793 if req.form.has_key('static'):
static = os.path.join(templatepath(), "static")
fname = req.form['static'][0]
req.write(staticfile(static, fname)
or tmpl("error", error="%r not found" % fname))
else:
req.write(tmpl("index", entries=entries))