Mercurial > hg
annotate mercurial/utils/stringutil.py @ 37762:7269b87f817c
scmutil: teach the file prefetch hook to handle multiple commits
The remainder of the commands that need prefetch deal with multiple revisions.
I initially coded this as a separate hook, but then it needed a list of files
to handle `diff` and `grep`, so it didn't seem worth keeping them separate.
Not every matcher will emit bad file messages (some are built from a list of
files that are known to exist). But it seems better to filter this in one place
than to push this on either each caller or each hook implementation.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Sat, 14 Apr 2018 18:50:45 -0400 |
parents | f7194c925003 |
children | bf6bb710b40f |
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 |
3769 | 16 |
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
17 from ..i18n import _ |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
18 from ..thirdparty import attr |
37083
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
19 |
f99d64e8a4e4
stringutil: move generic string helpers to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37082
diff
changeset
|
20 from .. import ( |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
21 encoding, |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
22 error, |
28818
6041fb8f2da8
pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
28497
diff
changeset
|
23 pycompat, |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
24 ) |
37010
8453699a1f21
util: observable proxy objects for sockets
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36991
diff
changeset
|
25 |
37750
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
26 def pprint(o, bprefix=True): |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
27 """Pretty print an object.""" |
37619
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
28 if isinstance(o, bytes): |
37750
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
29 if bprefix: |
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
30 return "b'%s'" % escapestr(o) |
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
31 return "'%s'" % escapestr(o) |
37619
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
32 elif isinstance(o, bytearray): |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
33 # 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
|
34 # without coercion. |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
35 return "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
|
36 elif isinstance(o, list): |
37750
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
37 return '[%s]' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
38 elif isinstance(o, dict): |
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
39 return '{%s}' % (b', '.join( |
37750
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
40 '%s: %s' % (pprint(k, bprefix=bprefix), |
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
41 pprint(v, bprefix=bprefix)) |
f7194c925003
stringutil: make b prefixes on string output optional
Augie Fackler <augie@google.com>
parents:
37749
diff
changeset
|
42 for k, v in sorted(o.items()))) |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
43 elif isinstance(o, bool): |
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
44 return b'True' if o else b'False' |
37619
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
45 elif isinstance(o, int): |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
46 return '%d' % o |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
47 elif isinstance(o, float): |
68132a95df31
stringutil: support more types with pprint()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37476
diff
changeset
|
48 return '%f' % o |
37749
73d0a3dd7e53
stringutil: teach pprint how to format None
Augie Fackler <augie@google.com>
parents:
37681
diff
changeset
|
49 elif o is None: |
73d0a3dd7e53
stringutil: teach pprint how to format None
Augie Fackler <augie@google.com>
parents:
37681
diff
changeset
|
50 return b'None' |
37300
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
51 else: |
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
52 raise error.ProgrammingError('do not know how to format %r' % o) |
2f859ad7ed8c
stringutil: add function to pretty print an object
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37290
diff
changeset
|
53 |
1015
22571b8d35d3
Add automatic binary file detection to diff and export
mpm@selenic.com
parents:
917
diff
changeset
|
54 def binary(s): |
6507
9699864de219
Let util.binary check entire data for \0 (issue1066, issue1079)
Christian Ebert <blacktrash@gmx.net>
parents:
6501
diff
changeset
|
55 """return true if a string is binary data""" |
8118
35f7fda52c92
util: return boolean result directly in util.binary
Martin Geisler <mg@lazybytes.net>
parents:
8011
diff
changeset
|
56 return bool(s and '\0' in s) |
6762 | 57 |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
58 def stringmatcher(pattern, casesensitive=True): |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
59 """ |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
60 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
|
61 returns the matcher name, pattern, and matcher function. |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
62 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
|
63 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
64 helper for tests: |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
65 >>> def test(pattern, *tests): |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
66 ... kind, pattern, matcher = stringmatcher(pattern) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
67 ... 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
|
68 >>> def itest(pattern, *tests): |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
69 ... 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
|
70 ... 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
|
71 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
72 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
|
73 >>> 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
|
74 ('literal', 'abcdefg', [False, False, True]) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
75 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
76 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
|
77 >>> 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
|
78 ('re', 'a.+b', [False, False, True]) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
79 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
80 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
|
81 >>> 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
|
82 ('literal', 're:foobar', [False, True]) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
83 |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
84 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
|
85 >>> 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
|
86 ('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
|
87 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
88 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
|
89 >>> 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
|
90 ('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
|
91 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
92 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
|
93 >>> 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
|
94 ('literal', 'ABCDEFG', [False, False, True]) |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
95 """ |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
96 if pattern.startswith('re:'): |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
97 pattern = pattern[3:] |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
98 try: |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
99 flags = 0 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
100 if not casesensitive: |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
101 flags = remod.I |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
102 regex = remod.compile(pattern, flags) |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
103 except remod.error as e: |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
104 raise error.ParseError(_('invalid regular expression: %s') |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
105 % e) |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
106 return 're', pattern, regex.search |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
107 elif pattern.startswith('literal:'): |
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
108 pattern = pattern[8:] |
30773
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
109 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
110 match = pattern.__eq__ |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
111 |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
112 if not casesensitive: |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
113 ipat = encoding.lower(pattern) |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
114 match = lambda s: ipat == encoding.lower(s) |
c390b40fe1d7
util: teach stringmatcher to handle forced case insensitive matches
Matt Harbison <matt_harbison@yahoo.com>
parents:
30761
diff
changeset
|
115 return 'literal', pattern, match |
26481
7d132557e44a
util: extract stringmatcher() from revset
Matt Harbison <matt_harbison@yahoo.com>
parents:
26480
diff
changeset
|
116 |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
117 def shortuser(user): |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
118 """Return a short representation of a user name or email address.""" |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
119 f = user.find('@') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
120 if f >= 0: |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
121 user = user[:f] |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
122 f = user.find('<') |
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
123 if f >= 0: |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
124 user = user[f + 1:] |
3176
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
125 f = user.find(' ') |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
126 if f >= 0: |
7492b33bdd9f
shortuser should stop before the first space character.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3147
diff
changeset
|
127 user = user[:f] |
3533
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
128 f = user.find('.') |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
129 if f >= 0: |
bb44489b901f
shortname: truncate at '.' too
Matt Mackall <mpm@selenic.com>
parents:
3466
diff
changeset
|
130 user = user[:f] |
1903
e4abeafd6eb1
move shortuser into util module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
1635
diff
changeset
|
131 return user |
1920 | 132 |
16360
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
133 def emailuser(user): |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
134 """Return the user portion of an email address.""" |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
135 f = user.find('@') |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
136 if f >= 0: |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
137 user = user[:f] |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
138 f = user.find('<') |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
139 if f >= 0: |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
140 user = user[f + 1:] |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
141 return user |
e5788269741a
templates/filters: extracting the user portion of an email address
Matteo Capobianco <m.capobianco@gmail.com>
parents:
15720
diff
changeset
|
142 |
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
143 def email(author): |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
144 '''get email of author.''' |
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
145 r = author.find('>') |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
146 if r == -1: |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
147 r = None |
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
148 return author[author.find('<') + 1:r] |
5975
75d9fe70c654
templater: move email function to util
Matt Mackall <mpm@selenic.com>
parents:
5949
diff
changeset
|
149 |
37155
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
150 def person(author): |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
151 """Returns the name before an email address, |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
152 interpreting it as per RFC 5322 |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
153 |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
154 >>> person(b'foo@bar') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
155 'foo' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
156 >>> person(b'Foo Bar <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
157 'Foo Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
158 >>> person(b'"Foo Bar" <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
159 'Foo Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
160 >>> person(b'"Foo \"buz\" Bar" <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
161 'Foo "buz" Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
162 >>> # 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
|
163 ... |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
164 >>> person(b'Foo "buz" Bar <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
165 'Foo "buz" Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
166 >>> person(b'"Foo Bar <foo@bar>') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
167 'Foo Bar' |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
168 """ |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
169 if '@' not in author: |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
170 return author |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
171 f = author.find('<') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
172 if f != -1: |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
173 return author[:f].strip(' "').replace('\\"', '"') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
174 f = author.find('@') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
175 return author[:f].replace('.', ' ') |
fb7140f1d09d
stringutil: move person function from templatefilters
Connor Sheehan <sheehan@mozilla.com>
parents:
37154
diff
changeset
|
176 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
177 @attr.s(hash=True) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
178 class mailmapping(object): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
179 '''Represents a username/email key or value in |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
180 a mailmap file''' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
181 email = attr.ib() |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
182 name = attr.ib(default=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
183 |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
184 def _ismailmaplineinvalid(names, emails): |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
185 '''Returns True if the parsed names and emails |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
186 in a mailmap entry are invalid. |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
187 |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
188 >>> # No names or emails fails |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
189 >>> names, emails = [], [] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
190 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
191 True |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
192 >>> # Only one email fails |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
193 >>> emails = [b'email@email.com'] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
194 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
195 True |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
196 >>> # One email and one name passes |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
197 >>> names = [b'Test Name'] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
198 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
199 False |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
200 >>> # No names but two emails passes |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
201 >>> names = [] |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
202 >>> 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
|
203 >>> _ismailmaplineinvalid(names, emails) |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
204 False |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
205 ''' |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
206 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
|
207 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
208 def parsemailmap(mailmapcontent): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
209 """Parses data in the .mailmap format |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
210 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
211 >>> mmdata = b"\\n".join([ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
212 ... b'# Comment', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
213 ... b'Name <commit1@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
214 ... b'<name@email.xx> <commit2@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
215 ... b'Name <proper@email.xx> <commit3@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
216 ... b'Name <proper@email.xx> Commit <commit4@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
217 ... ]) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
218 >>> mm = parsemailmap(mmdata) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
219 >>> for key in sorted(mm.keys()): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
220 ... print(key) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
221 mailmapping(email='commit1@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
222 mailmapping(email='commit2@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
223 mailmapping(email='commit3@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
224 mailmapping(email='commit4@email.xx', name='Commit') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
225 >>> for val in sorted(mm.values()): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
226 ... print(val) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
227 mailmapping(email='commit1@email.xx', name='Name') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
228 mailmapping(email='name@email.xx', name=None) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
229 mailmapping(email='proper@email.xx', name='Name') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
230 mailmapping(email='proper@email.xx', name='Name') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
231 """ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
232 mailmap = {} |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
233 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
234 if mailmapcontent is None: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
235 return mailmap |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
236 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
237 for line in mailmapcontent.splitlines(): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
238 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
239 # 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
|
240 # is an improperly formed author field |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
241 if line.lstrip().startswith('#'): |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
242 continue |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
243 |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
244 # 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
|
245 # 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
|
246 names, emails = [], [] |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
247 namebuilder = [] |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
248 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
249 for element in line.split(): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
250 if element.startswith('#'): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
251 # 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
|
252 break |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
253 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
254 elif element.startswith('<') and element.endswith('>'): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
255 # We have found an email. |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
256 # 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
|
257 emails.append(element[1:-1]) # Slice off the "<>" |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
258 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
259 if namebuilder: |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
260 names.append(' '.join(namebuilder)) |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
261 namebuilder = [] |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
262 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
263 # 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
|
264 # 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
|
265 if len(emails) > 1: |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
266 break |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
267 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
268 else: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
269 # We have found another word in the committers name |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
270 namebuilder.append(element) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
271 |
37246
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
272 # 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
|
273 # 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
|
274 # name or a second email |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
275 if _ismailmaplineinvalid(names, emails): |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
276 continue |
0e7550b0964c
stringutil: improve check for failed mailmap line parsing
Connor Sheehan <sheehan@mozilla.com>
parents:
37245
diff
changeset
|
277 |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
278 mailmapkey = mailmapping( |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
279 email=emails[-1], |
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
280 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
|
281 ) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
282 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
283 mailmap[mailmapkey] = mailmapping( |
37245
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
284 email=emails[0], |
54b896f195d1
stringutil: rename local email/names variables to their plural forms
Connor Sheehan <sheehan@mozilla.com>
parents:
37210
diff
changeset
|
285 name=names[0] if names else None, |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
286 ) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
287 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
288 return mailmap |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
289 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
290 def mapname(mailmap, author): |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
291 """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
|
292 the original author field. |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
293 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
294 >>> mmdata = b"\\n".join([ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
295 ... b'# Comment', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
296 ... b'Name <commit1@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
297 ... b'<name@email.xx> <commit2@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
298 ... b'Name <proper@email.xx> <commit3@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
299 ... b'Name <proper@email.xx> Commit <commit4@email.xx>', |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
300 ... ]) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
301 >>> m = parsemailmap(mmdata) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
302 >>> mapname(m, b'Commit <commit1@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
303 'Name <commit1@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
304 >>> mapname(m, b'Name <commit2@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
305 'Name <name@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
306 >>> mapname(m, b'Commit <commit3@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
307 'Name <proper@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
308 >>> mapname(m, b'Commit <commit4@email.xx>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
309 'Name <proper@email.xx>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
310 >>> mapname(m, b'Unknown Name <unknown@email.com>') |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
311 'Unknown Name <unknown@email.com>' |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
312 """ |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
313 # 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
|
314 # 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
|
315 if not isauthorwellformed(author) or not mailmap: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
316 return author |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
317 |
37247
2ed180117f76
stringutil: edit comment to reflect actual data type name
Connor Sheehan <sheehan@mozilla.com>
parents:
37246
diff
changeset
|
318 # Turn the user name into a mailmapping |
37210
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
319 commit = mailmapping(name=person(author), email=email(author)) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
320 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
321 try: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
322 # 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
|
323 proper = mailmap[commit] |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
324 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
325 except KeyError: |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
326 # 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
|
327 # 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
|
328 commit2 = mailmapping(email=commit.email) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
329 proper = mailmap.get(commit2, mailmapping(None, None)) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
330 |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
331 # Return the author field with proper values filled in |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
332 return '%s <%s>' % ( |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
333 proper.name if proper.name else commit.name, |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
334 proper.email if proper.email else commit.email, |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
335 ) |
2a2ce93e12f4
templatefuncs: add mailmap template function
Connor Sheehan <sheehan@mozilla.com>
parents:
37155
diff
changeset
|
336 |
37154
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
337 _correctauthorformat = remod.compile(br'^[^<]+\s\<[^<>]+@[^<>]+\>$') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
338 |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
339 def isauthorwellformed(author): |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
340 '''Return True if the author field is well formed |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
341 (ie "Contributor Name <contrib@email.dom>") |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
342 |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
343 >>> isauthorwellformed(b'Good Author <good@author.com>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
344 True |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
345 >>> isauthorwellformed(b'Author <good@author.com>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
346 True |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
347 >>> isauthorwellformed(b'Bad Author') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
348 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
349 >>> isauthorwellformed(b'Bad Author <author@author.com') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
350 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
351 >>> isauthorwellformed(b'Bad Author author@author.com') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
352 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
353 >>> isauthorwellformed(b'<author@author.com>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
354 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
355 >>> isauthorwellformed(b'Bad Author <author>') |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
356 False |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
357 ''' |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
358 return _correctauthorformat.match(author) is not None |
f8e1f48de118
stringutil: add isauthorwellformed function
Connor Sheehan <sheehan@mozilla.com>
parents:
37083
diff
changeset
|
359 |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
360 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
|
361 """Trim string to at most maxlength (default: 400) columns in display.""" |
86c2d792a4b7
util: replace 'ellipsis' implementation by 'encoding.trim'
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
21813
diff
changeset
|
362 return encoding.trim(text, maxlength, ellipsis='...') |
3767
1861fa38a6a7
Move ellipsis code to util.ellipsis() and improve maxlength handling.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3721
diff
changeset
|
363 |
31451
53865692a354
util: wrap s.encode('string_escape') call for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31449
diff
changeset
|
364 def escapestr(s): |
31453
3b7a6941a6ef
py3: call codecs.escape_encode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31451
diff
changeset
|
365 # 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
|
366 # Python 3 compatibility |
3b7a6941a6ef
py3: call codecs.escape_encode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31451
diff
changeset
|
367 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
|
368 |
31484
afb335353d28
util: wrap s.decode('string_escape') calls for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents:
31465
diff
changeset
|
369 def unescapestr(s): |
31485
cad95575dc46
py3: call codecs.escape_decode() directly
Yuya Nishihara <yuya@tcha.org>
parents:
31484
diff
changeset
|
370 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
|
371 |
33682
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
372 def forcebytestr(obj): |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
373 """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
|
374 string.""" |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
375 try: |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
376 return pycompat.bytestr(obj) |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
377 except UnicodeEncodeError: |
1d5e497c08b3
py3: convert arbitrary exception object to byte string more reliably
Yuya Nishihara <yuya@tcha.org>
parents:
33619
diff
changeset
|
378 # 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
|
379 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
|
380 |
5291
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
381 def uirepr(s): |
23651848d638
extdiff: avoid repr() doubling paths backslashes under Windows
Patrick Mezard <pmezard@gmail.com>
parents:
5213
diff
changeset
|
382 # 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
|
383 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
|
384 |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
385 # delay import of textwrap |
37079
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
386 def _MBTextWrapper(**kwargs): |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
387 class tw(textwrap.TextWrapper): |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
388 """ |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
389 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
|
390 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
391 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
|
392 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
|
393 |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
394 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
|
395 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
|
396 |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
397 In addition, characters classified into 'ambiguous' width are |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
17391
diff
changeset
|
398 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
|
399 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
400 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
|
401 """ |
15065
24a6c3f903bb
util: wrap lines with multi-byte characters correctly (issue2943)
Mads Kiilerich <mads@kiilerich.com>
parents:
15024
diff
changeset
|
402 def _cutdown(self, ucstr, space_left): |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
403 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
|
404 colwidth = encoding.ucolwidth |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
405 for i in 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
|
406 l += colwidth(ucstr[i]) |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
407 if space_left < l: |
15065
24a6c3f903bb
util: wrap lines with multi-byte characters correctly (issue2943)
Mads Kiilerich <mads@kiilerich.com>
parents:
15024
diff
changeset
|
408 return (ucstr[:i], ucstr[i:]) |
24a6c3f903bb
util: wrap lines with multi-byte characters correctly (issue2943)
Mads Kiilerich <mads@kiilerich.com>
parents:
15024
diff
changeset
|
409 return ucstr, '' |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
410 |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
411 # overriding of base class |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
412 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
|
413 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
|
414 |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
415 if self.break_long_words: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
416 cut, res = self._cutdown(reversed_chunks[-1], space_left) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
417 cur_line.append(cut) |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
418 reversed_chunks[-1] = res |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
419 elif not cur_line: |
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
420 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
|
421 |
26201
c5b2074ae8c0
util: capitalize Python in MBTextWrapper._wrap_chunks comment
timeless@mozdev.org
parents:
26126
diff
changeset
|
422 # 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
|
423 # 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
|
424 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
|
425 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
|
426 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
427 lines = [] |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
428 if self.width <= 0: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
429 raise ValueError("invalid width %r (must be > 0)" % self.width) |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
430 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
431 # 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
|
432 # 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
|
433 chunks.reverse() |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
434 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
435 while chunks: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
436 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
437 # 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
|
438 # 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
|
439 cur_line = [] |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
440 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
|
441 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
442 # 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
|
443 if lines: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
444 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
|
445 else: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
446 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
|
447 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
448 # 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
|
449 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
|
450 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
451 # 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
|
452 # is the very beginning of the text (i.e. no lines started yet). |
32527
47ce079b1afa
util: look for empty-sysstr instead of empty-bytesstr in textwrap code
Augie Fackler <raf@durin42.com>
parents:
32462
diff
changeset
|
453 if self.drop_whitespace and chunks[-1].strip() == r'' 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
|
454 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
|
455 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
456 while chunks: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
457 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
|
458 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
459 # 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
|
460 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
|
461 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
|
462 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
|
463 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
464 # 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
|
465 else: |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
466 break |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
467 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
468 # 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
|
469 # 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
|
470 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
|
471 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
|
472 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
473 # If the last chunk on this line is all whitespace, drop it. |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
474 if (self.drop_whitespace and |
32527
47ce079b1afa
util: look for empty-sysstr instead of empty-bytesstr in textwrap code
Augie Fackler <raf@durin42.com>
parents:
32462
diff
changeset
|
475 cur_line and cur_line[-1].strip() == r''): |
15066
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
476 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
|
477 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
478 # 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
|
479 # 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
|
480 if cur_line: |
32546
3b8155305fbe
util: use sysstr.join instead of bytes.join in textwrap wrapper
Augie Fackler <raf@durin42.com>
parents:
32527
diff
changeset
|
481 lines.append(indent + r''.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
|
482 |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
483 return lines |
24efa83d81cb
i18n: calculate terminal columns by width information of each characters
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15065
diff
changeset
|
484 |
37079
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
485 global _MBTextWrapper |
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
486 _MBTextWrapper = tw |
13316
d119403fd266
util: delay loading of textwrap
Matt Mackall <mpm@selenic.com>
parents:
13313
diff
changeset
|
487 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
|
488 |
12698
7aef77e74cf3
util: make wrap() require a width argument
Matt Mackall <mpm@selenic.com>
parents:
12689
diff
changeset
|
489 def wrap(line, width, initindent='', hangindent=''): |
11297
d320e70442a5
replace Python standard textwrap by MBCS sensitive one for i18n text
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
11256
diff
changeset
|
490 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
|
491 if width <= maxindent: |
9417
4c3fb45123e5
util, minirst: do not crash with COLUMNS=0
Martin Geisler <mg@lazybytes.net>
parents:
9397
diff
changeset
|
492 # 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
|
493 width = max(78, maxindent + 1) |
31338
a9a28ca17615
util: pass encoding.[encoding|encodingmode] as unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31315
diff
changeset
|
494 line = line.decode(pycompat.sysstr(encoding.encoding), |
37080
bad90b80b315
util: adjust indent level in wrap()
Yuya Nishihara <yuya@tcha.org>
parents:
37079
diff
changeset
|
495 pycompat.sysstr(encoding.encodingmode)) |
31338
a9a28ca17615
util: pass encoding.[encoding|encodingmode] as unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31315
diff
changeset
|
496 initindent = initindent.decode(pycompat.sysstr(encoding.encoding), |
37080
bad90b80b315
util: adjust indent level in wrap()
Yuya Nishihara <yuya@tcha.org>
parents:
37079
diff
changeset
|
497 pycompat.sysstr(encoding.encodingmode)) |
31338
a9a28ca17615
util: pass encoding.[encoding|encodingmode] as unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31315
diff
changeset
|
498 hangindent = hangindent.decode(pycompat.sysstr(encoding.encoding), |
37080
bad90b80b315
util: adjust indent level in wrap()
Yuya Nishihara <yuya@tcha.org>
parents:
37079
diff
changeset
|
499 pycompat.sysstr(encoding.encodingmode)) |
37079
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
500 wrapper = _MBTextWrapper(width=width, |
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
501 initial_indent=initindent, |
736024df4498
util: mark MBTextWrapper as private
Yuya Nishihara <yuya@tcha.org>
parents:
37078
diff
changeset
|
502 subsequent_indent=hangindent) |
31338
a9a28ca17615
util: pass encoding.[encoding|encodingmode] as unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31315
diff
changeset
|
503 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
|
504 |
12088
1f71dffabc53
parsebool: accept always as true and never as false
Augie Fackler <durin42@gmail.com>
parents:
12087
diff
changeset
|
505 _booleans = {'1': True, 'yes': True, 'true': True, 'on': True, 'always': True, |
1f71dffabc53
parsebool: accept always as true and never as false
Augie Fackler <durin42@gmail.com>
parents:
12087
diff
changeset
|
506 '0': False, 'no': False, 'false': False, 'off': False, |
1f71dffabc53
parsebool: accept always as true and never as false
Augie Fackler <durin42@gmail.com>
parents:
12087
diff
changeset
|
507 'never': False} |
12087
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
508 |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
509 def parsebool(s): |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
510 """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
|
511 |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
512 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
|
513 """ |
a88a4720c2f0
parsebool: create new function and use it for config parsing
Augie Fackler <durin42@gmail.com>
parents:
12086
diff
changeset
|
514 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
|
515 |
37476
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
516 def evalpythonliteral(s): |
e9dea82ea1f3
wireproto: convert python literal to object without using unsafe eval()
Yuya Nishihara <yuya@tcha.org>
parents:
37322
diff
changeset
|
517 """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
|
518 # 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
|
519 if pycompat.ispy3: |
3942bd8db8b2
stringutil: ast.literal_eval needs a unicode on py3
Augie Fackler <augie@google.com>
parents:
37619
diff
changeset
|
520 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
|
521 return ast.literal_eval(s) |