Chromium Code Reviews| Index: tools/md_browser/md_browser.py |
| diff --git a/tools/md_browser/md_browser.py b/tools/md_browser/md_browser.py |
| old mode 100644 |
| new mode 100755 |
| index 2b968525320c8477f944307f599cc5178d69da94..f2e05f9308db049ac46cf2e7f823cd912f85cf8d |
| --- a/tools/md_browser/md_browser.py |
| +++ b/tools/md_browser/md_browser.py |
| @@ -1,3 +1,4 @@ |
| +#!/usr/bin/env python |
| # Copyright 2015 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| @@ -25,12 +26,16 @@ def main(argv): |
| parser = argparse.ArgumentParser(prog='md_browser') |
| parser.add_argument('-p', '--port', type=int, default=8080, |
| help='port to run on (default = %(default)s)') |
| + parser.add_argument('-d', '--directory', type=str, default=SRC_DIR) |
| args = parser.parse_args(argv) |
| try: |
| - s = Server(args.port, SRC_DIR) |
| + s = Server(args.port, args.directory) |
| print("Listening on http://localhost:%s/" % args.port) |
| - print(" Try loading http://localhost:%s/docs/README.md" % args.port) |
| + if os.path.isfile(os.path.join(args.directory, 'docs', 'README.md')): |
| + print(" Try loading http://localhost:%s/docs/README.md" % args.port) |
| + elif os.path.isfile(os.path.join(args.directory, 'README.md')): |
| + print(" Try loading http://localhost:%s/README.md" % args.port) |
| s.serve_forever() |
| s.shutdown() |
| return 0 |
| @@ -71,7 +76,7 @@ class Server(SocketServer.TCPServer): |
| def __init__(self, port, top_level): |
| SocketServer.TCPServer.__init__(self, ('0.0.0.0', port), Handler) |
| self.port = port |
| - self.top_level = top_level |
| + self.top_level = os.path.abspath(top_level) |
| def server_bind(self): |
| self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) |
| @@ -89,7 +94,7 @@ class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): |
| full_path = os.path.abspath(os.path.join(self.server.top_level, path[1:])) |
| - if not full_path.startswith(SRC_DIR): |
| + if not full_path.startswith(self.server.top_level): |
| self._DoUnknown() |
| elif path == '/doc.css': |
| self._DoCSS('doc.css') |
| @@ -142,9 +147,11 @@ class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): |
| self.wfile.write('<html><body>I do not know how to serve %s.</body>' |
| '</html>' % self.path) |
| - def _Read(self, relpath): |
| + def _Read(self, relpath, relative_to=None): |
| + if relative_to is None: |
| + relative_to = self.server.top_level |
|
Dirk Pranke
2016/05/10 20:35:35
nit: it'd be a bit more idiomatic (and one less li
agable
2016/05/11 00:26:25
That disallows passing "relative_to=''", which wou
Dirk Pranke
2016/05/11 00:32:55
Hm. That seems like something I wouldn't want to s
|
| assert not relpath.startswith(os.sep) |
| - path = os.path.join(self.server.top_level, relpath) |
| + path = os.path.join(relative_to, relpath) |
| with codecs.open(path, encoding='utf-8') as fp: |
| return fp.read() |
| @@ -154,7 +161,8 @@ class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler): |
| self.end_headers() |
| def _WriteTemplate(self, template): |
| - contents = self._Read(os.path.join('tools', 'md_browser', template)) |
| + contents = self._Read(os.path.join('tools', 'md_browser', template), |
| + relative_to=SRC_DIR) |
| self.wfile.write(contents.encode('utf-8')) |