Mercurial > public > mercurial-scm > hg
annotate mercurial/dicthelpers.py @ 20885:f49d60fa40a5
fncache: clean up fncache during strips
Previously the fncache was cleaned up at read time by noticing when it was out
of sync. This caused writes to happen outside the scope of transactions and
could have caused race conditions. With this change, we'll keep the fncache
up-to-date as we go by removing old entries during repair.strip.
author | Durham Goode <durham@fb.com> |
---|---|
date | Mon, 24 Mar 2014 15:43:15 -0700 |
parents | ed46c2b98b0d |
children |
rev | line source |
---|---|
18820
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
1 # dicthelpers.py - helper routines for Python dicts |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
2 # |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
3 # Copyright 2013 Facebook |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
4 # |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
7 |
18847
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
8 def diff(d1, d2, default=None): |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
9 '''Return all key-value pairs that are different between d1 and d2. |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
10 |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
11 This includes keys that are present in one dict but not the other, and |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
12 keys whose values are different. The return value is a dict with values |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
13 being pairs of values from d1 and d2 respectively, and missing values |
18894
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
14 treated as default, so if a value is missing from one dict and the same as |
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
15 default in the other, it will not be returned.''' |
18820
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
16 res = {} |
18847
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
17 if d1 is d2: |
18820
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
18 # same dict, so diff is empty |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
19 return res |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
20 |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
21 for k1, v1 in d1.iteritems(): |
18894
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
22 v2 = d2.get(k1, default) |
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
23 if v1 != v2: |
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
24 res[k1] = (v1, v2) |
18820
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
25 |
18847
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
26 for k2 in d2: |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
27 if k2 not in d1: |
18894
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
28 v2 = d2[k2] |
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
29 if v2 != default: |
ed46c2b98b0d
dicthelpers.diff: compare against default for missing values
Siddharth Agarwal <sid0@fb.com>
parents:
18847
diff
changeset
|
30 res[k2] = (default, v2) |
18847
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
31 |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
32 return res |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
33 |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
34 def join(d1, d2, default=None): |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
35 '''Return all key-value pairs from both d1 and d2. |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
36 |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
37 This is akin to an outer join in relational algebra. The return value is a |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
38 dict with values being pairs of values from d1 and d2 respectively, and |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
39 missing values represented as default.''' |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
40 res = {} |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
41 |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
42 for k1, v1 in d1.iteritems(): |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
43 if k1 in d2: |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
44 res[k1] = (v1, d2[k1]) |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
45 else: |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
46 res[k1] = (v1, default) |
40c679748fa9
dicthelpers: inline diff and join code
Siddharth Agarwal <sid0@fb.com>
parents:
18846
diff
changeset
|
47 |
18820
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
48 if d1 is d2: |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
49 return res |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
50 |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
51 for k2 in d2: |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
52 if k2 not in d1: |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
53 res[k2] = (default, d2[k2]) |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
54 |
a45e44d76c81
mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff
changeset
|
55 return res |