##// END OF EJS Templates
templater: take any string literals as template, but not for rawstring (BC)...
templater: take any string literals as template, but not for rawstring (BC) This patch series is intended to unify the interpretation of string literals. It is breaking change that boldly assumes a. string literal "..." never contains template-like fragment or it is intended to be a template b. we tend to use raw string literal r"..." for regexp pattern in which "{" should have different meaning Currently, we don't have a comprehensible rule how string literals are evaluated in template functions. For example, fill() takes "initialindent" and "hangindent" as templates, but not for "text", whereas "text" is a template in pad() function. date(date, fmt) diff(includepattern, excludepattern) fill(text, width, initialident: T, hangindent: T) get(dict, key) if(expr, then: T, else: T) ifcontains(search, thing, then: T, else: T) ifeq(expr1, expr2, then: T, else: T) indent(text, indentchars, firstline) join(list, sep) label(label: T, expr: T) pad(text: T, width, fillchar, right) revset(query, formatargs...]) rstdoc(text, style) shortest(node, minlength) startswith(pattern, text) strip(text, chars) sub(pattern, replacement, expression: T) word(number, text, separator) expr % template: T T: interpret "string" or r"rawstring" as template This patch series adjusts the rule as follows: a. string literal, '' or "", starts template processing (BC) b. raw string literal, r'' or r"", disables both \-escape and template processing (BC, done by subsequent patches) c. fragment not surrounded by {} is non-templated string "ccc{'aaa'}{r'bbb'}" ------------------ *: template --- c: string --- a: template --- b: rawstring Because this can eliminate the compilation of template arguments from the evaluation phase, "hg log -Tdefault" gets faster. % cd mozilla-central % LANG=C HGRCPATH=/dev/null hg log -Tdefault -r0:10000 --time > /dev/null before: real 4.870 secs (user 4.860+0.000 sys 0.010+0.000) after: real 3.480 secs (user 3.440+0.000 sys 0.030+0.000) Also, this will allow us to parse nested templates at once for better error indication.

File last commit:

r18552:e8efcc8f stable
r25596:c1975809 default
Show More
wsgicgi.py
83 lines | 2.7 KiB | text/x-python | PythonLexer
Eric Hopper
This patch make several WSGI related alterations....
r2506 # hgweb/wsgicgi.py - CGI->WSGI translator
#
# Copyright 2006 Eric Hopper <hopper@omnifarious.org>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # 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.
Eric Hopper
This patch make several WSGI related alterations....
r2506 #
# This was originally copied from the public domain code at
# http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side
import os, sys
Alexis S. L. Carvalho
Switch CGI stdout to binary on windows...
r4076 from mercurial import util
Augie Fackler
hgweb: add support for 100-continue as recommended by PEP 333.
r13570 from mercurial.hgweb import common
Eric Hopper
This patch make several WSGI related alterations....
r2506
def launch(application):
Adrian Buehlmann
rename util.set_binary to setbinary
r14233 util.setbinary(sys.stdin)
util.setbinary(sys.stdout)
Eric Hopper
This patch make several WSGI related alterations....
r2506
Dirkjan Ochtman
use dict.iteritems() rather than dict.items()...
r7622 environ = dict(os.environ.iteritems())
Dirkjan Ochtman
Fix style nit and add some comments to tests.
r5580 environ.setdefault('PATH_INFO', '')
Patrick Mezard
hgweb: improve IIS PATH_INFO fix ee8af8a4d905 (issue1580)...
r10201 if environ.get('SERVER_SOFTWARE', '').startswith('Microsoft-IIS'):
Mads Kiilerich
fix trivial spelling errors
r17424 # IIS includes script_name in PATH_INFO
Patrick Mezard
hgweb: improve IIS PATH_INFO fix ee8af8a4d905 (issue1580)...
r10201 scriptname = environ['SCRIPT_NAME']
if environ['PATH_INFO'].startswith(scriptname):
environ['PATH_INFO'] = environ['PATH_INFO'][len(scriptname):]
Dirkjan Ochtman
hgweb: support broken IIS 5 behavior with .cgi in PATH_INFO
r7406
Augie Fackler
hgweb: add support for 100-continue as recommended by PEP 333.
r13570 stdin = sys.stdin
if environ.get('HTTP_EXPECT', '').lower() == '100-continue':
stdin = common.continuereader(stdin, sys.stdout.write)
environ['wsgi.input'] = stdin
Thomas Arendsen Hein
white space and line break cleanups
r3673 environ['wsgi.errors'] = sys.stderr
environ['wsgi.version'] = (1, 0)
environ['wsgi.multithread'] = False
Eric Hopper
This patch make several WSGI related alterations....
r2506 environ['wsgi.multiprocess'] = True
Thomas Arendsen Hein
white space and line break cleanups
r3673 environ['wsgi.run_once'] = True
Eric Hopper
This patch make several WSGI related alterations....
r2506
Benoit Boissinot
fix spaces/identation issues
r10339 if environ.get('HTTPS', 'off').lower() in ('on', '1', 'yes'):
Eric Hopper
This patch make several WSGI related alterations....
r2506 environ['wsgi.url_scheme'] = 'https'
else:
environ['wsgi.url_scheme'] = 'http'
headers_set = []
headers_sent = []
Alexis S. L. Carvalho
hgweb: fix unbundle....
r2558 out = sys.stdout
Eric Hopper
This patch make several WSGI related alterations....
r2506
def write(data):
if not headers_set:
Thomas Arendsen Hein
white space and line break cleanups
r3673 raise AssertionError("write() before start_response()")
Eric Hopper
This patch make several WSGI related alterations....
r2506
elif not headers_sent:
Thomas Arendsen Hein
white space and line break cleanups
r3673 # Before the first output, send the stored headers
status, response_headers = headers_sent[:] = headers_set
out.write('Status: %s\r\n' % status)
for header in response_headers:
out.write('%s: %s\r\n' % header)
out.write('\r\n')
Eric Hopper
This patch make several WSGI related alterations....
r2506
Alexis S. L. Carvalho
hgweb: fix unbundle....
r2558 out.write(data)
out.flush()
Eric Hopper
This patch make several WSGI related alterations....
r2506
Thomas Arendsen Hein
white space and line break cleanups
r3673 def start_response(status, response_headers, exc_info=None):
Eric Hopper
This patch make several WSGI related alterations....
r2506 if exc_info:
try:
if headers_sent:
# Re-raise original exception if headers sent
Peter Ruibal
use Exception(args)-style raising consistently (py3k compatibility)
r7008 raise exc_info[0](exc_info[1], exc_info[2])
Eric Hopper
This patch make several WSGI related alterations....
r2506 finally:
exc_info = None # avoid dangling circular ref
elif headers_set:
raise AssertionError("Headers already set!")
Thomas Arendsen Hein
white space and line break cleanups
r3673 headers_set[:] = [status, response_headers]
Eric Hopper
This patch make several WSGI related alterations....
r2506 return write
Dirkjan Ochtman
hgweb: fix WSGI iterators handling in CGI adapter (issue1254)
r6922 content = application(environ, start_response)
Konstantin Zemlyak
wsgicgi: call close() on iterable to avoid resource leaks...
r10753 try:
for chunk in content:
write(chunk)
Mads Kiilerich
hgweb.cgi: fix internal WSGI emulation (issue3804)...
r18552 if not headers_sent:
write('') # send headers now if body was empty
Konstantin Zemlyak
wsgicgi: call close() on iterable to avoid resource leaks...
r10753 finally:
Augie Fackler
wsgicgi: use getattr instead of hasattr
r14956 getattr(content, 'close', lambda : None)()