bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1
by mbp at sourcefrog import from baz patch-364 | 1 | # -*- coding: UTF-8 -*-
 | 
| 2 | ||
| 3 | # This program is free software; you can redistribute it and/or modify
 | |
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 7 | ||
| 8 | # This program is distributed in the hope that it will be useful,
 | |
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 12 | ||
| 13 | # You should have received a copy of the GNU General Public License
 | |
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 1185.16.61
by mbp at sourcefrog - start introducing hct error classes | 17 | """Exceptions for bzr, and reporting of them.
 | 
| 18 | ||
| 19 | Exceptions are caught at a high level to report errors to the user, and
 | |
| 20 | might also be caught inside the program.  Therefore it needs to be
 | |
| 21 | possible to convert them to a meaningful string, and also for them to be
 | |
| 22 | interrogated by the program.
 | |
| 23 | ||
| 24 | Exceptions are defined such that the arguments given to the constructor
 | |
| 25 | are stored in the object as properties of the same name.  When the
 | |
| 26 | object is printed as a string, the doc string of the class is used as
 | |
| 27 | a format string with the property dictionary available to it.
 | |
| 28 | ||
| 29 | This means that exceptions can used like this:
 | |
| 30 | ||
| 31 | >>> import sys
 | |
| 32 | >>> try:
 | |
| 33 | ...   raise NotBranchError(path='/foo/bar')
 | |
| 34 | ... except:
 | |
| 35 | ...   print sys.exc_type
 | |
| 36 | ...   print sys.exc_value
 | |
| 37 | ...   print sys.exc_value.path
 | |
| 38 | bzrlib.errors.NotBranchError
 | |
| 39 | Not a branch: /foo/bar
 | |
| 40 | /foo/bar
 | |
| 41 | ||
| 42 | Therefore:
 | |
| 43 | ||
| 44 |  * create a new exception class for any class of error that can be
 | |
| 45 |    usefully distinguished.
 | |
| 46 | ||
| 47 |  * the printable form of an exception is generated by the base class
 | |
| 48 |    __str__ method
 | |
| 49 | """
 | |
| 50 | ||
| 51 | # based on Scott James Remnant's hct error classes
 | |
| 52 | ||
| 1185.16.62
by mbp at sourcefrog - convert NotBranchError to new exception base | 53 | # TODO: is there any value in providing the .args field used by standard
 | 
| 54 | # python exceptions?   A list of values with no names seems less useful 
 | |
| 55 | # to me.
 | |
| 56 | ||
| 1185.16.63
by Martin Pool - more error conversion | 57 | # TODO: Perhaps convert the exception to a string at the moment it's 
 | 
| 58 | # constructed to make sure it will succeed.  But that says nothing about
 | |
| 59 | # exceptions that are never raised.
 | |
| 60 | ||
| 61 | # TODO: Convert all the other error classes here to BzrNewError, and eliminate
 | |
| 62 | # the old one.
 | |
| 1185.16.62
by mbp at sourcefrog - convert NotBranchError to new exception base | 63 | |
| 1185.16.61
by mbp at sourcefrog - start introducing hct error classes | 64 | |
| 1
by mbp at sourcefrog import from baz patch-364 | 65 | class BzrError(StandardError): | 
| 1193
by Martin Pool - better string formatting of BzrErrors with explanation | 66 | def __str__(self): | 
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 67 |         # XXX: Should we show the exception class in 
 | 
| 68 |         # exceptions that don't provide their own message?  
 | |
| 69 |         # maybe it should be done at a higher level
 | |
| 70 |         ## n = self.__class__.__name__ + ': '
 | |
| 71 | n = '' | |
| 1195
by Martin Pool - better error display | 72 | if len(self.args) == 1: | 
| 1449
by Robert Collins teach check about ghosts | 73 | return str(self.args[0]) | 
| 1195
by Martin Pool - better error display | 74 | elif len(self.args) == 2: | 
| 1193
by Martin Pool - better string formatting of BzrErrors with explanation | 75 |             # further explanation or suggestions
 | 
