Patchwork [1,of,2,V2] dicthelpers.diff: compare against default for missing values

login
register
mail settings
Submitter Siddharth Agarwal
Date April 10, 2013, 7:43 p.m.
Message ID <a17b73403f3b1ebb2d21.1365623012@sid0x220>
Download mbox | patch
Permalink /patch/1270/
State Accepted
Commit ed46c2b98b0ddf8003d3de3344245984bc4c766c
Headers show

Comments

Siddharth Agarwal - April 10, 2013, 7:43 p.m.
# HG changeset patch
# User Siddharth Agarwal <sid0@fb.com>
# Date 1365622267 25200
#      Wed Apr 10 12:31:07 2013 -0700
# Node ID a17b73403f3b1ebb2d217dbbc1aa502ee19cb879
# Parent  99a410e82b35e71d5f6121a9b9bfc11103678e83
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)

Patch

diff -r 99a410e82b35 -r a17b73403f3b mercurial/dicthelpers.py
--- a/mercurial/dicthelpers.py	Sat Apr 06 19:50:03 2013 -0700
+++ b/mercurial/dicthelpers.py	Wed Apr 10 12:31:07 2013 -0700
@@ -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 -r 99a410e82b35 -r a17b73403f3b tests/test-dicthelpers.py
--- a/tests/test-dicthelpers.py	Sat Apr 06 19:50:03 2013 -0700
+++ b/tests/test-dicthelpers.py	Wed Apr 10 12:31:07 2013 -0700
@@ -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__)