Mercurial > hg
annotate mercurial/utils/stringutil.py @ 46490:86b019899737 stable
hooks: forbid ':' in hook name
The `:` character is a special separator in the config and it seems same do to
the same for hooks. This is necessary to improve the experience around the
HGPLAIN behavior change in 5.7. See next changesets for details.
Differential Revision: https://phab.mercurial-scm.org/D9978
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 10 Feb 2021 21:05:05 +0100 |
parents | 89a2afe31e82 |
children | d4ba4d51f85f |
rev | line source |
---|---|
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
1 # stringutil.py - utility for generic string formatting, parsing, etc. |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
1082 | 9 |
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
10 from __future__ import absolute_import |
1082 | 11 |
37476
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
12 import ast |
31453
3b7a6941a6ef
py3: call codecs.escape_encode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31451
diff
changeset
|
13 import codecs |
21907
7e5dfa00e3c2
util: rename 're' to 'remod'
Siddharth Agarwal <sid0@fb.com>
parents:
21857
diff
changeset
|
14 import re as remod |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
15 import textwrap |
39296
ce145f8eface
stringutil: teach pprint() to recognize generators
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39063
diff
changeset
|
16 import types |
3769 | 17 |
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
18 from ..i18n import _ |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
19 from ..thirdparty import attr |
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
20 |
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
21 from .. import ( |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
22 encoding, |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
23 error, |
28818
6041fb8f2da8
pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
28497
diff
changeset
|
24 pycompat, |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
25 ) |
37010
8453699a1f21
util: observable proxy objects for sockets
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
26 |
38474
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
27 # regex special chars pulled from https://bugs.python.org/issue29995 |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
28 # which was part of Python 3.7. |
38477
de275ab362cb
stringutil: update list of re-special characters to include &~
Augie Fackler <augie@google.com>
parents:
38474
diff
changeset
|
29 _respecial = pycompat.bytestr(b'()[]{}?*+-|^$\\.&~# \t\n\r\v\f') |
38474
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
30 _regexescapemap = {ord(i): (b'\\' + i).decode('latin1') for i in _respecial} |
40684
e6c9ef5e11a0
match: provide and use a quick way to escape a single byte
Boris Feld <boris.feld@octobus.net>
parents:
40276
diff
changeset
|
31 regexbytesescapemap = {i: (b'\\' + i) for i in _respecial} |
38474
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
32 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
33 |
38474
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
34 def reescape(pat): |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
35 """Drop-in replacement for re.escape.""" |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
36 # NOTE: it is intentional that this works on unicodes and not |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
37 # bytes, as it's only possible to do the escaping with |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
38 # unicode.translate, not bytes.translate. Sigh. |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
39 wantuni = True |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
40 if isinstance(pat, bytes): |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
41 wantuni = False |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
42 pat = pat.decode('latin1') |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
43 pat = pat.translate(_regexescapemap) |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
44 if wantuni: |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
45 return pat |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
46 return pat.encode('latin1') |
96f65bdf0bf4
stringutil: add a new function to do minimal regex escaping
Augie Fackler <augie@google.com>
parents:
38264
diff
changeset
|
47 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
48 |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
49 def pprint(o, bprefix=False, indent=0, level=0): |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
50 """Pretty print an object.""" |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
51 return b''.join(pprintgen(o, bprefix=bprefix, indent=indent, level=level)) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
52 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
53 |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
54 def pprintgen(o, bprefix=False, indent=0, level=0): |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
55 """Pretty print an object to a generator of atoms. |
39353
0d21b1f1722c
stringutil: refactor core of pprint so it emits chunks
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39296
diff
changeset
|
56 |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
57 ``bprefix`` is a flag influencing whether bytestrings are preferred with |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
58 a ``b''`` prefix. |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
59 |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
60 ``indent`` controls whether collections and nested data structures |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
61 span multiple lines via the indentation amount in spaces. By default, |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
62 no newlines are emitted. |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
63 |
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
64 ``level`` specifies the initial indent level. Used if ``indent > 0``. |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
65 """ |
39353
0d21b1f1722c
stringutil: refactor core of pprint so it emits chunks
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39296
diff
changeset
|
66 |
37619
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
67 if isinstance(o, bytes): |
37750
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
68 if bprefix: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
69 yield b"b'%s'" % escapestr(o) |
39353
0d21b1f1722c
stringutil: refactor core of pprint so it emits chunks
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39296
diff
changeset
|
70 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
71 yield b"'%s'" % escapestr(o) |
37619
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
72 elif isinstance(o, bytearray): |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
73 # codecs.escape_encode() can't handle bytearray, so escapestr fails |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
74 # without coercion. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
75 yield b"bytearray['%s']" % escapestr(bytes(o)) |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
76 elif isinstance(o, list): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
77 if not o: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
78 yield b'[]' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
79 return |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
80 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
81 yield b'[' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
82 |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
83 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
84 level += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
85 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
86 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
87 |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
88 for i, a in enumerate(o): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
89 for chunk in pprintgen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
90 a, bprefix=bprefix, indent=indent, level=level |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
91 ): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
92 yield chunk |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
93 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
94 if i + 1 < len(o): |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
95 if indent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
96 yield b',\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
97 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
98 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
99 yield b', ' |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
100 |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
101 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
102 level -= 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
103 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
104 yield b' ' * (level * indent) |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
105 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
106 yield b']' |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
107 elif isinstance(o, dict): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
108 if not o: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
109 yield b'{}' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
110 return |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
111 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
112 yield b'{' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
113 |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
114 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
115 level += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
116 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
117 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
118 |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
119 for i, (k, v) in enumerate(sorted(o.items())): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
120 for chunk in pprintgen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
121 k, bprefix=bprefix, indent=indent, level=level |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
122 ): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
123 yield chunk |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
124 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
125 yield b': ' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
126 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
127 for chunk in pprintgen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
128 v, bprefix=bprefix, indent=indent, level=level |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
129 ): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
130 yield chunk |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
131 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
132 if i + 1 < len(o): |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
133 if indent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
134 yield b',\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
136 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
137 yield b', ' |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
138 |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
139 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
140 level -= 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
141 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
142 yield b' ' * (level * indent) |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
143 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
144 yield b'}' |
39051
2aebe138ef6e
stringutil: teach pprint about sets
Augie Fackler <augie@google.com>
parents:
38783
diff
changeset
|
145 elif isinstance(o, set): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
146 if not o: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
147 yield b'set([])' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
148 return |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
149 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
150 yield b'set([' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
151 |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
152 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
153 level += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
154 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
155 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
156 |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
157 for i, k in enumerate(sorted(o)): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
158 for chunk in pprintgen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
159 k, bprefix=bprefix, indent=indent, level=level |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
160 ): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
161 yield chunk |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
162 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
163 if i + 1 < len(o): |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
164 if indent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
165 yield b',\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
166 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
167 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
168 yield b', ' |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
169 |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
170 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
171 level -= 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
172 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
173 yield b' ' * (level * indent) |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
174 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
175 yield b'])' |
37932
bf6bb710b40f
stringutil: teach pprint about tuples
Augie Fackler <augie@google.com>
parents:
37750
diff
changeset
|
176 elif isinstance(o, tuple): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
177 if not o: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
178 yield b'()' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
179 return |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
180 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
181 yield b'(' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
182 |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
183 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
184 level += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
185 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
186 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
187 |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
188 for i, a in enumerate(o): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
189 for chunk in pprintgen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
190 a, bprefix=bprefix, indent=indent, level=level |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
191 ): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
192 yield chunk |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
193 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
194 if i + 1 < len(o): |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
195 if indent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 yield b',\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
197 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
198 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
199 yield b', ' |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
200 |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
201 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
202 level -= 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
204 yield b' ' * (level * indent) |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
205 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
206 yield b')' |
39296
ce145f8eface
stringutil: teach pprint() to recognize generators
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39063
diff
changeset
|
207 elif isinstance(o, types.GeneratorType): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
208 # Special case of empty generator. |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
209 try: |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
210 nextitem = next(o) |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
211 except StopIteration: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
212 yield b'gen[]' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
213 return |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
214 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
215 yield b'gen[' |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
216 |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
217 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
218 level += 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
219 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
220 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
221 |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
222 last = False |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
223 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
224 while not last: |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
225 current = nextitem |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
226 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
227 try: |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
228 nextitem = next(o) |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
229 except StopIteration: |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
230 last = True |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
231 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
232 for chunk in pprintgen( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
233 current, bprefix=bprefix, indent=indent, level=level |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
234 ): |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
235 yield chunk |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
236 |
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
237 if not last: |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
238 if indent: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
239 yield b',\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
240 yield b' ' * (level * indent) |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
241 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
242 yield b', ' |
39378
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
243 |
0f549da54379
stringutil: teach pprint() to indent
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39354
diff
changeset
|
244 if indent: |
40276
be57c7019c70
stringutil: allow to specify initial indent level of pprint()
Yuya Nishihara <yuya@tcha.org>
parents:
40275
diff
changeset
|
245 level -= 1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
246 yield b'\n' |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
247 yield b' ' * (level * indent) |
39354
5ed7c6caf24d
stringutil: emit multiple chunks when pretty printing
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39353
diff
changeset
|
248 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
249 yield b']' |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
250 else: |
39353
0d21b1f1722c
stringutil: refactor core of pprint so it emits chunks
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39296
diff
changeset
|
251 yield pycompat.byterepr(o) |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
252 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
253 |
38261
f3033692ccef
stringutil: promote smartset.prettyformat() to utility function
Yuya Nishihara <yuya@tcha.org>
parents:
37942
diff
changeset
|
254 def prettyrepr(o): |
f3033692ccef
stringutil: promote smartset.prettyformat() to utility function
Yuya Nishihara <yuya@tcha.org>
parents:
37942
diff
changeset
|
255 """Pretty print a representation of a possibly-nested object""" |
f3033692ccef
stringutil: promote smartset.prettyformat() to utility function
Yuya Nishihara <yuya@tcha.org>
parents:
37942
diff
changeset
|
256 lines = [] |
f3033692ccef
stringutil: promote smartset.prettyformat() to utility function
Yuya Nishihara <yuya@tcha.org>
parents:
37942
diff
changeset
|
257 rs = pycompat.byterepr(o) |
38264
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
258 p0 = p1 = 0 |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
259 while p0 < len(rs): |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
260 # '... field=<type ... field=<type ...' |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
261 # ~~~~~~~~~~~~~~~~ |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
262 # p0 p1 q0 q1 |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
263 q0 = -1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
264 q1 = rs.find(b'<', p1 + 1) |
38264
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
265 if q1 < 0: |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
266 q1 = len(rs) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
267 elif q1 > p1 + 1 and rs.startswith(b'=', q1 - 1): |
38264
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
268 # backtrack for ' field=<' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
269 q0 = rs.rfind(b' ', p1 + 1, q1 - 1) |
38264
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
270 if q0 < 0: |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
271 q0 = q1 |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
272 else: |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
273 q0 += 1 # skip ' ' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
274 l = rs.count(b'<', 0, p0) - rs.count(b'>', 0, p0) |
38261
f3033692ccef
stringutil: promote smartset.prettyformat() to utility function
Yuya Nishihara <yuya@tcha.org>
parents:
37942
diff
changeset
|
275 assert l >= 0 |
38264
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
276 lines.append((l, rs[p0:q0].rstrip())) |
fbb2eddea4d2
stringutil: fix prettyrepr() to not orphan foo=<...> line
Yuya Nishihara <yuya@tcha.org>
parents:
38261
diff
changeset
|
277 p0, p1 = q0, q1 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
278 return b'\n'.join(b' ' * l + s for l, s in lines) |
38261
f3033692ccef
stringutil: promote smartset.prettyformat() to utility function
Yuya Nishihara <yuya@tcha.org>
parents:
37942
diff
changeset
|
279 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
280 |
38576
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
281 def buildrepr(r): |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
282 """Format an optional printable representation from unexpanded bits |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
283 |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
284 ======== ================================= |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
285 type(r) example |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
286 ======== ================================= |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
287 tuple ('<not %r>', other) |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
288 bytes '<branch closed>' |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
289 callable lambda: '<branch %r>' % sorted(b) |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
290 object other |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
291 ======== ================================= |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
292 """ |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
293 if r is None: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
294 return b'' |
38576
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
295 elif isinstance(r, tuple): |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
296 return r[0] % pycompat.rapply(pycompat.maybebytestr, r[1:]) |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
297 elif isinstance(r, bytes): |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
298 return r |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
299 elif callable(r): |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
300 return r() |
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
301 else: |
39052
38409be2f521
stringutil: have buildrepr delegate to pprint for unknown types
Augie Fackler <augie@google.com>
parents:
39051
diff
changeset
|
302 return pprint(r) |
38576
a3130208db1c
stringutil: move _formatsetrepr() from smartset
Yuya Nishihara <yuya@tcha.org>
parents:
38477
diff
changeset
|
303 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
304 |
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
305 def binary(s): |
6507
9699864de219
Let util.binary check entire data for \0 (issue1066, issue1079)
Christian Ebert <blacktrash@gmx.net>
parents:
6501
diff
changeset
|
306 """return true if a string is binary data""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
307 return bool(s and b'\0' in s) |
6762 | 308 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
309 |
45722
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
310 def _splitpattern(pattern): |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
311 if pattern.startswith(b're:'): |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
312 return b're', pattern[3:] |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
313 elif pattern.startswith(b'literal:'): |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
314 return b'literal', pattern[8:] |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
315 return b'literal', pattern |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
316 |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
317 |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
318 def stringmatcher(pattern, casesensitive=True): |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
319 """ |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
320 accepts a string, possibly starting with 're:' or 'literal:' prefix. |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
321 returns the matcher name, pattern, and matcher function. |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
322 missing or unknown prefixes are treated as literal matches. |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
323 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
324 helper for tests: |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
325 >>> def test(pattern, *tests): |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
326 ... kind, pattern, matcher = stringmatcher(pattern) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
327 ... return (kind, pattern, [bool(matcher(t)) for t in tests]) |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
328 >>> def itest(pattern, *tests): |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
329 ... kind, pattern, matcher = stringmatcher(pattern, casesensitive=False) |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
330 ... return (kind, pattern, [bool(matcher(t)) for t in tests]) |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
331 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
332 exact matching (no prefix): |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
333 >>> test(b'abcdefg', b'abc', b'def', b'abcdefg') |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
334 ('literal', 'abcdefg', [False, False, True]) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
335 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
336 regex matching ('re:' prefix) |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
337 >>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar') |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
338 ('re', 'a.+b', [False, False, True]) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
339 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
340 force exact matches ('literal:' prefix) |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
341 >>> test(b'literal:re:foobar', b'foobar', b're:foobar') |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
342 ('literal', 're:foobar', [False, True]) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
343 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
344 unknown prefixes are ignored and treated as literals |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
345 >>> test(b'foo:bar', b'foo', b'bar', b'foo:bar') |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
346 ('literal', 'foo:bar', [False, False, True]) |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
347 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
348 case insensitive regex matches |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
349 >>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar') |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
350 ('re', 'A.+b', [False, False, True]) |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
351 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
352 case insensitive literal matches |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34084
diff
changeset
|
353 >>> itest(b'ABCDEFG', b'abc', b'def', b'abcdefg') |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
354 ('literal', 'ABCDEFG', [False, False, True]) |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
355 """ |
45722
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
356 kind, pattern = _splitpattern(pattern) |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
357 if kind == b're': |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
358 try: |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
359 flags = 0 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
360 if not casesensitive: |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
361 flags = remod.I |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
362 regex = remod.compile(pattern, flags) |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
363 except remod.error as e: |
45723
edfc5820aae7
py3: fix stringmatcher() to byte-stringify exception message
Yuya Nishihara <yuya@tcha.org>
parents:
45722
diff
changeset
|
364 raise error.ParseError( |
edfc5820aae7
py3: fix stringmatcher() to byte-stringify exception message
Yuya Nishihara <yuya@tcha.org>
parents:
45722
diff
changeset
|
365 _(b'invalid regular expression: %s') % forcebytestr(e) |
edfc5820aae7
py3: fix stringmatcher() to byte-stringify exception message
Yuya Nishihara <yuya@tcha.org>
parents:
45722
diff
changeset
|
366 ) |
45722
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
367 return kind, pattern, regex.search |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
368 elif kind == b'literal': |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
369 if casesensitive: |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
370 match = pattern.__eq__ |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
371 else: |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
372 ipat = encoding.lower(pattern) |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
373 match = lambda s: ipat == encoding.lower(s) |
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
374 return kind, pattern, match |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
375 |
45722
d502caab76bc
stringutil: extract helper function that splits stringmatcher() pattern
Yuya Nishihara <yuya@tcha.org>
parents:
44022
diff
changeset
|
376 raise error.ProgrammingError(b'unhandled pattern kind: %s' % kind) |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
377 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
378 |
45724
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
379 def substringregexp(pattern, flags=0): |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
380 """Build a regexp object from a string pattern possibly starting with |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
381 're:' or 'literal:' prefix. |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
382 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
383 helper for tests: |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
384 >>> def test(pattern, *tests): |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
385 ... regexp = substringregexp(pattern) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
386 ... return [bool(regexp.search(t)) for t in tests] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
387 >>> def itest(pattern, *tests): |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
388 ... regexp = substringregexp(pattern, remod.I) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
389 ... return [bool(regexp.search(t)) for t in tests] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
390 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
391 substring matching (no prefix): |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
392 >>> test(b'bcde', b'abc', b'def', b'abcdefg') |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
393 [False, False, True] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
394 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
395 substring pattern should be escaped: |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
396 >>> substringregexp(b'.bc').pattern |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
397 '\\\\.bc' |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
398 >>> test(b'.bc', b'abc', b'def', b'abcdefg') |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
399 [False, False, False] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
400 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
401 regex matching ('re:' prefix) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
402 >>> test(b're:a.+b', b'nomatch', b'fooadef', b'fooadefbar') |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
403 [False, False, True] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
404 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
405 force substring matches ('literal:' prefix) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
406 >>> test(b'literal:re:foobar', b'foobar', b're:foobar') |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
407 [False, True] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
408 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
409 case insensitive literal matches |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
410 >>> itest(b'BCDE', b'abc', b'def', b'abcdefg') |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
411 [False, False, True] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
412 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
413 case insensitive regex matches |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
414 >>> itest(b're:A.+b', b'nomatch', b'fooadef', b'fooadefBar') |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
415 [False, False, True] |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
416 """ |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
417 kind, pattern = _splitpattern(pattern) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
418 if kind == b're': |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
419 try: |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
420 return remod.compile(pattern, flags) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
421 except remod.error as e: |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
422 raise error.ParseError( |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
423 _(b'invalid regular expression: %s') % forcebytestr(e) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
424 ) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
425 elif kind == b'literal': |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
426 return remod.compile(remod.escape(pattern), flags) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
427 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
428 raise error.ProgrammingError(b'unhandled pattern kind: %s' % kind) |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
429 |
ac39a8a214b1
stringutil: add function to compile stringmatcher pattern into regexp
Yuya Nishihara <yuya@tcha.org>
parents:
45723
diff
changeset
|
430 |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
431 def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
432 """Return a short representation of a user name or email address.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
433 f = user.find(b'@') |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
434 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
435 user = user[:f] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
436 f = user.find(b'<') |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
437 if f >= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
438 user = user[f + 1 :] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
439 f = user.find(b' ') |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
440 if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
441 user = user[:f] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
442 f = user.find(b'.') |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
443 if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
444 user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
445 return user |
1920 | 446 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
447 |
16360
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
448 def emailuser(user): |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
449 """Return the user portion of an email address.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
450 f = user.find(b'@') |
16360
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
451 if f >= 0: |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
452 user = user[:f] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
453 f = user.find(b'<') |
16360
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
454 if f >= 0: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
455 user = user[f + 1 :] |
16360
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
456 return user |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
457 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
458 |
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
459 def email(author): |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
460 '''get email of author.''' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
461 r = author.find(b'>') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
462 if r == -1: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
463 r = None |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
464 return author[author.find(b'<') + 1 : r] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
465 |
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
466 |
37155
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
467 def person(author): |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
468 """Returns the name before an email address, |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
469 interpreting it as per RFC 5322 |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
470 |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
471 >>> person(b'foo@bar') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
472 'foo' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
473 >>> person(b'Foo Bar <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
474 'Foo Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
475 >>> person(b'"Foo Bar" <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
476 'Foo Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
477 >>> person(b'"Foo \"buz\" Bar" <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
478 'Foo "buz" Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
479 >>> # The following are invalid, but do exist in real-life |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
480 ... |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
481 >>> person(b'Foo "buz" Bar <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
482 'Foo "buz" Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
483 >>> person(b'"Foo Bar <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
484 'Foo Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
485 """ |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
486 if b'@' not in author: |
37155
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
487 return author |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
488 f = author.find(b'<') |
37155
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
489 if f != -1: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
490 return author[:f].strip(b' "').replace(b'\\"', b'"') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
491 f = author.find(b'@') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
492 return author[:f].replace(b'.', b' ') |
37155
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
493 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
494 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
495 @attr.s(hash=True) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
496 class mailmapping(object): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
497 """Represents a username/email key or value in |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
498 a mailmap file""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
499 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
500 email = attr.ib() |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
501 name = attr.ib(default=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
502 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
503 |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
504 def _ismailmaplineinvalid(names, emails): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
505 """Returns True if the parsed names and emails |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
506 in a mailmap entry are invalid. |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
507 |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
508 >>> # No names or emails fails |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
509 >>> names, emails = [], [] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
510 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
511 True |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
512 >>> # Only one email fails |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
513 >>> emails = [b'email@email.com'] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
514 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
515 True |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
516 >>> # One email and one name passes |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
517 >>> names = [b'Test Name'] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
518 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
519 False |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
520 >>> # No names but two emails passes |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
521 >>> names = [] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
522 >>> emails = [b'proper@email.com', b'commit@email.com'] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
523 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
524 False |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
525 """ |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
526 return not emails or not names and len(emails) < 2 |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
527 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
528 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
529 def parsemailmap(mailmapcontent): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
530 """Parses data in the .mailmap format |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
531 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
532 >>> mmdata = b"\\n".join([ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
533 ... b'# Comment', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
534 ... b'Name <commit1@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
535 ... b'<name@email.xx> <commit2@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
536 ... b'Name <proper@email.xx> <commit3@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
537 ... b'Name <proper@email.xx> Commit <commit4@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
538 ... ]) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
539 >>> mm = parsemailmap(mmdata) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
540 >>> for key in sorted(mm.keys()): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
541 ... print(key) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
542 mailmapping(email='commit1@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
543 mailmapping(email='commit2@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
544 mailmapping(email='commit3@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
545 mailmapping(email='commit4@email.xx', name='Commit') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
546 >>> for val in sorted(mm.values()): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
547 ... print(val) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
548 mailmapping(email='commit1@email.xx', name='Name') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
549 mailmapping(email='name@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
550 mailmapping(email='proper@email.xx', name='Name') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
551 mailmapping(email='proper@email.xx', name='Name') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
552 """ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
553 mailmap = {} |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
554 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
555 if mailmapcontent is None: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
556 return mailmap |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
557 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
558 for line in mailmapcontent.splitlines(): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
559 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
560 # Don't bother checking the line if it is a comment or |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
561 # is an improperly formed author field |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
562 if line.lstrip().startswith(b'#'): |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
563 continue |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
564 |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
565 # names, emails hold the parsed emails and names for each line |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
566 # name_builder holds the words in a persons name |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
567 names, emails = [], [] |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
568 namebuilder = [] |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
569 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
570 for element in line.split(): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
571 if element.startswith(b'#'): |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
572 # If we reach a comment in the mailmap file, move on |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
573 break |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
574 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
575 elif element.startswith(b'<') and element.endswith(b'>'): |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
576 # We have found an email. |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
577 # Parse it, and finalize any names from earlier |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
578 emails.append(element[1:-1]) # Slice off the "<>" |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
579 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
580 if namebuilder: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
581 names.append(b' '.join(namebuilder)) |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
582 namebuilder = [] |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
583 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
584 # Break if we have found a second email, any other |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
585 # data does not fit the spec for .mailmap |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
586 if len(emails) > 1: |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
587 break |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
588 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
589 else: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
590 # We have found another word in the committers name |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
591 namebuilder.append(element) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
592 |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
593 # Check to see if we have parsed the line into a valid form |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
594 # We require at least one email, and either at least one |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
595 # name or a second email |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
596 if _ismailmaplineinvalid(names, emails): |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
597 continue |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
598 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
599 mailmapkey = mailmapping( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
600 email=emails[-1], |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
601 name=names[-1] if len(names) == 2 else None, |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
602 ) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
603 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
604 mailmap[mailmapkey] = mailmapping( |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
605 email=emails[0], |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
606 name=names[0] if names else None, |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
607 ) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
608 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
609 return mailmap |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
610 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
611 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
612 def mapname(mailmap, author): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
613 """Returns the author field according to the mailmap cache, or |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
614 the original author field. |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
615 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
616 >>> mmdata = b"\\n".join([ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
617 ... b'# Comment', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
618 ... b'Name <commit1@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
619 ... b'<name@email.xx> <commit2@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
620 ... b'Name <proper@email.xx> <commit3@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
621 ... b'Name <proper@email.xx> Commit <commit4@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
622 ... ]) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
623 >>> m = parsemailmap(mmdata) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
624 >>> mapname(m, b'Commit <commit1@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
625 'Name <commit1@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
626 >>> mapname(m, b'Name <commit2@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
627 'Name <name@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
628 >>> mapname(m, b'Commit <commit3@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
629 'Name <proper@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
630 >>> mapname(m, b'Commit <commit4@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
631 'Name <proper@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
632 >>> mapname(m, b'Unknown Name <unknown@email.com>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
633 'Unknown Name <unknown@email.com>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
634 """ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
635 # If the author field coming in isn't in the correct format, |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
636 # or the mailmap is empty just return the original author field |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
637 if not isauthorwellformed(author) or not mailmap: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
638 return author |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
639 |
37247
2ed180117f76
stringutil: edit comment to reflect actual data type name
Connor Sheehan <sheehan@mozilla.com>
parents:
37246
diff
changeset
|
640 # Turn the user name into a mailmapping |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
641 commit = mailmapping(name=person(author), email=email(author)) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
642 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
643 try: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
644 # Try and use both the commit email and name as the key |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
645 proper = mailmap[commit] |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
646 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
647 except KeyError: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
648 # If the lookup fails, use just the email as the key instead |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
649 # We call this commit2 as not to erase original commit fields |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
650 commit2 = mailmapping(email=commit.email) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
651 proper = mailmap.get(commit2, mailmapping(None, None)) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
652 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
653 # Return the author field with proper values filled in |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
654 return b'%s <%s>' % ( |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
655 proper.name if proper.name else commit.name, |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
656 proper.email if proper.email else commit.email, |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
657 ) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
658 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
659 |
44022
c1ccefb513e4
cleanup: drop redundant character escapes outside of `[]`
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
660 _correctauthorformat = remod.compile(br'^[^<]+\s<[^<>]+@[^<>]+>$') |
37154
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
661 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
662 |
37154
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
663 def isauthorwellformed(author): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
664 """Return True if the author field is well formed |
37154
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
665 (ie "Contributor Name <contrib@email.dom>") |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
666 |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
667 >>> isauthorwellformed(b'Good Author <good@author.com>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
668 True |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
669 >>> isauthorwellformed(b'Author <good@author.com>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
670 True |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
671 >>> isauthorwellformed(b'Bad Author') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
672 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
673 >>> isauthorwellformed(b'Bad Author <author@author.com') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
674 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
675 >>> isauthorwellformed(b'Bad Author author@author.com') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
676 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
677 >>> isauthorwellformed(b'<author@author.com>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
678 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
679 >>> isauthorwellformed(b'Bad Author <author>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
680 False |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45724
diff
changeset
|
681 """ |
37154
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
682 return _correctauthorformat.match(author) is not None |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
683 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
684 |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
685 def ellipsis(text, maxlength=400): |
21857
86c2d792a4b7
util: replace 'ellipsis' implementation by 'encoding.trim'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21813
diff
changeset
|
686 """Trim string to at most maxlength (default: 400) columns in display.""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
687 return encoding.trim(text, maxlength, ellipsis=b'...') |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
688 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
689 |
31451
53865692a354
util: wrap s.encode('string_escape') call for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31449
diff
changeset
|
690 def escapestr(s): |
39063
1419ba5e3b56
stringutil: if we get a memoryview in escapestr, coerce it to bytes
Augie Fackler <augie@google.com>
parents:
39052
diff
changeset
|
691 if isinstance(s, memoryview): |
1419ba5e3b56
stringutil: if we get a memoryview in escapestr, coerce it to bytes
Augie Fackler <augie@google.com>
parents:
39052
diff
changeset
|
692 s = bytes(s) |
31453
3b7a6941a6ef
py3: call codecs.escape_encode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31451
diff
changeset
|
693 # call underlying function of s.encode('string_escape') directly for |
3b7a6941a6ef
py3: call codecs.escape_encode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31451
diff
changeset
|
694 # Python 3 compatibility |
3b7a6941a6ef
py3: call codecs.escape_encode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31451
diff
changeset
|
695 return codecs.escape_encode(s)[0] |
31451
53865692a354
util: wrap s.encode('string_escape') call for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31449
diff
changeset
|
696 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
697 |
31484
afb335353d28
util: wrap s.decode('string_escape') calls for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31465
diff
changeset
|
698 def unescapestr(s): |
31485
cad95575dc46
py3: call codecs.escape_decode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31484
diff
changeset
|
699 return codecs.escape_decode(s)[0] |
31484
afb335353d28
util: wrap s.decode('string_escape') calls for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31465
diff
changeset
|
700 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
701 |
33682
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
702 def forcebytestr(obj): |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
703 """Portably format an arbitrary object (e.g. exception) into a byte |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
704 string.""" |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
705 try: |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
706 return pycompat.bytestr(obj) |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
707 except UnicodeEncodeError: |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
708 # non-ascii string, may be lossy |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
709 return pycompat.bytestr(encoding.strtolocal(str(obj))) |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
710 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
711 |
5291
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
712 def uirepr(s): |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
713 # Avoid double backslash in Windows path repr() |
36266
1fa33bd848ee
py3: fix bytes-unicode dance while building docstring of extdiff
Yuya Nishihara <yuya@tcha.org>
parents:
36235
diff
changeset
|
714 return pycompat.byterepr(pycompat.bytestr(s)).replace(b'\\\\', b'\\') |
7547
4949729ee9ee
python implementation of diffstat
Alexander Solovyov <piranha@piranha.org.ua>
parents:
7537
diff
changeset
|
715 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
716 |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
717 # delay import of textwrap |
37079
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
718 def _MBTextWrapper(**kwargs): |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
719 class tw(textwrap.TextWrapper): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
720 """ |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
721 Extend TextWrapper for width-awareness. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
722 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
723 Neither number of 'bytes' in any encoding nor 'characters' is |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
724 appropriate to calculate terminal columns for specified string. |
12957
9f2ac318b92e
util: clarify purpose of MBTextWrapper class
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12938
diff
changeset
|
725 |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
726 Original TextWrapper implementation uses built-in 'len()' directly, |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
727 so overriding is needed to use width information of each characters. |
12957
9f2ac318b92e
util: clarify purpose of MBTextWrapper class
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
12938
diff
changeset
|
728 |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
729 In addition, characters classified into 'ambiguous' width are |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17391
diff
changeset
|
730 treated as wide in East Asian area, but as narrow in other. |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
731 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
732 This requires use decision to determine width of such characters. |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
733 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
734 |
15065
24a6c3f903bb
util: wrap lines with multi-byte characters correctly (issue2943)
Mads Kiilerich <mads@kiilerich.com>
parents:
15024
diff
changeset
|
735 def _cutdown(self, ucstr, space_left): |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
736 l = 0 |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
737 colwidth = encoding.ucolwidth |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38576
diff
changeset
|
738 for i in pycompat.xrange(len(ucstr)): |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
739 l += colwidth(ucstr[i]) |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
740 if space_left < l: |
15065
24a6c3f903bb
util: wrap lines with multi-byte characters correctly (issue2943)
Mads Kiilerich <mads@kiilerich.com>
parents:
15024
diff
changeset
|
741 return (ucstr[:i], ucstr[i:]) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
742 return ucstr, b'' |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
743 |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
744 # overriding of base class |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
745 def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
746 space_left = max(width - cur_len, 1) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
747 |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
748 if self.break_long_words: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
749 cut, res = self._cutdown(reversed_chunks[-1], space_left) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
750 cur_line.append(cut) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
751 reversed_chunks[-1] = res |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
752 elif not cur_line: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
753 cur_line.append(reversed_chunks.pop()) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
754 |
26201
c5b2074ae8c0
util: capitalize Python in MBTextWrapper._wrap_chunks comment
timeless@mozdev.org
parents:
26126
diff
changeset
|
755 # this overriding code is imported from TextWrapper of Python 2.6 |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
756 # to calculate columns of string by 'encoding.ucolwidth()' |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
757 def _wrap_chunks(self, chunks): |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
758 colwidth = encoding.ucolwidth |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
759 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
760 lines = [] |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
761 if self.width <= 0: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
762 raise ValueError(b"invalid width %r (must be > 0)" % self.width) |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
763 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
764 # Arrange in reverse order so items can be efficiently popped |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
765 # from a stack of chucks. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
766 chunks.reverse() |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
767 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
768 while chunks: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
769 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
770 # Start the list of chunks that will make up the current line. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
771 # cur_len is just the length of all the chunks in cur_line. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
772 cur_line = [] |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
773 cur_len = 0 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
774 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
775 # Figure out which static string will prefix this line. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
776 if lines: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
777 indent = self.subsequent_indent |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
778 else: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
779 indent = self.initial_indent |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
780 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
781 # Maximum width for this line. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
782 width = self.width - len(indent) |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
783 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
784 # First chunk on line is whitespace -- drop it, unless this |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17391
diff
changeset
|
785 # is the very beginning of the text (i.e. no lines started yet). |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43077
diff
changeset
|
786 if self.drop_whitespace and chunks[-1].strip() == '' and lines: |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
787 del chunks[-1] |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
788 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
789 while chunks: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
790 l = colwidth(chunks[-1]) |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
791 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
792 # Can at least squeeze this chunk onto the current line. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
793 if cur_len + l <= width: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
794 cur_line.append(chunks.pop()) |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
795 cur_len += l |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
796 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
797 # Nope, this line is full. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
798 else: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
799 break |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
800 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
801 # The current line is full, and the next chunk is too big to |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
802 # fit on *any* line (not just this one). |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
803 if chunks and colwidth(chunks[-1]) > width: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
804 self._handle_long_word(chunks, cur_line, cur_len, width) |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
805 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
806 # If the last chunk on this line is all whitespace, drop it. |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
807 if ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
808 self.drop_whitespace |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
809 and cur_line |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
810 and cur_line[-1].strip() == r'' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
811 ): |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
812 del cur_line[-1] |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
813 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
814 # Convert current line back to a string and store it in list |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
815 # of all lines (return value). |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
816 if cur_line: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43077
diff
changeset
|
817 lines.append(indent + ''.join(cur_line)) |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
818 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
819 return lines |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
820 |
37079
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
821 global _MBTextWrapper |
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
822 _MBTextWrapper = tw |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
823 return tw(**kwargs) |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
824 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
825 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
826 def wrap(line, width, initindent=b'', hangindent=b''): |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
827 maxindent = max(len(hangindent), len(initindent)) |
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
828 if width <= maxindent: |
9417
4c3fb45123e5
util, minirst: do not crash with COLUMNS=0
Martin Geisler <mg@lazybytes.net>
parents:
9397
diff
changeset
|
829 # adjust for weird terminal size |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
830 width = max(78, maxindent + 1) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
831 line = line.decode( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
832 pycompat.sysstr(encoding.encoding), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
833 pycompat.sysstr(encoding.encodingmode), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
834 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
835 initindent = initindent.decode( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
836 pycompat.sysstr(encoding.encoding), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
837 pycompat.sysstr(encoding.encodingmode), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
838 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
839 hangindent = hangindent.decode( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
840 pycompat.sysstr(encoding.encoding), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
841 pycompat.sysstr(encoding.encodingmode), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
842 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
843 wrapper = _MBTextWrapper( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
844 width=width, initial_indent=initindent, subsequent_indent=hangindent |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
845 ) |
31338
a9a28ca17615
util: pass encoding.[encoding|encodingmode] as unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31315
diff
changeset
|
846 return wrapper.fill(line).encode(pycompat.sysstr(encoding.encoding)) |
8938
9b8c9266c59d
commands: wrap short descriptions in 'hg help'
Martin Geisler <mg@lazybytes.net>
parents:
8785
diff
changeset
|
847 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
848 |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
849 _booleans = { |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
850 b'1': True, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
851 b'yes': True, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
852 b'true': True, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
853 b'on': True, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
854 b'always': True, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
855 b'0': False, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
856 b'no': False, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
857 b'false': False, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
858 b'off': False, |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
859 b'never': False, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
860 } |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
861 |
12087
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
862 |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
863 def parsebool(s): |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
864 """Parse s into a boolean. |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
865 |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
866 If s is not a valid boolean, returns None. |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
867 """ |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
868 return _booleans.get(s.lower(), None) |
37290
cc5a040fe150
wireproto: syntax for encoding CBOR into frames
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37247
diff
changeset
|
869 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
40684
diff
changeset
|
870 |
37476
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
871 def evalpythonliteral(s): |
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
872 """Evaluate a string containing a Python literal expression""" |
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
873 # We could backport our tokenizer hack to rewrite '' to u'' if we want |
37681
3942bd8db8b2
stringutil: ast.literal_eval needs a unicode on py3
Augie Fackler <augie@google.com>
parents:
37619
diff
changeset
|
874 if pycompat.ispy3: |
3942bd8db8b2
stringutil: ast.literal_eval needs a unicode on py3
Augie Fackler <augie@google.com>
parents:
37619
diff
changeset
|
875 return ast.literal_eval(s.decode('latin1')) |
37476
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
876 return ast.literal_eval(s) |