| 1405
by Robert Collins remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave | 76 | try: | 
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 77 | return n + '\n '.join([self.args[0]] + self.args[1]) | 
| 1405
by Robert Collins remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave | 78 | except TypeError: | 
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 79 | return n + "%r" % self | 
| 1193
by Martin Pool - better string formatting of BzrErrors with explanation | 80 | else: | 
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 81 | return n + `self.args` | 
| 1193
by Martin Pool - better string formatting of BzrErrors with explanation | 82 | |
| 1185.1.14
by Robert Collins remove more duplicate merged hunks. Bad MERGE3, BAD. | 83 | |
| 1185.16.62
by mbp at sourcefrog - convert NotBranchError to new exception base | 84 | class BzrNewError(BzrError): | 
| 1185.16.61
by mbp at sourcefrog - start introducing hct error classes | 85 | """bzr error""" | 
| 86 |     # base classes should override the docstring with their human-
 | |
| 87 |     # readable explanation
 | |
| 88 | ||
| 89 | def __init__(self, **kwds): | |
| 90 | for key, value in kwds.items(): | |
| 91 | setattr(self, key, value) | |
| 92 | ||
| 93 | def __str__(self): | |
| 94 | try: | |
| 95 | return self.__doc__ % self.__dict__ | |
| 96 | except (NameError, ValueError, KeyError), e: | |
| 97 | return 'Unprintable exception %s: %s' \ | |
| 98 | % (self.__class__.__name__, str(e)) | |
| 99 | ||
| 100 | ||
| 1185.16.63
by Martin Pool - more error conversion | 101 | class BzrCheckError(BzrNewError): | 
| 102 | """Internal check failed: %(message)s""" | |
| 103 | def __init__(self, message): | |
| 104 | self.message = message | |
| 105 | ||
| 106 | ||
| 107 | class InvalidEntryName(BzrNewError): | |
| 108 | """Invalid entry name: %(name)s""" | |
| 109 | def __init__(self, name): | |
| 110 | self.name = name | |
| 111 | ||
| 112 | ||
| 113 | class InvalidRevisionNumber(BzrNewError): | |
| 114 | """Invalid revision number %(revno)d""" | |
| 115 | def __init__(self, revno): | |
| 116 | self.revno = revno | |
| 117 | ||
| 118 | ||
| 119 | class InvalidRevisionId(BzrNewError): | |
| 120 | """Invalid revision-id""" | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 121 | |
| 122 | ||
| 329
by Martin Pool - refactor command functions into command classes | 123 | class BzrCommandError(BzrError): | 
| 124 |     # Error from malformed user command
 | |
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 125 | def __str__(self): | 
| 126 | return self.args[0] | |
| 1
by mbp at sourcefrog import from baz patch-364 | 127 | |
| 1185.16.65
by mbp at sourcefrog - new commit --strict option | 128 | class StrictCommitFailed(Exception): | 
| 129 | """Commit refused because there are unknowns in the tree.""" | |
| 1
by mbp at sourcefrog import from baz patch-364 | 130 | |
| 1185.16.62
by mbp at sourcefrog - convert NotBranchError to new exception base | 131 | class NotBranchError(BzrNewError): | 
| 132 | """Not a branch: %(path)s""" | |
| 1185.16.61
by mbp at sourcefrog - start introducing hct error classes | 133 | def __init__(self, path): | 
| 1185.16.62
by mbp at sourcefrog - convert NotBranchError to new exception base | 134 | BzrNewError.__init__(self) | 
| 135 | self.path = path | |
| 136 | ||
| 573
by Martin Pool - new exception NotBranchError | 137 | |
| 1185.1.53
by Robert Collins raise a specific error on unsupported branches so that they can be distinguished from generic errors | 138 | class UnsupportedFormatError(BzrError): | 
| 139 | """Specified path is a bzr branch that we cannot read.""" | |
| 140 | def __str__(self): | |
| 141 | return 'unsupported branch format: %s' % self.args[0] | |
| 142 | ||
| 143 | ||
| 1185.16.72
by Martin Pool [merge] from robert and fix up tests | 144 | class NotVersionedError(BzrNewError): | 
| 145 | """%(path)s is not versioned""" | |
| 146 | def __init__(self, path): | |
| 147 | BzrNewError.__init__(self) | |
| 148 | self.path = path | |
| 753
by Martin Pool - new exception NotVersionedError | 149 | |
| 150 | ||
| 599
by Martin Pool - better error reporting from smart_add | 151 | class BadFileKindError(BzrError): | 
| 152 | """Specified file is of a kind that cannot be added. | |
| 153 | ||
| 154 |     (For example a symlink or device file.)"""
 | |
