49 def __init__(self, *args, **kw): |
49 def __init__(self, *args, **kw): |
50 self.hint = kw.pop('hint', None) |
50 self.hint = kw.pop('hint', None) |
51 super(Hint, self).__init__(*args, **kw) |
51 super(Hint, self).__init__(*args, **kw) |
52 |
52 |
53 |
53 |
|
54 class Abort(Hint, Exception): |
|
55 """Raised if a command needs to print an error and exit.""" |
|
56 |
|
57 def __init__(self, message, hint=None, detailed_exit_code=None): |
|
58 # type: (bytes, Optional[bytes]) -> None |
|
59 self.message = message |
|
60 self.hint = hint |
|
61 self.detailed_exit_code = detailed_exit_code |
|
62 # Pass the message into the Exception constructor to help extensions |
|
63 # that look for exc.args[0]. |
|
64 Exception.__init__(self, message) |
|
65 |
|
66 def __bytes__(self): |
|
67 return self.message |
|
68 |
|
69 if pycompat.ispy3: |
|
70 |
|
71 def __str__(self): |
|
72 # the output would be unreadable if the message was translated, |
|
73 # but do not replace it with encoding.strfromlocal(), which |
|
74 # may raise another exception. |
|
75 return pycompat.sysstr(self.__bytes__()) |
|
76 |
|
77 def format(self): |
|
78 # type: () -> bytes |
|
79 from .i18n import _ |
|
80 |
|
81 message = _(b"abort: %s\n") % self.message |
|
82 if self.hint: |
|
83 message += _(b"(%s)\n") % self.hint |
|
84 return message |
|
85 |
|
86 |
54 class StorageError(Hint, Exception): |
87 class StorageError(Hint, Exception): |
55 """Raised when an error occurs in a storage layer. |
88 """Raised when an error occurs in a storage layer. |
56 |
89 |
57 Usually subclassed by a storage-specific exception. |
90 Usually subclassed by a storage-specific exception. |
58 """ |
91 """ |
178 _( |
211 _( |
179 b"unresolved conflicts (see 'hg resolve', then 'hg %s --continue')" |
212 b"unresolved conflicts (see 'hg resolve', then 'hg %s --continue')" |
180 ) |
213 ) |
181 % opname, |
214 % opname, |
182 ) |
215 ) |
183 |
|
184 |
|
185 class Abort(Hint, Exception): |
|
186 """Raised if a command needs to print an error and exit.""" |
|
187 |
|
188 def __init__(self, message, hint=None, detailed_exit_code=None): |
|
189 # type: (bytes, Optional[bytes]) -> None |
|
190 self.message = message |
|
191 self.hint = hint |
|
192 self.detailed_exit_code = detailed_exit_code |
|
193 # Pass the message into the Exception constructor to help extensions |
|
194 # that look for exc.args[0]. |
|
195 Exception.__init__(self, message) |
|
196 |
|
197 def __bytes__(self): |
|
198 return self.message |
|
199 |
|
200 if pycompat.ispy3: |
|
201 |
|
202 def __str__(self): |
|
203 # the output would be unreadable if the message was translated, |
|
204 # but do not replace it with encoding.strfromlocal(), which |
|
205 # may raise another exception. |
|
206 return pycompat.sysstr(self.__bytes__()) |
|
207 |
|
208 def format(self): |
|
209 # type: () -> bytes |
|
210 from .i18n import _ |
|
211 |
|
212 message = _(b"abort: %s\n") % self.message |
|
213 if self.hint: |
|
214 message += _(b"(%s)\n") % self.hint |
|
215 return message |
|
216 |
216 |
217 |
217 |
218 class InputError(Abort): |
218 class InputError(Abort): |
219 """Indicates that the user made an error in their input. |
219 """Indicates that the user made an error in their input. |
220 |
220 |