##// END OF EJS Templates
namespaces: let namespaces override singlenode() definition...
namespaces: let namespaces override singlenode() definition Some namespaces have multiple nodes per name (meaning that their namemap() returns multiple nodes). One such namespace is the "topics" namespace (from the evolve repo). We also have our own internal namespace at Google (for review units) that has multiple nodes per name. These namespaces may not want to use the default "pick highest revnum" resolution that we currently use when resolving a name to a single node. As an example, they may decide that `hg co <name>` should check out a commit that's last in some sense even if an earlier commit had just been amended and thus had a higher revnum [1]. This patch gives the namespace the option to continue to return multiple nodes and to override how the best node is picked. Allowing namespaces to override that may also be useful as an optimization (it may be cheaper for the namespace to find just that node). I have been arguing (in D3715) for using all the nodes returned from namemap() when resolving the symbol to a revset, so e.g. `hg log -r stable` would resolve to *all* nodes on stable, not just the one with the highest revnum (except that I don't actually think we should change it for the branch namespace because of BC). Most people seem opposed to that. If we decide not to do it, I think we can deprecate the namemap() function in favor of the new singlenode() (I find it weird to have namespaces, like the branch namespace, where namemap() isn't nodemap()'s inverse). I therefore think this patch makes sense regardless of what we decide on that issue. [1] Actually, even the branch namespace would have wanted to override singlenode() if it had supported multiple nodes. That's because closes branch heads are mostly ignored, so "hg co default" will not check out the highest-revnum node if that's a closed head. Differential Revision: https://phab.mercurial-scm.org/D3852

File last commit:

