##// END OF EJS Templates
hgweb: clarify which address and port can/cannot be bound at startup (bug 769)...
hgweb: clarify which address and port can/cannot be bound at startup (bug 769) The error message at startup when the address/port could not be bound was confusing: hg serve abort: cannot start server: Address already in use Be more explicit: $ hg serve -a localhost abort: cannot start server at 'localhost:8000': Address already in use Also be more explicit on success, showing hostname and ip address/port: $ hg -v serve -a localhost -p 80 listening at http://localhost/ (127.0.0.1:80) We are careful to handle a missconfigured machine whose hostname does not resolve, falling back to the address given at the command line. Remove a dead-code error message.

File last commit:

r6123:f7f25f58 merge default
r6262:de7256c8 default
Show More
common.py
118 lines | 3.9 KiB | text/x-python | PythonLexer
Eric Hopper
Fixing up comment headers for split up code.
r2391 # hgweb/common.py - Utility functions needed by hgweb_mod and hgwebdir_mod
Eric Hopper
Final stage of the hgweb split up....
r2356 #
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
Vadim Gelfer
update copyrights.
r2859 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
Eric Hopper
Final stage of the hgweb split up....
r2356 #
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 import errno, mimetypes, os
Dirkjan Ochtman
hgweb: explicit response status
r5993 HTTP_OK = 200
HTTP_BAD_REQUEST = 400
HTTP_NOT_FOUND = 404
HTTP_SERVER_ERROR = 500
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 class ErrorResponse(Exception):
def __init__(self, code, message=None):
Exception.__init__(self)
self.code = code
Bryan O'Sullivan
hgweb: fix breaking tests on Python < 2.5
r5563 if message:
self.message = message
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 else:
Bryan O'Sullivan
hgweb: fix breaking tests on Python < 2.5
r5563 self.message = _statusmessage(code)
def _statusmessage(code):
from BaseHTTPServer import BaseHTTPRequestHandler
responses = BaseHTTPRequestHandler.responses
return responses.get(code, ('Error', 'Unknown error'))[0]
Thomas Arendsen Hein
Removed tabs and trailing whitespace in python files
r5760
Bryan O'Sullivan
hgweb: fix breaking tests on Python < 2.5
r5563 def statusmessage(code):
return '%d %s' % (code, _statusmessage(code))
Eric Hopper
Final stage of the hgweb split up....
r2356
def get_mtime(repo_path):
Benoit Boissinot
switch to the .hg/store layout, fix the tests
r3853 store_path = os.path.join(repo_path, ".hg")
if not os.path.isdir(os.path.join(store_path, "data")):
store_path = os.path.join(store_path, "store")
cl_path = os.path.join(store_path, "00changelog.i")
if os.path.exists(cl_path):
Eric Hopper
Final stage of the hgweb split up....
r2356 return os.stat(cl_path).st_mtime
else:
Benoit Boissinot
switch to the .hg/store layout, fix the tests
r3853 return os.stat(store_path).st_mtime
Eric Hopper
Final stage of the hgweb split up....
r2356
Eric Hopper
Really fix http headers for web UI and issue 254....
r2514 def staticfile(directory, fname, req):
Dirkjan Ochtman
send conservatively capitalized HTTP headers
r5930 """return a file inside directory with guessed Content-Type header
Eric Hopper
Final stage of the hgweb split up....
r2356
fname always uses '/' as directory separator and isn't allowed to
contain unusual path components.
Dirkjan Ochtman
send conservatively capitalized HTTP headers
r5930 Content-Type is guessed using the mimetypes module.
Eric Hopper
Final stage of the hgweb split up....
r2356 Return an empty string if fname is illegal or file not found.
"""
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)
try:
os.stat(path)
ct = mimetypes.guess_type(path)[0] or "text/plain"
Dirkjan Ochtman
hgweb: explicit response status
r5993 req.respond(HTTP_OK, ct, length = os.path.getsize(path))
Wojciech Milkowski
Fix static file serving over HTTP on Windows....
r3244 return file(path, 'rb').read()
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 except TypeError:
Dirkjan Ochtman
hgweb: explicit response status
r5993 raise ErrorResponse(HTTP_SERVER_ERROR, 'illegal file name')
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 except OSError, err:
if err.errno == errno.ENOENT:
Dirkjan Ochtman
hgweb: explicit response status
r5993 raise ErrorResponse(HTTP_NOT_FOUND)
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 else:
Dirkjan Ochtman
hgweb: explicit response status
r5993 raise ErrorResponse(HTTP_SERVER_ERROR, err.strerror)
Thomas Arendsen Hein
hgweb: Search templates in templatepath/style/map, too, using a common function....
r3276
def style_map(templatepath, style):
"""Return path to mapfile for a given style.
Searches mapfile in the following locations:
1. templatepath/style/map
2. templatepath/map-style
3. templatepath/map
"""
locations = style and [os.path.join(style, "map"), "map-"+style] or []
locations.append("map")
for location in locations:
mapfile = os.path.join(templatepath, location)
if os.path.isfile(mapfile):
return mapfile
raise RuntimeError("No hgweb templates found in %r" % templatepath)
Thomas Arendsen Hein
hgweb: use generator to count parity of horizontal stripes for easier reading....
r4462 def paritygen(stripecount, offset=0):
"""count parity of horizontal stripes for easier reading"""
if stripecount and offset:
# account for offset, e.g. due to building the list in reverse
count = (stripecount + offset) % stripecount
parity = (stripecount + offset) / stripecount & 1
else:
count = 0
parity = 0
while True:
yield parity
count += 1
if stripecount and count >= stripecount:
parity = 1 - parity
count = 0
Edward Lee
Add line anchors to annotate, changeset, diff, file views for hgweb
r6122 def countgen(start=0, step=1):
"""count forever -- useful for line numbers"""
while True:
yield start
start += step
Thomas Arendsen Hein
Don't let ui.username override web.contact (issue900)...
r5779 def get_contact(config):
"""Return repo contact information or empty string.
web.contact is the primary source, but if that is not set, try
ui.username or $EMAIL as a fallback to display something useful.
"""
return (config("web", "contact") or
config("ui", "username") or
os.environ.get("EMAIL") or "")