Mercurial > hg
annotate mercurial/dicthelpers.py @ 22304:5678b0e3608f
templater: enable alias predicates to be used in "revset()" function
Before this patch, predicates defined in "[revsetalias]" can't be used
in the query specified to template function "revset()", because:
- "revset()" uses "localrepository.revs()" to get query result, but
- "localrepository.revs()" passes "None" as "ui" to "revset.match()", then
- "revset.match()" can't recognize any alias predicates
To enable alias predicates to be used in "revset()" function, this
patch invokes "revset.match()" directly with "repo.ui".
This patch doesn't make "localrepository.revs()" pass "self.ui" to
"revset.match()", because this may be intentional implementation to
prevent alias predicates from shadowing built-in ones and breaking
functions internally using "localrepository.revs()".
Even if it isn't intentional one, the check for shadowing should be
implemented (maybe on default branch) before fixing it for safety.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Sat, 23 Aug 2014 21:23:02 +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 |