Mercurial > hg
comparison mercurial/error.py @ 43076:2372284d9457
formatting: blacken the codebase
This is using my patch to black
(https://github.com/psf/black/pull/826) so we don't un-wrap collection
literals.
Done with:
hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S
# skip-blame mass-reformatting only
# no-check-commit reformats foo_bar functions
Differential Revision: https://phab.mercurial-scm.org/D6971
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:45:02 -0400 |
parents | 294afb982a88 |
children | 687b865b95ad |
comparison
equal
deleted
inserted
replaced
43075:57875cf423c9 | 43076:2372284d9457 |
---|---|
13 | 13 |
14 from __future__ import absolute_import | 14 from __future__ import absolute_import |
15 | 15 |
16 # Do not import anything but pycompat here, please | 16 # Do not import anything but pycompat here, please |
17 from . import pycompat | 17 from . import pycompat |
18 | |
18 | 19 |
19 def _tobytes(exc): | 20 def _tobytes(exc): |
20 """Byte-stringify exception in the same way as BaseException_str()""" | 21 """Byte-stringify exception in the same way as BaseException_str()""" |
21 if not exc.args: | 22 if not exc.args: |
22 return b'' | 23 return b'' |
23 if len(exc.args) == 1: | 24 if len(exc.args) == 1: |
24 return pycompat.bytestr(exc.args[0]) | 25 return pycompat.bytestr(exc.args[0]) |
25 return b'(%s)' % b', '.join(b"'%s'" % pycompat.bytestr(a) for a in exc.args) | 26 return b'(%s)' % b', '.join(b"'%s'" % pycompat.bytestr(a) for a in exc.args) |
26 | 27 |
28 | |
27 class Hint(object): | 29 class Hint(object): |
28 """Mix-in to provide a hint of an error | 30 """Mix-in to provide a hint of an error |
29 | 31 |
30 This should come first in the inheritance list to consume a hint and | 32 This should come first in the inheritance list to consume a hint and |
31 pass remaining arguments to the exception class. | 33 pass remaining arguments to the exception class. |
32 """ | 34 """ |
35 | |
33 def __init__(self, *args, **kw): | 36 def __init__(self, *args, **kw): |
34 self.hint = kw.pop(r'hint', None) | 37 self.hint = kw.pop(r'hint', None) |
35 super(Hint, self).__init__(*args, **kw) | 38 super(Hint, self).__init__(*args, **kw) |
36 | 39 |
40 | |
37 class StorageError(Hint, Exception): | 41 class StorageError(Hint, Exception): |
38 """Raised when an error occurs in a storage layer. | 42 """Raised when an error occurs in a storage layer. |
39 | 43 |
40 Usually subclassed by a storage-specific exception. | 44 Usually subclassed by a storage-specific exception. |
41 """ | 45 """ |
42 __bytes__ = _tobytes | 46 |
47 __bytes__ = _tobytes | |
48 | |
43 | 49 |
44 class RevlogError(StorageError): | 50 class RevlogError(StorageError): |
45 __bytes__ = _tobytes | 51 __bytes__ = _tobytes |
46 | 52 |
53 | |
47 class SidedataHashError(RevlogError): | 54 class SidedataHashError(RevlogError): |
48 | |
49 def __init__(self, key, expected, got): | 55 def __init__(self, key, expected, got): |
50 self.sidedatakey = key | 56 self.sidedatakey = key |
51 self.expecteddigest = expected | 57 self.expecteddigest = expected |
52 self.actualdigest = got | 58 self.actualdigest = got |
53 | 59 |
60 | |
54 class FilteredIndexError(IndexError): | 61 class FilteredIndexError(IndexError): |
55 __bytes__ = _tobytes | 62 __bytes__ = _tobytes |
63 | |
56 | 64 |
57 class LookupError(RevlogError, KeyError): | 65 class LookupError(RevlogError, KeyError): |
58 def __init__(self, name, index, message): | 66 def __init__(self, name, index, message): |
59 self.name = name | 67 self.name = name |
60 self.index = index | 68 self.index = index |
61 # this can't be called 'message' because at least some installs of | 69 # this can't be called 'message' because at least some installs of |
62 # Python 2.6+ complain about the 'message' property being deprecated | 70 # Python 2.6+ complain about the 'message' property being deprecated |
63 self.lookupmessage = message | 71 self.lookupmessage = message |
64 if isinstance(name, bytes) and len(name) == 20: | 72 if isinstance(name, bytes) and len(name) == 20: |
65 from .node import short | 73 from .node import short |
74 | |
66 name = short(name) | 75 name = short(name) |
67 RevlogError.__init__(self, '%s@%s: %s' % (index, name, message)) | 76 RevlogError.__init__(self, '%s@%s: %s' % (index, name, message)) |
68 | 77 |
69 def __bytes__(self): | 78 def __bytes__(self): |
70 return RevlogError.__bytes__(self) | 79 return RevlogError.__bytes__(self) |
71 | 80 |
72 def __str__(self): | 81 def __str__(self): |
73 return RevlogError.__str__(self) | 82 return RevlogError.__str__(self) |
74 | 83 |
84 | |
75 class AmbiguousPrefixLookupError(LookupError): | 85 class AmbiguousPrefixLookupError(LookupError): |
76 pass | 86 pass |
77 | 87 |
88 | |
78 class FilteredLookupError(LookupError): | 89 class FilteredLookupError(LookupError): |
79 pass | 90 pass |
80 | 91 |
92 | |
81 class ManifestLookupError(LookupError): | 93 class ManifestLookupError(LookupError): |
82 pass | 94 pass |
95 | |
83 | 96 |
84 class CommandError(Exception): | 97 class CommandError(Exception): |
85 """Exception raised on errors in parsing the command line.""" | 98 """Exception raised on errors in parsing the command line.""" |
86 __bytes__ = _tobytes | 99 |
100 __bytes__ = _tobytes | |
101 | |
87 | 102 |
88 class InterventionRequired(Hint, Exception): | 103 class InterventionRequired(Hint, Exception): |
89 """Exception raised when a command requires human intervention.""" | 104 """Exception raised when a command requires human intervention.""" |
90 __bytes__ = _tobytes | 105 |
106 __bytes__ = _tobytes | |
107 | |
91 | 108 |
92 class Abort(Hint, Exception): | 109 class Abort(Hint, Exception): |
93 """Raised if a command needs to print an error and exit.""" | 110 """Raised if a command needs to print an error and exit.""" |
94 __bytes__ = _tobytes | 111 |
112 __bytes__ = _tobytes | |
113 | |
95 | 114 |
96 class HookLoadError(Abort): | 115 class HookLoadError(Abort): |
97 """raised when loading a hook fails, aborting an operation | 116 """raised when loading a hook fails, aborting an operation |
98 | 117 |
99 Exists to allow more specialized catching.""" | 118 Exists to allow more specialized catching.""" |
100 | 119 |
120 | |
101 class HookAbort(Abort): | 121 class HookAbort(Abort): |
102 """raised when a validation hook fails, aborting an operation | 122 """raised when a validation hook fails, aborting an operation |
103 | 123 |
104 Exists to allow more specialized catching.""" | 124 Exists to allow more specialized catching.""" |
105 | 125 |
126 | |
106 class ConfigError(Abort): | 127 class ConfigError(Abort): |
107 """Exception raised when parsing config files""" | 128 """Exception raised when parsing config files""" |
108 | 129 |
130 | |
109 class UpdateAbort(Abort): | 131 class UpdateAbort(Abort): |
110 """Raised when an update is aborted for destination issue""" | 132 """Raised when an update is aborted for destination issue""" |
111 | 133 |
134 | |
112 class MergeDestAbort(Abort): | 135 class MergeDestAbort(Abort): |
113 """Raised when an update is aborted for destination issues""" | 136 """Raised when an update is aborted for destination issues""" |
114 | 137 |
138 | |
115 class NoMergeDestAbort(MergeDestAbort): | 139 class NoMergeDestAbort(MergeDestAbort): |
116 """Raised when an update is aborted because there is nothing to merge""" | 140 """Raised when an update is aborted because there is nothing to merge""" |
117 | 141 |
142 | |
118 class ManyMergeDestAbort(MergeDestAbort): | 143 class ManyMergeDestAbort(MergeDestAbort): |
119 """Raised when an update is aborted because destination is ambiguous""" | 144 """Raised when an update is aborted because destination is ambiguous""" |
120 | 145 |
146 | |
121 class ResponseExpected(Abort): | 147 class ResponseExpected(Abort): |
122 """Raised when an EOF is received for a prompt""" | 148 """Raised when an EOF is received for a prompt""" |
149 | |
123 def __init__(self): | 150 def __init__(self): |
124 from .i18n import _ | 151 from .i18n import _ |
152 | |
125 Abort.__init__(self, _('response expected')) | 153 Abort.__init__(self, _('response expected')) |
154 | |
126 | 155 |
127 class OutOfBandError(Hint, Exception): | 156 class OutOfBandError(Hint, Exception): |
128 """Exception raised when a remote repo reports failure""" | 157 """Exception raised when a remote repo reports failure""" |
129 __bytes__ = _tobytes | 158 |
159 __bytes__ = _tobytes | |
160 | |
130 | 161 |
131 class ParseError(Hint, Exception): | 162 class ParseError(Hint, Exception): |
132 """Raised when parsing config files and {rev,file}sets (msg[, pos])""" | 163 """Raised when parsing config files and {rev,file}sets (msg[, pos])""" |
133 __bytes__ = _tobytes | 164 |
165 __bytes__ = _tobytes | |
166 | |
134 | 167 |
135 class PatchError(Exception): | 168 class PatchError(Exception): |
136 __bytes__ = _tobytes | 169 __bytes__ = _tobytes |
170 | |
137 | 171 |
138 class UnknownIdentifier(ParseError): | 172 class UnknownIdentifier(ParseError): |
139 """Exception raised when a {rev,file}set references an unknown identifier""" | 173 """Exception raised when a {rev,file}set references an unknown identifier""" |
140 | 174 |
141 def __init__(self, function, symbols): | 175 def __init__(self, function, symbols): |
142 from .i18n import _ | 176 from .i18n import _ |
177 | |
143 ParseError.__init__(self, _("unknown identifier: %s") % function) | 178 ParseError.__init__(self, _("unknown identifier: %s") % function) |
144 self.function = function | 179 self.function = function |
145 self.symbols = symbols | 180 self.symbols = symbols |
146 | 181 |
182 | |
147 class RepoError(Hint, Exception): | 183 class RepoError(Hint, Exception): |
148 __bytes__ = _tobytes | 184 __bytes__ = _tobytes |
149 | 185 |
186 | |
150 class RepoLookupError(RepoError): | 187 class RepoLookupError(RepoError): |
151 pass | 188 pass |
152 | 189 |
190 | |
153 class FilteredRepoLookupError(RepoLookupError): | 191 class FilteredRepoLookupError(RepoLookupError): |
154 pass | 192 pass |
155 | 193 |
194 | |
156 class CapabilityError(RepoError): | 195 class CapabilityError(RepoError): |
157 pass | 196 pass |
197 | |
158 | 198 |
159 class RequirementError(RepoError): | 199 class RequirementError(RepoError): |
160 """Exception raised if .hg/requires has an unknown entry.""" | 200 """Exception raised if .hg/requires has an unknown entry.""" |
161 | 201 |
202 | |
162 class StdioError(IOError): | 203 class StdioError(IOError): |
163 """Raised if I/O to stdout or stderr fails""" | 204 """Raised if I/O to stdout or stderr fails""" |
164 | 205 |
165 def __init__(self, err): | 206 def __init__(self, err): |
166 IOError.__init__(self, err.errno, err.strerror) | 207 IOError.__init__(self, err.errno, err.strerror) |
167 | 208 |
168 # no __bytes__() because error message is derived from the standard IOError | 209 # no __bytes__() because error message is derived from the standard IOError |
210 | |
169 | 211 |
170 class UnsupportedMergeRecords(Abort): | 212 class UnsupportedMergeRecords(Abort): |
171 def __init__(self, recordtypes): | 213 def __init__(self, recordtypes): |
172 from .i18n import _ | 214 from .i18n import _ |
215 | |
173 self.recordtypes = sorted(recordtypes) | 216 self.recordtypes = sorted(recordtypes) |
174 s = ' '.join(self.recordtypes) | 217 s = ' '.join(self.recordtypes) |
175 Abort.__init__( | 218 Abort.__init__( |
176 self, _('unsupported merge state records: %s') % s, | 219 self, |
177 hint=_('see https://mercurial-scm.org/wiki/MergeStateRecords for ' | 220 _('unsupported merge state records: %s') % s, |
178 'more information')) | 221 hint=_( |
222 'see https://mercurial-scm.org/wiki/MergeStateRecords for ' | |
223 'more information' | |
224 ), | |
225 ) | |
226 | |
179 | 227 |
180 class UnknownVersion(Abort): | 228 class UnknownVersion(Abort): |
181 """generic exception for aborting from an encounter with an unknown version | 229 """generic exception for aborting from an encounter with an unknown version |
182 """ | 230 """ |
183 | 231 |
184 def __init__(self, msg, hint=None, version=None): | 232 def __init__(self, msg, hint=None, version=None): |
185 self.version = version | 233 self.version = version |
186 super(UnknownVersion, self).__init__(msg, hint=hint) | 234 super(UnknownVersion, self).__init__(msg, hint=hint) |
235 | |
187 | 236 |
188 class LockError(IOError): | 237 class LockError(IOError): |
189 def __init__(self, errno, strerror, filename, desc): | 238 def __init__(self, errno, strerror, filename, desc): |
190 IOError.__init__(self, errno, strerror, filename) | 239 IOError.__init__(self, errno, strerror, filename) |
191 self.desc = desc | 240 self.desc = desc |
192 | 241 |
193 # no __bytes__() because error message is derived from the standard IOError | 242 # no __bytes__() because error message is derived from the standard IOError |
194 | 243 |
244 | |
195 class LockHeld(LockError): | 245 class LockHeld(LockError): |
196 def __init__(self, errno, filename, desc, locker): | 246 def __init__(self, errno, filename, desc, locker): |
197 LockError.__init__(self, errno, 'Lock held', filename, desc) | 247 LockError.__init__(self, errno, 'Lock held', filename, desc) |
198 self.locker = locker | 248 self.locker = locker |
199 | 249 |
250 | |
200 class LockUnavailable(LockError): | 251 class LockUnavailable(LockError): |
201 pass | 252 pass |
253 | |
202 | 254 |
203 # LockError is for errors while acquiring the lock -- this is unrelated | 255 # LockError is for errors while acquiring the lock -- this is unrelated |
204 class LockInheritanceContractViolation(RuntimeError): | 256 class LockInheritanceContractViolation(RuntimeError): |
205 __bytes__ = _tobytes | 257 __bytes__ = _tobytes |
206 | 258 |
259 | |
207 class ResponseError(Exception): | 260 class ResponseError(Exception): |
208 """Raised to print an error with part of output and exit.""" | 261 """Raised to print an error with part of output and exit.""" |
209 __bytes__ = _tobytes | 262 |
263 __bytes__ = _tobytes | |
264 | |
210 | 265 |
211 class UnknownCommand(Exception): | 266 class UnknownCommand(Exception): |
212 """Exception raised if command is not in the command table.""" | 267 """Exception raised if command is not in the command table.""" |
213 __bytes__ = _tobytes | 268 |
269 __bytes__ = _tobytes | |
270 | |
214 | 271 |
215 class AmbiguousCommand(Exception): | 272 class AmbiguousCommand(Exception): |
216 """Exception raised if command shortcut matches more than one command.""" | 273 """Exception raised if command shortcut matches more than one command.""" |
217 __bytes__ = _tobytes | 274 |
275 __bytes__ = _tobytes | |
276 | |
218 | 277 |
219 # derived from KeyboardInterrupt to simplify some breakout code | 278 # derived from KeyboardInterrupt to simplify some breakout code |
220 class SignalInterrupt(KeyboardInterrupt): | 279 class SignalInterrupt(KeyboardInterrupt): |
221 """Exception raised on SIGTERM and SIGHUP.""" | 280 """Exception raised on SIGTERM and SIGHUP.""" |
222 | 281 |
282 | |
223 class SignatureError(Exception): | 283 class SignatureError(Exception): |
224 __bytes__ = _tobytes | 284 __bytes__ = _tobytes |
285 | |
225 | 286 |
226 class PushRaced(RuntimeError): | 287 class PushRaced(RuntimeError): |
227 """An exception raised during unbundling that indicate a push race""" | 288 """An exception raised during unbundling that indicate a push race""" |
228 __bytes__ = _tobytes | 289 |
290 __bytes__ = _tobytes | |
291 | |
229 | 292 |
230 class ProgrammingError(Hint, RuntimeError): | 293 class ProgrammingError(Hint, RuntimeError): |
231 """Raised if a mercurial (core or extension) developer made a mistake""" | 294 """Raised if a mercurial (core or extension) developer made a mistake""" |
232 | 295 |
233 def __init__(self, msg, *args, **kwargs): | 296 def __init__(self, msg, *args, **kwargs): |
237 msg = pycompat.sysstr(msg) | 300 msg = pycompat.sysstr(msg) |
238 super(ProgrammingError, self).__init__(msg, *args, **kwargs) | 301 super(ProgrammingError, self).__init__(msg, *args, **kwargs) |
239 | 302 |
240 __bytes__ = _tobytes | 303 __bytes__ = _tobytes |
241 | 304 |
305 | |
242 class WdirUnsupported(Exception): | 306 class WdirUnsupported(Exception): |
243 """An exception which is raised when 'wdir()' is not supported""" | 307 """An exception which is raised when 'wdir()' is not supported""" |
244 __bytes__ = _tobytes | 308 |
309 __bytes__ = _tobytes | |
310 | |
245 | 311 |
246 # bundle2 related errors | 312 # bundle2 related errors |
247 class BundleValueError(ValueError): | 313 class BundleValueError(ValueError): |
248 """error raised when bundle2 cannot be processed""" | 314 """error raised when bundle2 cannot be processed""" |
249 __bytes__ = _tobytes | 315 |
316 __bytes__ = _tobytes | |
317 | |
250 | 318 |
251 class BundleUnknownFeatureError(BundleValueError): | 319 class BundleUnknownFeatureError(BundleValueError): |
252 def __init__(self, parttype=None, params=(), values=()): | 320 def __init__(self, parttype=None, params=(), values=()): |
253 self.parttype = parttype | 321 self.parttype = parttype |
254 self.params = params | 322 self.params = params |
269 entries.append("%s=%r" % (par, pycompat.maybebytestr(val))) | 337 entries.append("%s=%r" % (par, pycompat.maybebytestr(val))) |
270 if entries: | 338 if entries: |
271 msg = '%s - %s' % (msg, ', '.join(entries)) | 339 msg = '%s - %s' % (msg, ', '.join(entries)) |
272 ValueError.__init__(self, msg) | 340 ValueError.__init__(self, msg) |
273 | 341 |
342 | |
274 class ReadOnlyPartError(RuntimeError): | 343 class ReadOnlyPartError(RuntimeError): |
275 """error raised when code tries to alter a part being generated""" | 344 """error raised when code tries to alter a part being generated""" |
276 __bytes__ = _tobytes | 345 |
346 __bytes__ = _tobytes | |
347 | |
277 | 348 |
278 class PushkeyFailed(Abort): | 349 class PushkeyFailed(Abort): |
279 """error raised when a pushkey part failed to update a value""" | 350 """error raised when a pushkey part failed to update a value""" |
280 | 351 |
281 def __init__(self, partid, namespace=None, key=None, new=None, old=None, | 352 def __init__( |
282 ret=None): | 353 self, partid, namespace=None, key=None, new=None, old=None, ret=None |
354 ): | |
283 self.partid = partid | 355 self.partid = partid |
284 self.namespace = namespace | 356 self.namespace = namespace |
285 self.key = key | 357 self.key = key |
286 self.new = new | 358 self.new = new |
287 self.old = old | 359 self.old = old |
288 self.ret = ret | 360 self.ret = ret |
289 # no i18n expected to be processed into a better message | 361 # no i18n expected to be processed into a better message |
290 Abort.__init__(self, 'failed to update value for "%s/%s"' | 362 Abort.__init__( |
291 % (namespace, key)) | 363 self, 'failed to update value for "%s/%s"' % (namespace, key) |
364 ) | |
365 | |
292 | 366 |
293 class CensoredNodeError(StorageError): | 367 class CensoredNodeError(StorageError): |
294 """error raised when content verification fails on a censored node | 368 """error raised when content verification fails on a censored node |
295 | 369 |
296 Also contains the tombstone data substituted for the uncensored data. | 370 Also contains the tombstone data substituted for the uncensored data. |
297 """ | 371 """ |
298 | 372 |
299 def __init__(self, filename, node, tombstone): | 373 def __init__(self, filename, node, tombstone): |
300 from .node import short | 374 from .node import short |
375 | |
301 StorageError.__init__(self, '%s:%s' % (filename, short(node))) | 376 StorageError.__init__(self, '%s:%s' % (filename, short(node))) |
302 self.tombstone = tombstone | 377 self.tombstone = tombstone |
378 | |
303 | 379 |
304 class CensoredBaseError(StorageError): | 380 class CensoredBaseError(StorageError): |
305 """error raised when a delta is rejected because its base is censored | 381 """error raised when a delta is rejected because its base is censored |
306 | 382 |
307 A delta based on a censored revision must be formed as single patch | 383 A delta based on a censored revision must be formed as single patch |
308 operation which replaces the entire base with new content. This ensures | 384 operation which replaces the entire base with new content. This ensures |
309 the delta may be applied by clones which have not censored the base. | 385 the delta may be applied by clones which have not censored the base. |
310 """ | 386 """ |
311 | 387 |
388 | |
312 class InvalidBundleSpecification(Exception): | 389 class InvalidBundleSpecification(Exception): |
313 """error raised when a bundle specification is invalid. | 390 """error raised when a bundle specification is invalid. |
314 | 391 |
315 This is used for syntax errors as opposed to support errors. | 392 This is used for syntax errors as opposed to support errors. |
316 """ | 393 """ |
317 __bytes__ = _tobytes | 394 |
395 __bytes__ = _tobytes | |
396 | |
318 | 397 |
319 class UnsupportedBundleSpecification(Exception): | 398 class UnsupportedBundleSpecification(Exception): |
320 """error raised when a bundle specification is not supported.""" | 399 """error raised when a bundle specification is not supported.""" |
321 __bytes__ = _tobytes | 400 |
401 __bytes__ = _tobytes | |
402 | |
322 | 403 |
323 class CorruptedState(Exception): | 404 class CorruptedState(Exception): |
324 """error raised when a command is not able to read its state from file""" | 405 """error raised when a command is not able to read its state from file""" |
325 __bytes__ = _tobytes | 406 |
407 __bytes__ = _tobytes | |
408 | |
326 | 409 |
327 class PeerTransportError(Abort): | 410 class PeerTransportError(Abort): |
328 """Transport-level I/O error when communicating with a peer repo.""" | 411 """Transport-level I/O error when communicating with a peer repo.""" |
329 | 412 |
413 | |
330 class InMemoryMergeConflictsError(Exception): | 414 class InMemoryMergeConflictsError(Exception): |
331 """Exception raised when merge conflicts arose during an in-memory merge.""" | 415 """Exception raised when merge conflicts arose during an in-memory merge.""" |
332 __bytes__ = _tobytes | 416 |
417 __bytes__ = _tobytes | |
418 | |
333 | 419 |
334 class WireprotoCommandError(Exception): | 420 class WireprotoCommandError(Exception): |
335 """Represents an error during execution of a wire protocol command. | 421 """Represents an error during execution of a wire protocol command. |
336 | 422 |
337 Should only be thrown by wire protocol version 2 commands. | 423 Should only be thrown by wire protocol version 2 commands. |
338 | 424 |
339 The error is a formatter string and an optional iterable of arguments. | 425 The error is a formatter string and an optional iterable of arguments. |
340 """ | 426 """ |
427 | |
341 def __init__(self, message, args=None): | 428 def __init__(self, message, args=None): |
342 self.message = message | 429 self.message = message |
343 self.messageargs = args | 430 self.messageargs = args |