| 155 | ||
| 156 | ||
| 157 | class ForbiddenFileError(BzrError): | |
| 158 | """Cannot operate on a file because it is a control file.""" | |
| 159 | ||
| 160 | ||
| 614
by Martin Pool - unify two defintions of LockError | 161 | class LockError(Exception): | 
| 1185.16.63
by Martin Pool - more error conversion | 162 | """Lock error""" | 
| 163 |     # All exceptions from the lock/unlock functions should be from
 | |
| 164 |     # this exception class.  They will be translated as necessary. The
 | |
| 165 |     # original exception is available as e.original_error
 | |
| 882
by Martin Pool - Optionally raise EmptyCommit if there are no changes. Test for this. | 166 | |
| 167 | ||
| 1417.1.6
by Robert Collins introduce transactions for grouping actions done to and with branches | 168 | class CommitNotPossible(LockError): | 
| 169 | """A commit was attempted but we do not have a write lock open.""" | |
| 170 | ||
| 171 | ||
| 172 | class AlreadyCommitted(LockError): | |
| 173 | """A rollback was requested, but is not able to be accomplished.""" | |
| 174 | ||
| 175 | ||
| 1417.1.8
by Robert Collins use transactions in the weave store interface, which enables caching for log | 176 | class ReadOnlyError(LockError): | 
| 177 | """A write attempt was made in a read only transaction.""" | |
| 178 | ||
| 179 | ||
| 1185.16.63
by Martin Pool - more error conversion | 180 | class PointlessCommit(BzrNewError): | 
| 1185.16.64
by Martin Pool - more error conversions | 181 | """No changes to commit""" | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 182 | |
| 183 | ||
| 184 | class NoSuchRevision(BzrError): | |
| 185 | def __init__(self, branch, revision): | |
| 186 | self.branch = branch | |
| 187 | self.revision = revision | |
| 188 | msg = "Branch %s has no revision %s" % (branch, revision) | |
| 189 | BzrError.__init__(self, msg) | |
| 190 | ||
| 1034
by Martin Pool - merge bzrlib.revision.is_ancestor from aaron | 191 | |
| 1192
by Martin Pool - clean up code for retrieving stored inventories | 192 | class HistoryMissing(BzrError): | 
| 193 | def __init__(self, branch, object_type, object_id): | |
| 194 | self.branch = branch | |
| 195 | BzrError.__init__(self, | |
| 196 | '%s is missing %s {%s}' | |
| 197 | % (branch, object_type, object_id)) | |
| 198 | ||
| 199 | ||
| 1185.2.1
by Lalo Martins moving DivergedBranches from bzrlib.branch to bzrlib.errors, obeying: | 200 | class DivergedBranches(BzrError): | 
| 201 | def __init__(self, branch1, branch2): | |
| 1185.1.14
by Robert Collins remove more duplicate merged hunks. Bad MERGE3, BAD. | 202 | BzrError.__init__(self, "These branches have diverged.") | 
| 1185.2.1
by Lalo Martins moving DivergedBranches from bzrlib.branch to bzrlib.errors, obeying: | 203 | self.branch1 = branch1 | 
| 204 | self.branch2 = branch2 | |
| 205 | ||
| 1390
by Robert Collins pair programming worx... merge integration and weave | 206 | |
| 1105
by Martin Pool - expose 'find-merge-base' as a new expert command, | 207 | class UnrelatedBranches(BzrCommandError): | 
| 208 | def __init__(self): | |
| 209 | msg = "Branches have no common ancestor, and no base revision"\ | |
| 210 |             " specified."
 | |
