# HG changeset patch # User Siddharth Agarwal # Date 2013-04-10 19:31:07 # Node ID ed46c2b98b0ddf8003d3de3344245984bc4c766c # Parent 46c0ca1ef7e1e62d8acfd5a20961251a640fbd3c dicthelpers.diff: compare against default for missing values This is not only a bit faster, but also aligns with callers' expectations better since we can legitimately have manifestdict's _flags set to '' instead of unset. hg perfmergecalculate -r . before: ! wall 0.139582 comb 0.140000 user 0.140000 sys 0.000000 (best of 59) after: ! wall 0.126154 comb 0.120000 user 0.120000 sys 0.000000 (best of 74) hg perfmergecalculate -r .^ before: ! wall 0.236333 comb 0.240000 user 0.240000 sys 0.000000 (best of 36) after: ! wall 0.212265 comb 0.210000 user 0.210000 sys 0.000000 (best of 45) diff --git a/mercurial/dicthelpers.py b/mercurial/dicthelpers.py --- a/mercurial/dicthelpers.py +++ b/mercurial/dicthelpers.py @@ -11,23 +11,23 @@ def diff(d1, d2, default=None): This includes keys that are present in one dict but not the other, and keys whose values are different. The return value is a dict with values being pairs of values from d1 and d2 respectively, and missing values - represented as default.''' + treated as default, so if a value is missing from one dict and the same as + default in the other, it will not be returned.''' res = {} if d1 is d2: # same dict, so diff is empty return res for k1, v1 in d1.iteritems(): - if k1 in d2: - v2 = d2[k1] - if v1 != v2: - res[k1] = (v1, v2) - else: - res[k1] = (v1, default) + v2 = d2.get(k1, default) + if v1 != v2: + res[k1] = (v1, v2) for k2 in d2: if k2 not in d1: - res[k2] = (default, d2[k2]) + v2 = d2[k2] + if v2 != default: + res[k2] = (default, v2) return res diff --git a/tests/test-dicthelpers.py b/tests/test-dicthelpers.py --- a/tests/test-dicthelpers.py +++ b/tests/test-dicthelpers.py @@ -49,5 +49,11 @@ class testdicthelpers(unittest.TestCase) 'c': ('baz', 456), 'd': (456, 'quux')}) + # check that we compare against default + self.assertEqual(diff(d1, d2, 'baz'), {'a': ('foo', 'foo2'), + 'd': ('baz', 'quux')}) + self.assertEqual(diff(d1, d2, 'quux'), {'a': ('foo', 'foo2'), + 'c': ('baz', 'quux')}) + if __name__ == '__main__': silenttestrunner.main(__name__)