comparison mercurial/dicthelpers.py @ 18894:ed46c2b98b0d

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)
author Siddharth Agarwal <sid0@fb.com>
date Wed, 10 Apr 2013 12:31:07 -0700
parents 40c679748fa9
children
comparison
equal deleted inserted replaced
18892:46c0ca1ef7e1 18894:ed46c2b98b0d
9 '''Return all key-value pairs that are different between d1 and d2. 9 '''Return all key-value pairs that are different between d1 and d2.
10 10
11 This includes keys that are present in one dict but not the other, and 11 This includes keys that are present in one dict but not the other, and
12 keys whose values are different. The return value is a dict with values 12 keys whose values are different. The return value is a dict with values
13 being pairs of values from d1 and d2 respectively, and missing values 13 being pairs of values from d1 and d2 respectively, and missing values
14 represented as default.''' 14 treated as default, so if a value is missing from one dict and the same as
15 default in the other, it will not be returned.'''
15 res = {} 16 res = {}
16 if d1 is d2: 17 if d1 is d2:
17 # same dict, so diff is empty 18 # same dict, so diff is empty
18 return res 19 return res
19 20
20 for k1, v1 in d1.iteritems(): 21 for k1, v1 in d1.iteritems():
21 if k1 in d2: 22 v2 = d2.get(k1, default)
22 v2 = d2[k1] 23 if v1 != v2:
23 if v1 != v2: 24 res[k1] = (v1, v2)
24 res[k1] = (v1, v2)
25 else:
26 res[k1] = (v1, default)
27 25
28 for k2 in d2: 26 for k2 in d2:
29 if k2 not in d1: 27 if k2 not in d1:
30 res[k2] = (default, d2[k2]) 28 v2 = d2[k2]
29 if v2 != default:
30 res[k2] = (default, v2)
31 31
32 return res 32 return res
33 33
34 def join(d1, d2, default=None): 34 def join(d1, d2, default=None):
35 '''Return all key-value pairs from both d1 and d2. 35 '''Return all key-value pairs from both d1 and d2.