| 211 | BzrCommandError.__init__(self, msg) | |
| 212 | ||
| 974.1.80
by Aaron Bentley Improved merge error handling and testing | 213 | class NoCommonAncestor(BzrError): | 
| 214 | def __init__(self, revision_a, revision_b): | |
| 215 | msg = "Revisions have no common ancestor: %s %s." \ | |
| 216 | % (revision_a, revision_b) | |
| 217 | BzrError.__init__(self, msg) | |
| 218 | ||
| 219 | class NoCommonRoot(BzrError): | |
| 220 | def __init__(self, revision_a, revision_b): | |
| 221 | msg = "Revisions are not derived from the same root: %s %s." \ | |
| 222 | % (revision_a, revision_b) | |
| 223 | BzrError.__init__(self, msg) | |
| 1105
by Martin Pool - expose 'find-merge-base' as a new expert command, | 224 | |
| 974.2.7
by aaron.bentley at utoronto Merged from bzr.24 | 225 | class NotAncestor(BzrError): | 
| 226 | def __init__(self, rev_id, not_ancestor_id): | |
| 1185.1.14
by Robert Collins remove more duplicate merged hunks. Bad MERGE3, BAD. | 227 | msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, | 
| 228 | rev_id) | |
| 229 | BzrError.__init__(self, msg) | |
| 230 | self.rev_id = rev_id | |
| 231 | self.not_ancestor_id = not_ancestor_id | |
| 1185.1.12
by Robert Collins merge in lsdiff/filterdiff friendliness | 232 | |
| 233 | ||
| 1092.3.4
by Robert Collins update symlink branch to integration | 234 | class NotAncestor(BzrError): | 
| 235 | def __init__(self, rev_id, not_ancestor_id): | |
| 236 | self.rev_id = rev_id | |
| 237 | self.not_ancestor_id = not_ancestor_id | |
| 238 | msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, | |
| 239 | rev_id) | |
| 240 | BzrError.__init__(self, msg) | |
| 241 | ||
| 242 | ||
| 974.1.30
by aaron.bentley at utoronto Changed copy_multi to permit failure and return a tuple, tested missing required revisions | 243 | class InstallFailed(BzrError): | 
| 244 | def __init__(self, revisions): | |
| 1185.1.14
by Robert Collins remove more duplicate merged hunks. Bad MERGE3, BAD. | 245 | msg = "Could not install revisions:\n%s" % " ,".join(revisions) | 
| 246 | BzrError.__init__(self, msg) | |
| 974.1.30
by aaron.bentley at utoronto Changed copy_multi to permit failure and return a tuple, tested missing required revisions | 247 | self.revisions = revisions | 
| 1154
by Martin Pool - fix imports for moved errors | 248 | |
| 249 | ||
| 250 | class AmbiguousBase(BzrError): | |
| 251 | def __init__(self, bases): | |
| 252 | msg = "The correct base is unclear, becase %s are all equally close" %\ | |
| 253 | ", ".join(bases) | |
| 254 | BzrError.__init__(self, msg) | |
| 255 | self.bases = bases | |
| 256 | ||
| 974.1.80
by Aaron Bentley Improved merge error handling and testing | 257 | class NoCommits(BzrError): | 
| 258 | def __init__(self, branch): | |
| 259 | msg = "Branch %s has no commits." % branch | |
| 260 | BzrError.__init__(self, msg) | |
| 1185.10.1
by Aaron Bentley Added --basis option to bzr branch | 261 | |
| 262 | class UnlistableStore(BzrError): | |
| 263 | def __init__(self, store): | |
| 264 | BzrError.__init__(self, "Store %s is not listable" % store) | |
| 265 | ||
| 266 | class UnlistableBranch(BzrError): | |
| 267 | def __init__(self, br): | |
| 268 | BzrError.__init__(self, "Stores for branch %s are not listable" % br) | |
| 1392
by Robert Collins reinstate testfetch test case | 269 | |
| 270 | ||
| 1185.13.4
by Robert Collins make reweave visible as a weave method, and quickly integrate into fetch | 271 | from bzrlib.weave import WeaveError, WeaveParentMismatch | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 272 | |
| 1185.11.9
by John Arbash Meinel Most tests pass, some problems with unavailable socket recv | 273 | class TransportError(BzrError): | 
| 274 | """All errors thrown by Transport implementations should derive | |
| 275 |     from this class.
 | |
| 276 |     """
 | |