r37036:3e74d3cc default
r38505:4c068365 @58 default
Show More
__init__.py
98 lines | 3.5 KiB | text/x-python | PythonLexer
Martin Geisler
highlight: add copyright and license header
r8251 # highlight - syntax highlighting in hgweb, based on Pygments
#
# Copyright 2008, 2009 Patrick Mezard <pmezard@gmail.com> and others
#
# This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Martin Geisler
highlight: add copyright and license header
r8251 #
# The original module was split in an interface and an implementation
# file to defer pygments loading and speedup extension setup.
Dirkjan Ochtman
extensions: fix up description lines some more
r8932 """syntax highlighting for hgweb (requires Pygments)
Patrick Mezard
highlight: split code to improve startup times
r6938
Martin Geisler
highlight: wrap docstrings at 70 characters
r9262 It depends on the Pygments syntax highlighting library:
http://pygments.org/
Patrick Mezard
highlight: split code to improve startup times
r6938
Gregory Szorc
highlight: add option to prevent content-only based fallback...
r26680 There are the following configuration options::
Patrick Mezard
highlight: split code to improve startup times
r6938
Martin Geisler
highlight: use reST syntax for literal block
r9210 [web]
av6
highlight: add highlightfiles config option which takes a fileset (issue3005)...
r26249 pygments_style = <style> (default: colorful)
highlightfiles = <fileset> (default: size('<5M'))
Gregory Szorc
highlight: add option to prevent content-only based fallback...
r26680 highlightonlymatchfilename = <bool> (default False)
``highlightonlymatchfilename`` will only highlight files if their type could
be identified by their filename. When this is not enabled (the default),
Pygments will try very hard to identify the file type from content and any
match (even matches with a low confidence score) will be used.
Patrick Mezard
highlight: split code to improve startup times
r6938 """
Pulkit Goyal
py3: make files use absolute_import and print_function...
r29485 from __future__ import absolute_import
from . import highlight
from mercurial.hgweb import (
webcommands,
webutil,
)
from mercurial import (
extensions,
fileset,
)
Augie Fackler
extensions: change magic "shipped with hg" string...
r29841 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
Augie Fackler
extensions: document that `testedwith = 'internal'` is special...
r25186 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
# be specifying the version(s) of Mercurial they are tested with, or
# leave the attribute unspecified.
Augie Fackler
extensions: change magic "shipped with hg" string...
r29841 testedwith = 'ships-with-hg-core'
Patrick Mezard
highlight: split code to improve startup times
r6938
Gregory Szorc
highlight: inline checkfctx()...
r26679 def pygmentize(web, field, fctx, tmpl):
style = web.config('web', 'pygments_style', 'colorful')
expr = web.config('web', 'highlightfiles', "size('<5M')")
Gregory Szorc
highlight: add option to prevent content-only based fallback...
r26680 filenameonly = web.configbool('web', 'highlightonlymatchfilename', False)
Gregory Szorc
highlight: inline checkfctx()...
r26679
av6
highlight: add highlightfiles config option which takes a fileset (issue3005)...
r26249 ctx = fctx.changectx()
tree = fileset.parse(expr)
mctx = fileset.matchctx(ctx, subset=[fctx.path()], status=None)
Gregory Szorc
highlight: inline checkfctx()...
r26679 if fctx.path() in fileset.getset(mctx, tree):
Gregory Szorc
highlight: add option to prevent content-only based fallback...
r26680 highlight.pygmentize(field, fctx, style, tmpl,
guessfilenameonly=filenameonly)
Gregory Szorc
highlight: consolidate duplicate code...
r26678
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 def filerevision_highlight(orig, web, fctx):
Yuya Nishihara
highlight: peek Content-Type header set by hgweb...
r37036 mt = web.res.headers['Content-Type']
Rocco Rutte
highlight: only pygmentize for HTML mimetypes...
r6987 # only pygmentize for mimetype containing 'html' so we both match
# 'text/html' and possibly 'application/xhtml+xml' in the future
# so that we don't have to touch the extension when the mimetype
# for a template changes; also hgweb optimizes the case that a
# raw file is sent using rawfile() and doesn't call us, so we
# can't clash with the file's content-type here in case we
# pygmentize a html file
if 'html' in mt:
Gregory Szorc
hgweb: use templater on requestcontext instance...
r36900 pygmentize(web, 'fileline', fctx, web.tmpl)
Gregory Szorc
highlight: consolidate duplicate code...
r26678
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 return orig(web, fctx)
Patrick Mezard
highlight: split code to improve startup times
r6938
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 def annotate_highlight(orig, web):
Yuya Nishihara
highlight: peek Content-Type header set by hgweb...
r37036 mt = web.res.headers['Content-Type']
Rocco Rutte
highlight: only pygmentize for HTML mimetypes...
r6987 if 'html' in mt:
Gregory Szorc
hgweb: pass modern request type into various webutil functions (API)...
r36902 fctx = webutil.filectx(web.repo, web.req)
Gregory Szorc
hgweb: use templater on requestcontext instance...
r36900 pygmentize(web, 'annotateline', fctx, web.tmpl)
Gregory Szorc
highlight: consolidate duplicate code...
r26678
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 return orig(web)
Patrick Mezard
highlight: split code to improve startup times
r6938
Gregory Szorc
hgweb: stop passing req and tmpl into @webcommand functions (API)...
r36903 def generate_css(web):
Patrick Mezard
highlight: split code to improve startup times
r6938 pg_style = web.config('web', 'pygments_style', 'colorful')
Mads Kiilerich
check-code: check for spaces around = for named parameters
r19872 fmter = highlight.HtmlFormatter(style=pg_style)
Gregory Szorc
hgweb: port most @webcommand to use modern response type...
r36887 web.res.headers['Content-Type'] = 'text/css'
web.res.setbodybytes(''.join([
'/* pygments_style = %s */\n\n' % pg_style,
fmter.get_style_defs(''),
]))
Gregory Szorc
hgweb: always return iterable from @webcommand functions (API)...
r36896 return web.res.sendresponse()
Patrick Mezard
highlight: split code to improve startup times
r6938
Martin Geisler
highlight: move code from module top-level into extsetup
r9409 def extsetup():
# monkeypatch in the new version
Brodie Rao
cleanup: eradicate long lines
r16683 extensions.wrapfunction(webcommands, '_filerevision',
filerevision_highlight)
Martin Geisler
highlight: move code from module top-level into extsetup
r9409 extensions.wrapfunction(webcommands, 'annotate', annotate_highlight)
webcommands.highlightcss = generate_css
webcommands.__all__.append('highlightcss')