annotate hglib/util.py @ 224:2ab42323f149

client: handle commit messages with \0 characters for all commands Each of the impacted commands will now use the 'json' template, which they all support as of Mercurial 3.7.3 (the first version tested in the regression tests). Note: I tried to add a test with null bytes, but both hglib and using hg directly through subprocess rejected adding a commit message with a null byte.
author Mathias De Mare <mathias.de_mare@nokia.com>
date Mon, 13 Mar 2023 15:32:20 +0100
parents 2d0ec6097d78
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
0808bb03add5 util: don't try to use itertools.izip under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 150
diff changeset
1 import os, subprocess, sys
148
c1b966866ed7 hglib: make all imports absolute (issue4520)
Brett Cannon <brett@python.org>
parents: 146
diff changeset
2 from hglib import error
146
8d7bf729a4db hglib: use io.BytesIO when available (issue4520)
Brett Cannon <brett@python.org>
parents: 145
diff changeset
3 try:
8d7bf729a4db hglib: use io.BytesIO when available (issue4520)
Brett Cannon <brett@python.org>
parents: 145
diff changeset
4 from io import BytesIO
8d7bf729a4db hglib: use io.BytesIO when available (issue4520)
Brett Cannon <brett@python.org>
parents: 145
diff changeset
5 except ImportError:
8d7bf729a4db hglib: use io.BytesIO when available (issue4520)
Brett Cannon <brett@python.org>
parents: 145
diff changeset
6 from cStringIO import StringIO as BytesIO
141
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
7
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
8 if sys.version_info[0] > 2:
152
0808bb03add5 util: don't try to use itertools.izip under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 150
diff changeset
9 izip = zip
153
ef8eb78fc88d hglib: don't try to use long under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 152
diff changeset
10 integertypes = (int,)
152
0808bb03add5 util: don't try to use itertools.izip under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 150
diff changeset
11
141
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
12 def b(s):
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
13 """Encode the string as bytes."""
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
14 return s.encode('latin-1')
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
15 else:
152
0808bb03add5 util: don't try to use itertools.izip under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 150
diff changeset
16 from itertools import izip
153
ef8eb78fc88d hglib: don't try to use long under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 152
diff changeset
17 integertypes = (long, int)
158
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
18 bytes = str # Defined in Python 2.6/2.7, but to the same value.
152
0808bb03add5 util: don't try to use itertools.izip under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 150
diff changeset
19
141
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
20 def b(s):
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
21 """Encode the string as bytes."""
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
22 return s
0
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
23
150
b94e1263836c util: introduce strtobytes() (issue4520)
Brett Cannon <brett@python.org>
parents: 149
diff changeset
24 def strtobytes(s):
b94e1263836c util: introduce strtobytes() (issue4520)
Brett Cannon <brett@python.org>
parents: 149
diff changeset
25 """Return the bytes of the string representation of an object."""
b94e1263836c util: introduce strtobytes() (issue4520)
Brett Cannon <brett@python.org>
parents: 149
diff changeset
26 return str(s).encode('latin-1')
b94e1263836c util: introduce strtobytes() (issue4520)
Brett Cannon <brett@python.org>
parents: 149
diff changeset
27
0
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
28 def grouper(n, iterable):
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
29 ''' list(grouper(2, range(4))) -> [(0, 1), (2, 3)] '''
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
30 args = [iter(iterable)] * n
152
0808bb03add5 util: don't try to use itertools.izip under Python 3 (issue4520)
Brett Cannon <brett@python.org>
parents: 150
diff changeset
31 return izip(*args)
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
32
8
3ac38d500d68 move hgclient._eatlines to util
Idan Kamara <idankk86@gmail.com>
parents: 3
diff changeset
33 def eatlines(s, n):
9
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
34 """
159
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
35 >>> eatlines(b("1\\n2"), 1) == b('2')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
36 True
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
37 >>> eatlines(b("1\\n2"), 2) == b('')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
38 True
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
39 >>> eatlines(b("1\\n2"), 3) == b('')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
40 True
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
41 >>> eatlines(b("1\\n2\\n3"), 1) == b('2\\n3')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
42 True
9
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
43 """
145
f3c430afa598 hglib: abstract out use of cStringIO.StringIO (issue4520)
Brett Cannon <brett@python.org>
parents: 142
diff changeset
44 cs = BytesIO(s)
8
3ac38d500d68 move hgclient._eatlines to util
Idan Kamara <idankk86@gmail.com>
parents: 3
diff changeset
45
9
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
46 for line in cs:
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
47 n -= 1
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
48 if n == 0:
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
49 return cs.read()
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
50 return b('')
8
3ac38d500d68 move hgclient._eatlines to util
Idan Kamara <idankk86@gmail.com>
parents: 3
diff changeset
51
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
52 def skiplines(s, prefix):
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
53 """
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
54 Skip lines starting with prefix in s
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
55
159
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
56 >>> skiplines(b('a\\nb\\na\\n'), b('a')) == b('b\\na\\n')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
57 True
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
58 >>> skiplines(b('a\\na\\n'), b('a')) == b('')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
59 True
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
60 >>> skiplines(b(''), b('a')) == b('')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
61 True
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
62 >>> skiplines(b('a\\nb'), b('b')) == b('a\\nb')
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
63 True
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
64 """
145
f3c430afa598 hglib: abstract out use of cStringIO.StringIO (issue4520)
Brett Cannon <brett@python.org>
parents: 142
diff changeset
65 cs = BytesIO(s)
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
66
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
67 for line in cs:
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
68 if not line.startswith(prefix):
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
69 return line + cs.read()
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
70
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
71 return b('')
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
72
158
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
73 def _cmdval(val):
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
74 if isinstance(val, bytes):
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
75 return val
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
76 else:
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
77 return strtobytes(val)
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
78
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
79 def cmdbuilder(name, *args, **kwargs):
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
80 """
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
81 A helper for building the command arguments
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
82
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
83 args are the positional arguments
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
84
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
85 kwargs are the options
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
86 keys that are single lettered are prepended with '-', others with '--',
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
87 underscores are replaced with dashes
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
88
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
89 keys with False boolean values are ignored, lists add the key multiple times
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
90
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
91 None arguments are skipped
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
92
158
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
93 >>> cmdbuilder(b('cmd'), a=True, b=False, c=None) == [b('cmd'), b('-a')]
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
94 True
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
95 >>> cmdbuilder(b('cmd'), long=True) == [b('cmd'), b('--long')]
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
96 True
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
97 >>> cmdbuilder(b('cmd'), s=b('hort')) == [b('cmd'), b('-short')]
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
98 True
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
99 >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str=s')]
158
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
100 True
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
101 >>> cmdbuilder(b('cmd'), d_ash=True) == [b('cmd'), b('--d-ash')]
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
102 True
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
103 >>> cmdbuilder(b('cmd'), _=True) == [b('cmd'), b('-')]
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
104 True
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
105 >>> cmdbuilder(b('cmd'), l=[1, 2]) == [b('cmd'), b('-l1'), b('-l2')]
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
106 True
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
107 >>> expect = [b('cmd'), b('--list=1'), b('--list=2')]
158
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
108 >>> cmdbuilder(b('cmd'), list=[1, 2]) == expect
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
109 True
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
110 >>> cmdbuilder(b('cmd'), None) == [b('cmd')]
2104fc9aa513 util: make cmdbuilder work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 153
diff changeset
111 True
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
112 >>> cmdbuilder(b('cmd'), b('-a')) == [b('cmd'), b('--'), b('-a')]
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
113 True
205
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
114 >>> cmdbuilder(b('cmd'), b('')) == [b('cmd'), b('--'), b('')]
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
115 True
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
116 >>> cmdbuilder(b('cmd'), s=b('')) == [b('cmd'), b('-s'), b('')]
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
117 True
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
118 >>> cmdbuilder(b('cmd'), s=[b('')]) == [b('cmd'), b('-s'), b('')]
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
119 True
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
120 >>> cmdbuilder(b('cmd'), long=b('')) == [b('cmd'), b('--long=')]
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
121 True
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
122 """
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
123 cmd = [name]
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
124 for arg, val in kwargs.items():
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
125 if val is None:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
126 continue
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
127
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
128 arg = pfx = arg.encode('latin-1').replace(b('_'), b('-'))
205
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
129 short = (len(arg) == 1)
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
130 if arg != b('-'):
205
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
131 if short:
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
132 arg = pfx = b('-') + arg
86
f98d6e234cd9 util: eliminate py2.6 if/else expression
Matt Mackall <mpm@selenic.com>
parents: 77
diff changeset
133 else:
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
134 arg = b('--') + arg
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
135 pfx = arg + b('=')
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
136 if isinstance(val, bool):
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
137 if val:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
138 cmd.append(arg)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
139 elif isinstance(val, list):
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
140 for v in val:
205
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
141 s = _cmdval(v)
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
142 if s or not short:
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
143 cmd.append(pfx + s)
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
144 else:
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
145 cmd.extend([arg, s])
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
146 else:
205
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
147 s = _cmdval(val)
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
148 if s or not short:
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
149 cmd.append(pfx + s)
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
150 else:
2d0ec6097d78 util: fix handling of empty short option
Yuya Nishihara <yuya@tcha.org>
parents: 193
diff changeset
151 cmd.extend([arg, s])
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
152
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
153 args = [a for a in args if a is not None]
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
154 if args:
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
155 cmd.append(b('--'))
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
156 for a in args:
193
32e8d51ec16c util: make cmdbuilder() robust for faulty parsing of early options
Yuya Nishihara <yuya@tcha.org>
parents: 182
diff changeset
157 cmd.append(a)
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
158
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
159 return cmd
49
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
160
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
161 class reterrorhandler(object):
134
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
162 """This class is meant to be used with rawcommand() error handler
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
163 argument. It remembers the return value the command returned if
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
164 it's one of allowed values, which is only 1 if none are given.
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
165 Otherwise it raises a CommandError.
49
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
166
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
167 >>> e = reterrorhandler('')
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
168 >>> bool(e)
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
169 True
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
170 >>> e(1, 'a', '')
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
171 'a'
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
172 >>> bool(e)
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
173 False
134
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
174
49
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
175 """
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
176 def __init__(self, args, allowed=None):
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
177 self.args = args
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
178 self.ret = 0
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
179 if allowed is None:
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
180 self.allowed = [1]
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
181 else:
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
182 self.allowed = allowed
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
183
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
184 def __call__(self, ret, out, err):
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
185 self.ret = ret
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
186 if ret not in self.allowed:
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
187 raise error.CommandError(self.args, ret, out, err)
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
188 return out
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
189
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
190 def __nonzero__(self):
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
191 """ Returns True if the return code was 0, False otherwise """
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
192 return self.ret == 0
72
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
193
149
958307b30af3 hglib: add a __bool__ method where __nonzero__ is defined (issue4520)
Brett Cannon <brett@python.org>
parents: 148
diff changeset
194 def __bool__(self):
958307b30af3 hglib: add a __bool__ method where __nonzero__ is defined (issue4520)
Brett Cannon <brett@python.org>
parents: 148
diff changeset
195 return self.__nonzero__()
958307b30af3 hglib: add a __bool__ method where __nonzero__ is defined (issue4520)
Brett Cannon <brett@python.org>
parents: 148
diff changeset
196
77
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
197 class propertycache(object):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
198 """
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
199 Decorator that remembers the return value of a function call.
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
200
159
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
201 >>> execcount = 0
77
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
202 >>> class obj(object):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
203 ... def func(self):
159
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
204 ... global execcount
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
205 ... execcount += 1
77
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
206 ... return []
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
207 ... func = propertycache(func)
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
208 >>> o = obj()
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
209 >>> o.func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
210 []
159
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
211 >>> execcount
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
212 1
77
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
213 >>> o.func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
214 []
159
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
215 >>> execcount
16496e0f3c09 util: update doctests to work with bytes (issue4520)
Brett Cannon <brett@python.org>
parents: 158
diff changeset
216 1
77
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
217 """
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
218 def __init__(self, func):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
219 self.func = func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
220 self.name = func.__name__
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
221 def __get__(self, obj, type=None):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
222 result = self.func(obj)
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
223 setattr(obj, self.name, result)
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
224 return result
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
225
72
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
226 close_fds = os.name == 'posix'
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
227
74
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
228 startupinfo = None
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
229 if os.name == 'nt':
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
230 startupinfo = subprocess.STARTUPINFO()
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
231 startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
232
182
0f81ed8e147b util: drop mutable default from popen()
Yuya Nishihara <yuya@tcha.org>
parents: 159
diff changeset
233 def popen(args, env=None):
72
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
234 environ = None
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
235 if env:
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
236 environ = dict(os.environ)
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
237 environ.update(env)
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
238
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
239 return subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
73
77ae99e032f6 util, popen: redirect stderr as well (for hglib.init in case of error)
Idan Kamara <idankk86@gmail.com>
parents: 72
diff changeset
240 stderr=subprocess.PIPE, close_fds=close_fds,
74
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
241 startupinfo=startupinfo, env=environ)