src/mercurialserver/servelog.py
changeset 262 675474f5be32
parent 242 03d8f07230b3
child 295 9741d82e5b1e
--- a/src/mercurialserver/servelog.py	Tue Nov 30 11:26:08 2010 -0500
+++ b/src/mercurialserver/servelog.py	Fri Dec 17 14:39:25 2010 +0000
@@ -8,6 +8,8 @@
 
 import os
 import time
+import fcntl
+import json
 from mercurialserver import ruleset, changes
 
 def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
@@ -18,13 +20,18 @@
     else:
         raise mercurial.util.Abort(_('servelog installed as wrong hook type,'
             ' must be changegroup or outgoing but is %s') % hooktype)
-    t = time.strftime("%Y-%m-%d_%H:%M:%S", time.gmtime())
-    user = ruleset.rules.get('user')
-    # FIXME: lock it
-    log = open(repo.join("serve-log"), "a+")
+    log = open(repo.join("mercurial-server.log"), "a+")
     try:
-        for ctx in changes.changes(repo, node):
-            log.write("%s %s key=%s changeset=%s\n" % 
-                (t, op, user, mercurial.node.hex(ctx.node())))
+        fcntl.flock(log.fileno(), fcntl.LOCK_EX)
+        log.seek(0, os.SEEK_END)
+        # YAML log file format
+        log.write("- {0}\n".format(json.dumps(dict(
+            timestamp=time.strftime("%Y-%m-%d_%H:%M:%S Z", time.gmtime()),
+            op=op,
+            key=ruleset.rules.get('user'),
+            ssh_connection=os.environ['SSH_CONNECTION'],
+            nodes=[mercurial.node.hex(ctx.node())
+                for ctx in changes.changes(repo, node)],
+         ))))
     finally:
         log.close()