Mercurial > hg
annotate mercurial/dicthelpers.py @ 20629:277dc5f27310
cmdserver: recreate mq object on runcommand in case queue path was changed
repo.mq needs to be recreated after queue path change. Since there is little
benefit to keep invalidated mq object, it always delete repo.mq.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Mon, 03 Mar 2014 19:41:30 +0900 |
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 |