| 277 | def __init__(self, msg=None, orig_error=None): | |
| 278 | if msg is None and orig_error is not None: | |
| 279 | msg = str(orig_error) | |
| 280 | BzrError.__init__(self, msg) | |
| 281 | self.msg = msg | |
| 282 | self.orig_error = orig_error | |
| 283 | ||
| 284 | # A set of semi-meaningful errors which can be thrown
 | |
| 285 | class TransportNotPossible(TransportError): | |
| 286 | """This is for transports where a specific function is explicitly not | |
| 287 |     possible. Such as pushing files to an HTTP server.
 | |
| 288 |     """
 | |
| 289 |     pass
 | |
| 290 | ||
| 291 | class NonRelativePath(TransportError): | |
| 292 | """An absolute path was supplied, that could not be decoded into | |
| 293 |     a relative path.
 | |
| 294 |     """
 | |
| 295 |     pass
 | |
| 296 | ||
| 297 | class NoSuchFile(TransportError, IOError): | |
| 298 | """A get() was issued for a file that doesn't exist.""" | |
| 1405
by Robert Collins remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave | 299 | |
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 300 |     # XXX: Is multiple inheritance for exceptions really needed?
 | 
| 301 | ||
| 1405
by Robert Collins remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave | 302 | def __str__(self): | 
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 303 | return 'no such file: ' + self.msg | 
| 1405
by Robert Collins remove some of the upgrade code that was duplicated with inventory_entry, and give all inventory entries a weave | 304 | |
| 1185.11.9
by John Arbash Meinel Most tests pass, some problems with unavailable socket recv | 305 | def __init__(self, msg=None, orig_error=None): | 
| 306 | import errno | |
| 307 | TransportError.__init__(self, msg=msg, orig_error=orig_error) | |
| 308 | IOError.__init__(self, errno.ENOENT, self.msg) | |
| 309 | ||
| 310 | class FileExists(TransportError, OSError): | |
| 311 | """An operation was attempted, which would overwrite an entry, | |
| 312 |     but overwritting is not supported.
 | |
| 313 | ||
| 314 |     mkdir() can throw this, but put() just overwites existing files.
 | |
| 315 |     """
 | |
| 1393.1.64
by Martin Pool - improved display of some errors, including NotBranchError | 316 |     # XXX: Is multiple inheritance for exceptions really needed?
 | 
| 1185.11.9
by John Arbash Meinel Most tests pass, some problems with unavailable socket recv | 317 | def __init__(self, msg=None, orig_error=None): | 
| 318 | import errno | |
| 319 | TransportError.__init__(self, msg=msg, orig_error=orig_error) | |
| 320 | OSError.__init__(self, errno.EEXIST, self.msg) | |
| 321 | ||
| 322 | class PermissionDenied(TransportError): | |
| 323 | """An operation cannot succeed because of a lack of permissions.""" | |
| 324 |     pass
 | |
| 325 | ||
| 326 | class ConnectionReset(TransportError): | |
| 327 | """The connection has been closed.""" | |
| 328 |     pass
 | |
| 329 | ||
| 1185.14.10
by Aaron Bentley Commit aborts with conflicts in the tree. | 330 | class ConflictsInTree(BzrError): | 
| 331 | def __init__(self): | |
| 332 | BzrError.__init__(self, "Working tree has conflicts.") | |
| 1185.12.49
by Aaron Bentley Switched to ConfigObj | 333 | |
| 334 | class ParseConfigError(BzrError): | |
| 335 | def __init__(self, errors, filename): | |
| 336 | if filename is None: | |
| 337 | filename = "" | |
| 338 | message = "Error(s) parsing config file %s:\n%s" % \ | |
| 339 | (filename, ('\n'.join(e.message for e in errors))) | |
| 340 | BzrError.__init__(self, message) | |
| 1185.12.52
by Aaron Bentley Merged more config stuff from Robert | 341 | |
| 1442.1.58
by Robert Collins gpg signing of content | 342 | class SigningFailed(BzrError): | 
| 343 | def __init__(self, command_line): | |
| 344 | BzrError.__init__(self, "Failed to gpg sign data with command '%s'" | |
| 345 | % command_line) |