author | Cédric Krier <ced@b2ck.com> |
Sun, 14 Dec 2014 20:30:25 +0100 | |
changeset 374 | 7a1d6b228af6 |
parent 373 | a286d6c6b19c |
child 375 | a41e4382ea6e |
permissions | -rw-r--r-- |
242
03d8f07230b3
Tidy up file prologues; move credits to CREDITS
Paul Crowley <paul@lshift.net>
parents:
78
diff
changeset
|
1 |
""" |
03d8f07230b3
Tidy up file prologues; move credits to CREDITS
Paul Crowley <paul@lshift.net>
parents:
78
diff
changeset
|
2 |
Hook to log changesets pushed and pulled |
03d8f07230b3
Tidy up file prologues; move credits to CREDITS
Paul Crowley <paul@lshift.net>
parents:
78
diff
changeset
|
3 |
""" |
54 | 4 |
|
5 |
from mercurial.i18n import _ |
|
6 |
import mercurial.util |
|
7 |
import mercurial.node |
|
8 |
||
9 |
import os |
|
10 |
import time |
|
262
675474f5be32
New log file format based on JSON/YAML
Paul Crowley <paul@lshift.net>
parents:
242
diff
changeset
|
11 |
import fcntl |
296
6feeef02c057
Prefer import json over import simplejson
Paul Crowley <paul@lshift.net>
parents:
295
diff
changeset
|
12 |
|
311 | 13 |
try: |
296
6feeef02c057
Prefer import json over import simplejson
Paul Crowley <paul@lshift.net>
parents:
295
diff
changeset
|
14 |
import json |
312
4e65f8242c0b
Oops, test for the right attribute of json
Paul Crowley <paul@lshift.net>
parents:
311
diff
changeset
|
15 |
json.dumps |
311 | 16 |
except ImportError: |
296
6feeef02c057
Prefer import json over import simplejson
Paul Crowley <paul@lshift.net>
parents:
295
diff
changeset
|
17 |
import simplejson as json |
6feeef02c057
Prefer import json over import simplejson
Paul Crowley <paul@lshift.net>
parents:
295
diff
changeset
|
18 |
|
78
2a3407a14654
Replaced env vars with Python globals
Paul Crowley <paul@lshift.net>
parents:
67
diff
changeset
|
19 |
from mercurialserver import ruleset, changes |
2a3407a14654
Replaced env vars with Python globals
Paul Crowley <paul@lshift.net>
parents:
67
diff
changeset
|
20 |
|
373
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
21 |
def writelog(repo, op, **kw): |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
22 |
"""Write a log entry in the mercurial-server log file as a JSON |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
23 |
formatted dict. |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
24 |
|
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
25 |
op is the operation (typically 'push', 'pull' or 'publish') |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
26 |
|
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
27 |
any element in the kw argument is also added in the log entry |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
28 |
dictionnary. |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
29 |
""" |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
30 |
logentry = kw.copy() |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
31 |
logentry.update(dict( |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
32 |
timestamp=time.strftime("%Y-%m-%d_%H:%M:%S Z", time.gmtime()), |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
33 |
op=op, |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
34 |
key=ruleset.rules.get('user'), |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
35 |
ssh_connection=os.environ['SSH_CONNECTION'],)) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
36 |
with open(repo.join("mercurial-server.log"), "a+") as log: |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
37 |
fcntl.flock(log.fileno(), fcntl.LOCK_EX) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
38 |
log.seek(0, os.SEEK_END) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
39 |
# YAML log file format |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
40 |
log.write("- %s\n" % json.dumps(data)) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
41 |
|
54 | 42 |
def hook(ui, repo, hooktype, node=None, source=None, **kwargs): |
55 | 43 |
if hooktype == 'changegroup': |
44 |
op = "push" |
|
45 |
elif hooktype == 'outgoing': |
|
46 |
op = "pull" |
|
47 |
else: |
|
373
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
48 |
raise mercurial.util.Abort(_('servelog.hook installed as wrong hook type,' |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
49 |
' must be changegroup or outgoing but is %s') % hooktype) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
50 |
writelog(repo, op, |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
51 |
nodes=[mercurial.node.hex(ctx.node()) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
52 |
for ctx in changes.changes(repo, node)]) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
53 |
|
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
54 |
def phaseshook(ui, repo, hooktype, node=None, source=None, **kwargs): |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
55 |
if hooktype == 'pushkey': |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
56 |
if kwargs.get('namespace') == 'phases': |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
57 |
writelog(repo, 'publish', nodes=[kwargs['key']]) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
58 |
else: |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
59 |
raise mercurial.util.Abort(_('servelog.phaseshook installed as wrong hook type,' |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
60 |
' must be pushkey but is %s') % hooktype) |
a286d6c6b19c
Log phase transitions (draft->public)
David Douard <david.douard@logilab.fr>
parents:
312
diff
changeset
|
61 |