# HG changeset patch # User Dan Villiom Podlaski Christiansen # Date 1293200520 -3600 # Node ID 1775382ff833e90a849e96b4724f23f352231fbe # Parent 18f0084a97c845b9995f20f88d07b4efaaf75b09 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. diff -r 18f0084a97c8 -r 1775382ff833 mercurial/hook.py --- 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: diff -r 18f0084a97c8 -r 1775382ff833 tests/test-hook.t --- 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