annotate hglib/util.py @ 145:f3c430afa598

hglib: abstract out use of cStringIO.StringIO (issue4520) The cStringIO module does not exist in Python 3, but io.BytesIO does. This change prepares for the use of io.BytesIO when available by replacing all uses of cStringIO.StringIO with an object named BytesIO.
author Brett Cannon <brett@python.org>
date Fri, 13 Mar 2015 11:31:54 -0400
parents fe74d5599539
children 8d7bf729a4db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
f3c430afa598 hglib: abstract out use of cStringIO.StringIO (issue4520)
Brett Cannon <brett@python.org>
parents: 142
diff changeset
1 import itertools, error, os, subprocess, sys
f3c430afa598 hglib: abstract out use of cStringIO.StringIO (issue4520)
Brett Cannon <brett@python.org>
parents: 142
diff changeset
2 from cStringIO import StringIO as BytesIO
141
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
3
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
4 if sys.version_info[0] > 2:
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
5 def b(s):
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
6 """Encode the string as bytes."""
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
7 return s.encode('latin-1')
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
8 else:
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
9 def b(s):
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
10 """Encode the string as bytes."""
ea80bd2775f6 hglib: introduce util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 134
diff changeset
11 return s
0
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
12
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
13 def grouper(n, iterable):
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
14 ''' list(grouper(2, range(4))) -> [(0, 1), (2, 3)] '''
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
15 args = [iter(iterable)] * n
79f88b4db15f Initial commit
Idan Kamara <idankk86@gmail.com>
parents:
diff changeset
16 return itertools.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
17
8
3ac38d500d68 move hgclient._eatlines to util
Idan Kamara <idankk86@gmail.com>
parents: 3
diff changeset
18 def eatlines(s, n):
9
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
19 """
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
20 >>> eatlines("1\\n2", 1)
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
21 '2'
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
22 >>> eatlines("1\\n2", 2)
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
23 ''
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
24 >>> eatlines("1\\n2", 3)
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
25 ''
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
26 >>> eatlines("1\\n2\\n3", 1)
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
27 '2\\n3'
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
28 """
145
f3c430afa598 hglib: abstract out use of cStringIO.StringIO (issue4520)
Brett Cannon <brett@python.org>
parents: 142
diff changeset
29 cs = BytesIO(s)
8
3ac38d500d68 move hgclient._eatlines to util
Idan Kamara <idankk86@gmail.com>
parents: 3
diff changeset
30
9
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
31 for line in cs:
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
32 n -= 1
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
33 if n == 0:
5882a698ad5c util: rewrite eatlines (faster and simpler version)
Idan Kamara <idankk86@gmail.com>
parents: 8
diff changeset
34 return cs.read()
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
35 return b('')
8
3ac38d500d68 move hgclient._eatlines to util
Idan Kamara <idankk86@gmail.com>
parents: 3
diff changeset
36
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
37 def skiplines(s, prefix):
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
38 """
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
39 Skip lines starting with prefix in s
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
40
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
41 >>> skiplines('a\\nb\\na\\n', 'a')
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
42 'b\\na\\n'
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
43 >>> skiplines('a\\na\\n', 'a')
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
44 ''
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
45 >>> skiplines('', 'a')
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
46 ''
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
47 >>> skiplines('a\\nb', 'b')
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
48 'a\\nb'
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
49 """
145
f3c430afa598 hglib: abstract out use of cStringIO.StringIO (issue4520)
Brett Cannon <brett@python.org>
parents: 142
diff changeset
50 cs = BytesIO(s)
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
51
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
52 for line in cs:
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
53 if not line.startswith(prefix):
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
54 return line + cs.read()
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
55
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
56 return b('')
19
19d2c55c3928 util: introduce skiplines
Idan Kamara <idankk86@gmail.com>
parents: 9
diff changeset
57
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
58 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
59 """
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
60 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
61
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
62 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
63
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
64 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
65 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
66 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
67
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
68 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
69
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
70 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
71
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
72 >>> cmdbuilder('cmd', a=True, b=False, c=None)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
73 ['cmd', '-a']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
74 >>> cmdbuilder('cmd', long=True)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
75 ['cmd', '--long']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
76 >>> cmdbuilder('cmd', str='s')
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
77 ['cmd', '--str', 's']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
78 >>> cmdbuilder('cmd', d_ash=True)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
79 ['cmd', '--d-ash']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
80 >>> cmdbuilder('cmd', _=True)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
81 ['cmd', '-']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
82 >>> cmdbuilder('cmd', list=[1, 2])
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
83 ['cmd', '--list', '1', '--list', '2']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
84 >>> cmdbuilder('cmd', None)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
85 ['cmd']
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
86 """
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
87 cmd = [name]
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
88 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
89 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
90 continue
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
91
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
92 arg = arg.replace(b('_'), b('-'))
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
93 if arg != b('-'):
86
f98d6e234cd9 util: eliminate py2.6 if/else expression
Matt Mackall <mpm@selenic.com>
parents: 77
diff changeset
94 if len(arg) == 1:
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
95 arg = b('-') + arg
86
f98d6e234cd9 util: eliminate py2.6 if/else expression
Matt Mackall <mpm@selenic.com>
parents: 77
diff changeset
96 else:
142
fe74d5599539 hglib: wrap all application string literals in util.b() (issue4520)
Brett Cannon <brett@python.org>
parents: 141
diff changeset
97 arg = b('--') + arg
3
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
98 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
99 if val:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
100 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
101 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
102 for v in val:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
103 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
104 cmd.append(str(v))
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
105 else:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
106 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
107 cmd.append(str(val))
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
108
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
109 for a in args:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
110 if a is not None:
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
111 cmd.append(a)
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
112
d7903b923217 util: add cmdbuilder, a helper function to generate the command to run
Idan Kamara <idankk86@gmail.com>
parents: 0
diff changeset
113 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
114
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
115 class reterrorhandler(object):
134
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
116 """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
117 argument. It remembers the return value the command returned if
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
118 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
119 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
120
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
121 >>> e = reterrorhandler('')
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
122 >>> bool(e)
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
123 True
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
124 >>> 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
125 'a'
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
126 >>> bool(e)
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
127 False
134
1b47146a4a2c style: fix long lines
Matt Mackall <mpm@selenic.com>
parents: 86
diff changeset
128
49
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
129 """
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
130 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
131 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
132 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
133 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
134 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
135 else:
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
136 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
137
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
138 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
139 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
140 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
141 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
142 return out
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
143
3d7e0325ba1c util: introduce a generic error handler that is aware of return codes
Idan Kamara <idankk86@gmail.com>
parents: 19
diff changeset
144 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
145 """ 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
146 return self.ret == 0
72
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
147
77
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
148 class propertycache(object):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
149 """
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
150 Decorator that remembers the return value of a function call.
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
151
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
152 >>> class obj(object):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
153 ... def func(self):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
154 ... print 'func'
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
155 ... return []
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
156 ... func = propertycache(func)
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
157 >>> o = obj()
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
158 >>> o.func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
159 func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
160 []
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
161 >>> o.func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
162 []
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
163 """
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
164 def __init__(self, func):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
165 self.func = func
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
166 self.name = func.__name__
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
167 def __get__(self, obj, type=None):
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
168 result = self.func(obj)
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
169 setattr(obj, self.name, result)
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
170 return result
4282391dd693 util: add propertycache decorator
Idan Kamara <idankk86@gmail.com>
parents: 74
diff changeset
171
72
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
172 close_fds = os.name == 'posix'
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
173
74
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
174 startupinfo = None
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
175 if os.name == 'nt':
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
176 startupinfo = subprocess.STARTUPINFO()
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
177 startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
178
72
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
179 def popen(args, env={}):
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
180 environ = None
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
181 if env:
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
182 environ = dict(os.environ)
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
183 environ.update(env)
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
184
15485fa4b35e util: introduce popen
Idan Kamara <idankk86@gmail.com>
parents: 62
diff changeset
185 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
186 stderr=subprocess.PIPE, close_fds=close_fds,
74
a5dd7b5d0be1 util, popen: hide subprocess window
Idan Kamara <idankk86@gmail.com>
parents: 73
diff changeset
187 startupinfo=startupinfo, env=environ)