changeset 605:8e82fd763be2

[PATCH] Get "hg serve" to optionally log accesses and errors to files -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] Get "hg serve" to optionally log accesses and errors to files From: Bryan O'Sullivan <bos@serpentine.com> Get "hg serve" to log accesses and errors to files. manifest hash: 573ef524d84cc7d2777f5fd982f2ef47f4bcf668 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCyMA5ywK+sNU5EO8RAp1eAJoD6Qqy6XcGInzZKdo0Qp7gLttYzACfRywL fSGapmCAIaZPoBvoxXTk8Zo= =ZicU -----END PGP SIGNATURE-----
author mpm@selenic.com
date Sun, 03 Jul 2005 20:51:05 -0800
parents 40a66d464ac2
children ea4526f9b1a5
files doc/hg.1.txt mercurial/commands.py mercurial/hgweb.py
diffstat 3 files changed, 39 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/doc/hg.1.txt	Sun Jul 03 20:49:48 2005 -0800
+++ b/doc/hg.1.txt	Sun Jul 03 20:51:05 2005 -0800
@@ -274,13 +274,18 @@
 root::
     Print the root directory of the current repository.
 
-serve [-a addr -n name -p port -t templatedir]::
+serve [-a addr -l logfile -n name -p port -t templatedir]::
     Start a local HTTP repository browser and pull server.
 
+    By default, the server logs accesses to stdout and errors to
+    stderr.  Use the "-A" and "-E" options to log to files.
+
     options:
-    -a, --address <addr> address to use
-    -p, --port <n>       port to use (default: 8000)
-    -n, --name <name>    name to show in web pages (default: working dir)
+    -A, --accesslog <file>   name of access log file to write to
+    -E, --errorlog <file>    name of error log file to write to
+    -a, --address <addr>     address to use
+    -p, --port <n>           port to use (default: 8000)
+    -n, --name <name>        name to show in web pages (default: working dir)
     -t, --templatedir <path> web templates to use
 
 status::
--- a/mercurial/commands.py	Sun Jul 03 20:49:48 2005 -0800
+++ b/mercurial/commands.py	Sun Jul 03 20:51:05 2005 -0800
@@ -794,8 +794,13 @@
 
 def serve(ui, repo, **opts):
     """export the repository via HTTP"""
+    def openlog(opt, default):
+        if opts[opt] and opts[opt] != '-': return open(opts[opt], 'w')
+        else: return default
     httpd = hgweb.create_server(repo.root, opts["name"], opts["templates"],
-                                opts["address"], opts["port"])
+                                opts["address"], opts["port"],
+                                openlog('accesslog', sys.stdout),
+                                openlog('errorlog', sys.stderr))
     if ui.verbose:
         addr, port = httpd.socket.getsockname()
         if addr == '0.0.0.0':
@@ -805,9 +810,9 @@
                 addr = socket.gethostbyaddr(addr)[0]
             except: pass
         if port != 80:
-            ui.status('listening on http://%s:%d/\n' % (addr, port))
+            ui.status('listening at http://%s:%d/\n' % (addr, port))
         else:
-            ui.status('listening on http://%s/\n' % addr)
+            ui.status('listening at http://%s/\n' % addr)
     httpd.serve_forever()
 
 def status(ui, repo):
@@ -973,10 +978,12 @@
                 ("r", "rev", "", "revision")],
                "hg revert [files|dirs]"),
     "root": (root, [], "hg root"),
-    "^serve": (serve, [('p', 'port', 8000, 'listen port'),
-                      ('a', 'address', '', 'interface address'),
-                      ('n', 'name', os.getcwd(), 'repository name'),
-                      ('t', 'templates', "", 'template map')],
+    "^serve": (serve, [('A', 'accesslog', '', 'access log file'),
+                       ('E', 'errorlog', '', 'error log file'),
+                       ('p', 'port', 8000, 'listen port'),
+                       ('a', 'address', '', 'interface address'),
+                       ('n', 'name', os.getcwd(), 'repository name'),
+                       ('t', 'templates', "", 'template map')],
               "hg serve [options]"),
     "^status": (status, [], 'hg status'),
     "tag": (tag,  [('t', 'text', "", 'commit text'),
--- a/mercurial/hgweb.py	Sun Jul 03 20:49:48 2005 -0800
+++ b/mercurial/hgweb.py	Sun Jul 03 20:51:05 2005 -0800
@@ -694,12 +694,22 @@
         else:
             write(self.t("error"))
 
-def create_server(path, name, templates, address, port):
+def create_server(path, name, templates, address, port,
+                  accesslog = sys.stdout, errorlog = sys.stderr):
 
     import BaseHTTPServer
-    import sys, os
 
     class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler):
+        def log_error(self, format, *args):
+            errorlog.write("%s - - [%s] %s\n" % (self.address_string(),
+                                                 self.log_date_time_string(),
+                                                 format % args))
+            
+        def log_message(self, format, *args):
+            accesslog.write("%s - - [%s] %s\n" % (self.address_string(),
+                                                  self.log_date_time_string(),
+                                                  format % args))
+
         def do_POST(self):
             try:
                 self.do_hgweb()
@@ -761,6 +771,8 @@
     hg = hgweb(path, name, templates)
     return BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
 
-def server(path, name, templates, address, port):
-    httpd = create_server(path, name, templates, address, port)
+def server(path, name, templates, address, port,
+           accesslog = sys.stdout, errorlog = sys.stderr):
+    httpd = create_server(path, name, templates, address, port,
+                          accesslog, errorlog)
     httpd.serve_forever()