annotate mercurial/dicthelpers.py @ 20172:181108726ea5

http: reuse authentication info after the first failed request (issue3567) Context: mercurial access to repository server with http access, and this server is protected by basic auth. Before patch: * mercurial try an anonymous access to server, server return 401 response and mercurial resend request with login / password information After patch: * mercurial try an anonymous access to server, server return 401 response. For all subsequent requests, mercurial keep in memory this information (this server need basic auth information). This patch reduce the number of http access against mercurial server. Example, before patch : 10.10.168.170 - - [25/Oct/2013:15:44:51 +0200] "GET /hg/testagt?cmd=capabilities HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:44:52 +0200] "GET /hg/testagt?cmd=capabilities HTTP/1.1" 200 147 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:00 +0200] "GET /hg/testagt?cmd=capabilities HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:01 +0200] "GET /hg/testagt?cmd=capabilities HTTP/1.1" 200 147 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:03 +0200] "GET /hg/testagt?cmd=batch HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:04 +0200] "GET /hg/testagt?cmd=batch HTTP/1.1" 200 42 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:06 +0200] "GET /hg/testagt?cmd=getbundle HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:07 +0200] "GET /hg/testagt?cmd=getbundle HTTP/1.1" 200 61184 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:09 +0200] "GET /hg/testagt?cmd=listkeys HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:10 +0200] "GET /hg/testagt?cmd=listkeys HTTP/1.1" 200 15 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:12 +0200] "GET /hg/testagt?cmd=listkeys HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [25/Oct/2013:15:45:12 +0200] "GET /hg/testagt?cmd=listkeys HTTP/1.1" 200 - "-" "mercurial/proto-1.0" Example after patch : 10.10.168.170 - - [28/Oct/2013:11:49:14 +0100] "GET /hg/testagt?cmd=capabilities HTTP/1.1" 401 260 "-" "mercurial/proto-1.0" 10.10.168.170 - - [28/Oct/2013:11:49:15 +0100] "GET /hg/testagt?cmd=capabilities HTTP/1.1" 200 147 "-" "mercurial/proto-1.0" 10.10.168.170 - - [28/Oct/2013:11:49:17 +0100] "GET /hg/testagt?cmd=batch HTTP/1.1" 200 42 "-" "mercurial/proto-1.0" 10.10.168.170 - - [28/Oct/2013:11:49:19 +0100] "GET /hg/testagt?cmd=getbundle HTTP/1.1" 200 61184 "-" "mercurial/proto-1.0" 10.10.168.170 - - [28/Oct/2013:11:49:22 +0100] "GET /hg/testagt?cmd=listkeys HTTP/1.1" 200 15 "-" "mercurial/proto-1.0" 10.10.168.170 - - [28/Oct/2013:11:49:24 +0100] "GET /hg/testagt?cmd=listkeys HTTP/1.1" 200 - "-" "mercurial/proto-1.0" In this last example, you can see only one 401 response.
author Stéphane Klein <contact@stephane-klein.info>
date Mon, 25 Nov 2013 17:18:12 +0100
parents ed46c2b98b0d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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