hooks: sort any dictionaries set in the environment
The actual order of dictionary items is implementation-defined in
Python, and differs between CPython and PyPy. With this change,
test-hooks.t passes with PyPy.
--- a/mercurial/hook.py Tue Dec 28 13:31:30 2010 -0600
+++ b/mercurial/hook.py Fri Dec 24 15:22:00 2010 +0100
@@ -92,6 +92,12 @@
for k, v in args.iteritems():
if hasattr(v, '__call__'):
v = v()
+ if isinstance(v, dict):
+ # make the dictionary element order stable across Python
+ # implementations
+ v = ('{' +
+ ', '.join('%r: %r' % i for i in sorted(v.iteritems())) +
+ '}')
env['HG_' + k.upper()] = v
if repo:
--- a/tests/test-hook.t Tue Dec 28 13:31:30 2010 -0600
+++ b/tests/test-hook.t Fri Dec 24 15:22:00 2010 +0100
@@ -68,13 +68,13 @@
test generic hooks
$ hg id
- pre-identify hook: HG_ARGS=id HG_OPTS={'tags': None, 'rev': '', 'num': None, 'branch': None, 'id': None} HG_PATS=[]
+ pre-identify hook: HG_ARGS=id HG_OPTS={'branch': None, 'id': None, 'num': None, 'rev': '', 'tags': None} HG_PATS=[]
warning: pre-identify hook exited with status 1
[1]
$ hg cat b
- pre-cat hook: HG_ARGS=cat b HG_OPTS={'rev': '', 'decode': None, 'exclude': [], 'output': '', 'include': []} HG_PATS=['b']
+ pre-cat hook: HG_ARGS=cat b HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': ''} HG_PATS=['b']
b
- post-cat hook: HG_ARGS=cat b HG_OPTS={'rev': '', 'decode': None, 'exclude': [], 'output': '', 'include': []} HG_PATS=['b'] HG_RESULT=0
+ post-cat hook: HG_ARGS=cat b HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': ''} HG_PATS=['b'] HG_RESULT=0
$ cd ../b
$ hg pull ../a