Show More
@@ -1594,7 +1594,7 b' def showmarker(fm, marker, index=None):' | |||||
1594 | fm.write('date', '(%s) ', fm.formatdate(marker.date())) |
|
1594 | fm.write('date', '(%s) ', fm.formatdate(marker.date())) | |
1595 | meta = marker.metadata().copy() |
|
1595 | meta = marker.metadata().copy() | |
1596 | meta.pop('date', None) |
|
1596 | meta.pop('date', None) | |
1597 | smeta = {_maybebytestr(k): _maybebytestr(v) for k, v in meta.iteritems()} |
|
1597 | smeta = util.rapply(_maybebytestr, meta) | |
1598 | fm.write('metadata', '{%s}', fm.formatdict(smeta, fmt='%r: %r', sep=', ')) |
|
1598 | fm.write('metadata', '{%s}', fm.formatdict(smeta, fmt='%r: %r', sep=', ')) | |
1599 | fm.plain('\n') |
|
1599 | fm.plain('\n') | |
1600 |
|
1600 |
@@ -148,14 +148,10 b' b"""# example system-wide hg config (see' | |||||
148 | } |
|
148 | } | |
149 |
|
149 | |||
150 | def _maybestrurl(maybebytes): |
|
150 | def _maybestrurl(maybebytes): | |
151 | if maybebytes is None: |
|
151 | return util.rapply(pycompat.strurl, maybebytes) | |
152 | return None |
|
|||
153 | return pycompat.strurl(maybebytes) |
|
|||
154 |
|
152 | |||
155 | def _maybebytesurl(maybestr): |
|
153 | def _maybebytesurl(maybestr): | |
156 | if maybestr is None: |
|
154 | return util.rapply(pycompat.bytesurl, maybestr) | |
157 | return None |
|
|||
158 | return pycompat.bytesurl(maybestr) |
|
|||
159 |
|
155 | |||
160 | class httppasswordmgrdbproxy(object): |
|
156 | class httppasswordmgrdbproxy(object): | |
161 | """Delays loading urllib2 until it's needed.""" |
|
157 | """Delays loading urllib2 until it's needed.""" | |
@@ -168,18 +164,14 b' class httppasswordmgrdbproxy(object):' | |||||
168 | return self._mgr |
|
164 | return self._mgr | |
169 |
|
165 | |||
170 | def add_password(self, realm, uris, user, passwd): |
|
166 | def add_password(self, realm, uris, user, passwd): | |
171 | if isinstance(uris, tuple): |
|
|||
172 | uris = tuple(_maybestrurl(u) for u in uris) |
|
|||
173 | else: |
|
|||
174 | uris = _maybestrurl(uris) |
|
|||
175 | return self._get_mgr().add_password( |
|
167 | return self._get_mgr().add_password( | |
176 | _maybestrurl(realm), uris, |
|
168 | _maybestrurl(realm), _maybestrurl(uris), | |
177 | _maybestrurl(user), _maybestrurl(passwd)) |
|
169 | _maybestrurl(user), _maybestrurl(passwd)) | |
178 |
|
170 | |||
179 | def find_user_password(self, realm, uri): |
|
171 | def find_user_password(self, realm, uri): | |
180 | return tuple(_maybebytesurl(v) for v in |
|
172 | mgr = self._get_mgr() | |
181 |
|
|
173 | return _maybebytesurl(mgr.find_user_password(_maybestrurl(realm), | |
182 |
|
|
174 | _maybestrurl(uri))) | |
183 |
|
175 | |||
184 | def _catchterm(*args): |
|
176 | def _catchterm(*args): | |
185 | raise error.SignalInterrupt |
|
177 | raise error.SignalInterrupt |
@@ -183,6 +183,39 b' os.stat_float_times(False)' | |||||
183 | def safehasattr(thing, attr): |
|
183 | def safehasattr(thing, attr): | |
184 | return getattr(thing, attr, _notset) is not _notset |
|
184 | return getattr(thing, attr, _notset) is not _notset | |
185 |
|
185 | |||
|
186 | def _rapply(f, xs): | |||
|
187 | if xs is None: | |||
|
188 | # assume None means non-value of optional data | |||
|
189 | return xs | |||
|
190 | if isinstance(xs, (list, set, tuple)): | |||
|
191 | return type(xs)(_rapply(f, x) for x in xs) | |||
|
192 | if isinstance(xs, dict): | |||
|
193 | return type(xs)((_rapply(f, k), _rapply(f, v)) for k, v in xs.items()) | |||
|
194 | return f(xs) | |||
|
195 | ||||
|
196 | def rapply(f, xs): | |||
|
197 | """Apply function recursively to every item preserving the data structure | |||
|
198 | ||||
|
199 | >>> def f(x): | |||
|
200 | ... return 'f(%s)' % x | |||
|
201 | >>> rapply(f, None) is None | |||
|
202 | True | |||
|
203 | >>> rapply(f, 'a') | |||
|
204 | 'f(a)' | |||
|
205 | >>> rapply(f, {'a'}) == {'f(a)'} | |||
|
206 | True | |||
|
207 | >>> rapply(f, ['a', 'b', None, {'c': 'd'}, []]) | |||
|
208 | ['f(a)', 'f(b)', None, {'f(c)': 'f(d)'}, []] | |||
|
209 | ||||
|
210 | >>> xs = [object()] | |||
|
211 | >>> rapply(pycompat.identity, xs) is xs | |||
|
212 | True | |||
|
213 | """ | |||
|
214 | if f is pycompat.identity: | |||
|
215 | # fast path mainly for py2 | |||
|
216 | return xs | |||
|
217 | return _rapply(f, xs) | |||
|
218 | ||||
186 | def bytesinput(fin, fout, *args, **kwargs): |
|
219 | def bytesinput(fin, fout, *args, **kwargs): | |
187 | sin, sout = sys.stdin, sys.stdout |
|
220 | sin, sout = sys.stdin, sys.stdout | |
188 | try: |
|
221 | try: |
@@ -123,10 +123,7 b' class webproto(abstractserverproto):' | |||||
123 | return [data[k] for k in keys] |
|
123 | return [data[k] for k in keys] | |
124 |
|
124 | |||
125 | def _args(self): |
|
125 | def _args(self): | |
126 | args = self._req.form.copy() |
|
126 | args = util.rapply(pycompat.bytesurl, self._req.form.copy()) | |
127 | if pycompat.ispy3: |
|
|||
128 | args = {k.encode('ascii'): [v.encode('ascii') for v in vs] |
|
|||
129 | for k, vs in args.items()} |
|
|||
130 | postlen = int(self._req.env.get(r'HTTP_X_HGARGS_POST', 0)) |
|
127 | postlen = int(self._req.env.get(r'HTTP_X_HGARGS_POST', 0)) | |
131 | if postlen: |
|
128 | if postlen: | |
132 | args.update(cgi.parse_qs( |
|
129 | args.update(cgi.parse_qs( |
General Comments 0
You need to be logged in to leave comments.
Login now