~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Robert Collins
  • Date: 2006-04-12 04:57:34 UTC
  • mto: This revision was merged to the branch mainline in revision 1654.
  • Revision ID: robertc@robertcollins.net-20060412045734-3e03b7af0860a5a9
 * 'pull' and 'push' now normalise the revision history, so that any two
   branches with the same tip revision will have the same output from 'log'.
   (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python
2
 
# -*- coding: UTF-8 -*-
 
1
# Copyright (C) 2005, 2006 Canonical
3
2
 
4
3
# This program is free software; you can redistribute it and/or modify
5
4
# it under the terms of the GNU General Public License as published by
15
14
# along with this program; if not, write to the Free Software
16
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
16
 
18
 
 
19
 
__copyright__ = "Copyright (C) 2005 Canonical Ltd."
20
 
__author__ = "Martin Pool <mbp@canonical.com>"
21
 
 
22
 
 
23
 
######################################################################
24
 
# exceptions 
 
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
...   path = getattr(sys.exc_value, 'path')
 
38
...   if path is not None:
 
39
...     print path
 
40
bzrlib.errors.NotBranchError
 
41
Not a branch: /foo/bar
 
42
/foo/bar
 
43
 
 
44
Therefore:
 
45
 
 
46
 * create a new exception class for any class of error that can be
 
47
   usefully distinguished.
 
48
 
 
49
 * the printable form of an exception is generated by the base class
 
50
   __str__ method
 
51
 
 
52
Exception strings should start with a capital letter and not have a final
 
53
fullstop.
 
54
"""
 
55
 
 
56
# based on Scott James Remnant's hct error classes
 
57
 
 
58
# TODO: is there any value in providing the .args field used by standard
 
59
# python exceptions?   A list of values with no names seems less useful 
 
60
# to me.
 
61
 
 
62
# TODO: Perhaps convert the exception to a string at the moment it's 
 
63
# constructed to make sure it will succeed.  But that says nothing about
 
64
# exceptions that are never raised.
 
65
 
 
66
# TODO: Convert all the other error classes here to BzrNewError, and eliminate
 
67
# the old one.
 
68
 
 
69
 
25
70
class BzrError(StandardError):
26
 
    pass
27
 
 
28
 
class BzrCheckError(BzrError):
29
 
    pass
30
 
 
31
 
 
32
 
class InvalidRevisionNumber(BzrError):
 
71
    def __str__(self):
 
72
        # XXX: Should we show the exception class in 
 
73
        # exceptions that don't provide their own message?  
 
74
        # maybe it should be done at a higher level
 
75
        ## n = self.__class__.__name__ + ': '
 
76
        n = ''
 
77
        if len(self.args) == 1:
 
78
            return str(self.args[0])
 
79
        elif len(self.args) == 2:
 
80
            # further explanation or suggestions
 
81
            try:
 
82
                return n + '\n  '.join([self.args[0]] + self.args[1])
 
83
            except TypeError:
 
84
                return n + "%r" % self
 
85
        else:
 
86
            return n + `self.args`
 
87
 
 
88
 
 
89
class BzrNewError(BzrError):
 
90
    """bzr error"""
 
91
    # base classes should override the docstring with their human-
 
92
    # readable explanation
 
93
 
 
94
    def __init__(self, **kwds):
 
95
        for key, value in kwds.items():
 
96
            setattr(self, key, value)
 
97
 
 
98
    def __str__(self):
 
99
        try:
 
100
            return self.__doc__ % self.__dict__
 
101
        except (NameError, ValueError, KeyError), e:
 
102
            return 'Unprintable exception %s: %s' \
 
103
                % (self.__class__.__name__, str(e))
 
104
 
 
105
 
 
106
class BzrCheckError(BzrNewError):
 
107
    """Internal check failed: %(message)s"""
 
108
 
 
109
    def __init__(self, message):
 
110
        BzrNewError.__init__(self)
 
111
        self.message = message
 
112
 
 
113
 
 
114
class InvalidEntryName(BzrNewError):
 
115
    """Invalid entry name: %(name)s"""
 
116
    def __init__(self, name):
 
117
        BzrNewError.__init__(self)
 
118
        self.name = name
 
119
 
 
120
 
 
121
class InvalidRevisionNumber(BzrNewError):
 
122
    """Invalid revision number %(revno)d"""
33
123
    def __init__(self, revno):
34
 
        self.args = [revno]
35
 
        
36
 
    def __str__(self):
37
 
        return 'invalid revision number: %r' % self.args[0]
38
 
 
39
 
 
40
 
class InvalidRevisionId(BzrError):
41
 
    pass
 
124
        BzrNewError.__init__(self)
 
125
        self.revno = revno
 
126
 
 
127
 
 
128
class InvalidRevisionId(BzrNewError):
 
129
    """Invalid revision-id {%(revision_id)s} in %(branch)s"""
 
130
    def __init__(self, revision_id, branch):
 
131
        BzrNewError.__init__(self)
 
132
        self.revision_id = revision_id
 
133
        self.branch = branch
 
134
 
 
135
 
 
136
class NoWorkingTree(BzrNewError):
 
137
    """No WorkingTree exists for %s(base)."""
 
138
    
 
139
    def __init__(self, base):
 
140
        BzrNewError.__init__(self)
 
141
        self.base = base
 
142
 
 
143
 
 
144
class NotLocalUrl(BzrNewError):
 
145
    """%s(url) is not a local path."""
 
146
    
 
147
    def __init__(self, url):
 
148
        BzrNewError.__init__(self)
 
149
        self.url = url
42
150
 
43
151
 
44
152
class BzrCommandError(BzrError):
45
153
    # Error from malformed user command
46
 
    pass
47
 
 
48
 
 
49
 
class NotBranchError(BzrError):
50
 
    """Specified path is not in a branch"""
51
 
    pass
52
 
 
53
 
 
54
 
class NotVersionedError(BzrError):
55
 
    """Specified object is not versioned."""
 
154
    # This is being misused as a generic exception
 
155
    # pleae subclass. RBC 20051030
 
156
    #
 
157
    # I think it's a waste of effort to differentiate between errors that
 
158
    # are not intended to be caught anyway.  UI code need not subclass
 
159
    # BzrCommandError, and non-UI code should not throw a subclass of
 
160
    # BzrCommandError.  ADHB 20051211
 
161
    def __str__(self):
 
162
        return self.args[0]
 
163
 
 
164
 
 
165
class BzrOptionError(BzrCommandError):
 
166
    """Some missing or otherwise incorrect option was supplied."""
 
167
 
 
168
    
 
169
class StrictCommitFailed(Exception):
 
170
    """Commit refused because there are unknowns in the tree."""
 
171
 
 
172
 
 
173
class PathError(BzrNewError):
 
174
    """Generic path error: %(path)r%(extra)s)"""
 
175
    def __init__(self, path, extra=None):
 
176
        BzrNewError.__init__(self)
 
177
        self.path = path
 
178
        if extra:
 
179
            self.extra = ': ' + str(extra)
 
180
        else:
 
181
            self.extra = ''
 
182
 
 
183
 
 
184
class NoSuchFile(PathError):
 
185
    """No such file: %(path)r%(extra)s"""
 
186
 
 
187
 
 
188
class FileExists(PathError):
 
189
    """File exists: %(path)r%(extra)s"""
 
190
 
 
191
 
 
192
class DirectoryNotEmpty(PathError):
 
193
    """Directory not empty: %(path)r%(extra)s"""
 
194
 
 
195
 
 
196
class ResourceBusy(PathError):
 
197
    """Device or resource busy: %(path)r%(extra)s"""
 
198
 
 
199
 
 
200
class PermissionDenied(PathError):
 
201
    """Permission denied: %(path)r%(extra)s"""
 
202
 
 
203
 
 
204
class PathNotChild(BzrNewError):
 
205
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
 
206
    def __init__(self, path, base, extra=None):
 
207
        BzrNewError.__init__(self)
 
208
        self.path = path
 
209
        self.base = base
 
210
        if extra:
 
211
            self.extra = ': ' + str(extra)
 
212
        else:
 
213
            self.extra = ''
 
214
 
 
215
 
 
216
class NotBranchError(BzrNewError):
 
217
    """Not a branch: %(path)s"""
 
218
    def __init__(self, path):
 
219
        BzrNewError.__init__(self)
 
220
        self.path = path
 
221
 
 
222
 
 
223
class NoRepositoryPresent(BzrNewError):
 
224
    """Not repository present: %(path)r"""
 
225
    def __init__(self, bzrdir):
 
226
        BzrNewError.__init__(self)
 
227
        self.path = bzrdir.transport.clone('..').base
 
228
 
 
229
 
 
230
class FileInWrongBranch(BzrNewError):
 
231
    """File %(path)s in not in branch %(branch_base)s."""
 
232
 
 
233
    def __init__(self, branch, path):
 
234
        BzrNewError.__init__(self)
 
235
        self.branch = branch
 
236
        self.branch_base = branch.base
 
237
        self.path = path
 
238
 
 
239
 
 
240
class UnsupportedFormatError(BzrError):
 
241
    """Specified path is a bzr branch that we recognize but cannot read."""
 
242
    def __str__(self):
 
243
        return 'unsupported branch format: %s' % self.args[0]
 
244
 
 
245
 
 
246
class UnknownFormatError(BzrError):
 
247
    """Specified path is a bzr branch whose format we do not recognize."""
 
248
    def __str__(self):
 
249
        return 'unknown branch format: %s' % self.args[0]
 
250
 
 
251
 
 
252
class IncompatibleFormat(BzrNewError):
 
253
    """Format %(format)s is not compatible with .bzr version %(bzrdir)s."""
 
254
 
 
255
    def __init__(self, format, bzrdir_format):
 
256
        BzrNewError.__init__(self)
 
257
        self.format = format
 
258
        self.bzrdir = bzrdir_format
 
259
 
 
260
 
 
261
class NotVersionedError(BzrNewError):
 
262
    """%(path)s is not versioned"""
 
263
    def __init__(self, path):
 
264
        BzrNewError.__init__(self)
 
265
        self.path = path
56
266
 
57
267
 
58
268
class BadFileKindError(BzrError):
59
269
    """Specified file is of a kind that cannot be added.
60
270
 
61
271
    (For example a symlink or device file.)"""
62
 
    pass
63
272
 
64
273
 
65
274
class ForbiddenFileError(BzrError):
66
275
    """Cannot operate on a file because it is a control file."""
67
 
    pass
68
 
 
69
 
 
70
 
class LockError(Exception):
71
 
    """All exceptions from the lock/unlock functions should be from
72
 
    this exception class.  They will be translated as necessary. The
73
 
    original exception is available as e.original_error
74
 
    """
75
 
    def __init__(self, e=None):
76
 
        self.original_error = e
77
 
        if e:
78
 
            Exception.__init__(self, e)
79
 
        else:
80
 
            Exception.__init__(self)
81
 
 
82
 
 
83
 
class PointlessCommit(Exception):
84
 
    """Commit failed because nothing was changed."""
 
276
 
 
277
 
 
278
class LockError(BzrNewError):
 
279
    """Lock error: %(message)s"""
 
280
    # All exceptions from the lock/unlock functions should be from
 
281
    # this exception class.  They will be translated as necessary. The
 
282
    # original exception is available as e.original_error
 
283
    #
 
284
    # New code should prefer to raise specific subclasses
 
285
    def __init__(self, message):
 
286
        self.message = message
 
287
 
 
288
 
 
289
class CommitNotPossible(LockError):
 
290
    """A commit was attempted but we do not have a write lock open."""
 
291
    def __init__(self):
 
292
        pass
 
293
 
 
294
 
 
295
class AlreadyCommitted(LockError):
 
296
    """A rollback was requested, but is not able to be accomplished."""
 
297
    def __init__(self):
 
298
        pass
 
299
 
 
300
 
 
301
class ReadOnlyError(LockError):
 
302
    """A write attempt was made in a read only transaction on %(obj)s"""
 
303
    def __init__(self, obj):
 
304
        self.obj = obj
 
305
 
 
306
 
 
307
class OutSideTransaction(BzrNewError):
 
308
    """A transaction related operation was attempted after the transaction finished."""
 
309
 
 
310
 
 
311
class ObjectNotLocked(LockError):
 
312
    """%(obj)r is not locked"""
 
313
    # this can indicate that any particular object is not locked; see also
 
314
    # LockNotHeld which means that a particular *lock* object is not held by
 
315
    # the caller -- perhaps they should be unified.
 
316
    def __init__(self, obj):
 
317
        self.obj = obj
 
318
 
 
319
 
 
320
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
321
    """Cannot change object %(obj)r in read only transaction"""
 
322
    def __init__(self, obj):
 
323
        self.obj = obj
 
324
 
 
325
 
 
326
class UnlockableTransport(LockError):
 
327
    """Cannot lock: transport is read only: %(transport)s"""
 
328
    def __init__(self, transport):
 
329
        self.transport = transport
 
330
 
 
331
 
 
332
class LockContention(LockError):
 
333
    """Could not acquire lock %(lock)s"""
 
334
    # TODO: show full url for lock, combining the transport and relative bits?
 
335
    def __init__(self, lock):
 
336
        self.lock = lock
 
337
 
 
338
 
 
339
class LockBroken(LockError):
 
340
    """Lock was broken while still open: %(lock)s - check storage consistency!"""
 
341
    def __init__(self, lock):
 
342
        self.lock = lock
 
343
 
 
344
 
 
345
class LockBreakMismatch(LockError):
 
346
    """Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
 
347
    def __init__(self, lock, holder, target):
 
348
        self.lock = lock
 
349
        self.holder = holder
 
350
        self.target = target
 
351
 
 
352
 
 
353
class LockNotHeld(LockError):
 
354
    """Lock not held: %(lock)s"""
 
355
    def __init__(self, lock):
 
356
        self.lock = lock
 
357
 
 
358
 
 
359
class PointlessCommit(BzrNewError):
 
360
    """No changes to commit"""
 
361
 
 
362
 
 
363
class UpgradeReadonly(BzrNewError):
 
364
    """Upgrade URL cannot work with readonly URL's."""
 
365
 
 
366
 
 
367
class UpToDateFormat(BzrNewError):
 
368
    """The branch format %(format)s is already at the most recent format."""
 
369
 
 
370
    def __init__(self, format):
 
371
        BzrNewError.__init__(self)
 
372
        self.format = format
 
373
 
 
374
 
 
375
 
 
376
class StrictCommitFailed(Exception):
 
377
    """Commit refused because there are unknowns in the tree."""
85
378
 
86
379
 
87
380
class NoSuchRevision(BzrError):
92
385
        BzrError.__init__(self, msg)
93
386
 
94
387
 
 
388
class HistoryMissing(BzrError):
 
389
    def __init__(self, branch, object_type, object_id):
 
390
        self.branch = branch
 
391
        BzrError.__init__(self,
 
392
                          '%s is missing %s {%s}'
 
393
                          % (branch, object_type, object_id))
 
394
 
 
395
 
 
396
class DivergedBranches(BzrError):
 
397
 
 
398
    def __init__(self, branch1, branch2):
 
399
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
 
400
        self.branch1 = branch1
 
401
        self.branch2 = branch2
 
402
 
 
403
 
 
404
class UnrelatedBranches(BzrCommandError):
 
405
    def __init__(self):
 
406
        msg = "Branches have no common ancestor, and no base revision"\
 
407
            " specified."
 
408
        BzrCommandError.__init__(self, msg)
 
409
 
 
410
 
 
411
class NoCommonAncestor(BzrError):
 
412
    def __init__(self, revision_a, revision_b):
 
413
        msg = "Revisions have no common ancestor: %s %s." \
 
414
            % (revision_a, revision_b) 
 
415
        BzrError.__init__(self, msg)
 
416
 
 
417
 
 
418
class NoCommonRoot(BzrError):
 
419
    def __init__(self, revision_a, revision_b):
 
420
        msg = "Revisions are not derived from the same root: %s %s." \
 
421
            % (revision_a, revision_b) 
 
422
        BzrError.__init__(self, msg)
 
423
 
 
424
 
 
425
 
 
426
class NotAncestor(BzrError):
 
427
    def __init__(self, rev_id, not_ancestor_id):
 
428
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
 
429
                                                        rev_id)
 
430
        BzrError.__init__(self, msg)
 
431
        self.rev_id = rev_id
 
432
        self.not_ancestor_id = not_ancestor_id
 
433
 
 
434
 
 
435
class InstallFailed(BzrError):
 
436
    def __init__(self, revisions):
 
437
        msg = "Could not install revisions:\n%s" % " ,".join(revisions)
 
438
        BzrError.__init__(self, msg)
 
439
        self.revisions = revisions
 
440
 
 
441
 
 
442
class AmbiguousBase(BzrError):
 
443
    def __init__(self, bases):
 
444
        msg = "The correct base is unclear, becase %s are all equally close" %\
 
445
            ", ".join(bases)
 
446
        BzrError.__init__(self, msg)
 
447
        self.bases = bases
 
448
 
 
449
 
 
450
class NoCommits(BzrError):
 
451
    def __init__(self, branch):
 
452
        msg = "Branch %s has no commits." % branch
 
453
        BzrError.__init__(self, msg)
 
454
 
 
455
 
 
456
class UnlistableStore(BzrError):
 
457
    def __init__(self, store):
 
458
        BzrError.__init__(self, "Store %s is not listable" % store)
 
459
 
 
460
 
 
461
 
 
462
class UnlistableBranch(BzrError):
 
463
    def __init__(self, br):
 
464
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
465
 
 
466
 
 
467
class BoundBranchOutOfDate(BzrNewError):
 
468
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
 
469
    def __init__(self, branch, master):
 
470
        BzrNewError.__init__(self)
 
471
        self.branch = branch
 
472
        self.master = master
 
473
 
 
474
        
 
475
class CommitToDoubleBoundBranch(BzrNewError):
 
476
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
 
477
    def __init__(self, branch, master, remote):
 
478
        BzrNewError.__init__(self)
 
479
        self.branch = branch
 
480
        self.master = master
 
481
        self.remote = remote
 
482
 
 
483
 
 
484
class OverwriteBoundBranch(BzrNewError):
 
485
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
 
486
    def __init__(self, branch):
 
487
        BzrNewError.__init__(self)
 
488
        self.branch = branch
 
489
 
 
490
 
 
491
class BoundBranchConnectionFailure(BzrNewError):
 
492
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
 
493
    def __init__(self, branch, target, error):
 
494
        BzrNewError.__init__(self)
 
495
        self.branch = branch
 
496
        self.target = target
 
497
        self.error = error
 
498
 
 
499
 
 
500
class WeaveError(BzrNewError):
 
501
    """Error in processing weave: %(message)s"""
 
502
 
 
503
    def __init__(self, message=None):
 
504
        BzrNewError.__init__(self)
 
505
        self.message = message
 
506
 
 
507
 
 
508
class WeaveRevisionAlreadyPresent(WeaveError):
 
509
    """Revision {%(revision_id)s} already present in %(weave)s"""
 
510
    def __init__(self, revision_id, weave):
 
511
 
 
512
        WeaveError.__init__(self)
 
513
        self.revision_id = revision_id
 
514
        self.weave = weave
 
515
 
 
516
 
 
517
class WeaveRevisionNotPresent(WeaveError):
 
518
    """Revision {%(revision_id)s} not present in %(weave)s"""
 
519
 
 
520
    def __init__(self, revision_id, weave):
 
521
        WeaveError.__init__(self)
 
522
        self.revision_id = revision_id
 
523
        self.weave = weave
 
524
 
 
525
 
 
526
class WeaveFormatError(WeaveError):
 
527
    """Weave invariant violated: %(what)s"""
 
528
 
 
529
    def __init__(self, what):
 
530
        WeaveError.__init__(self)
 
531
        self.what = what
 
532
 
 
533
 
 
534
class WeaveParentMismatch(WeaveError):
 
535
    """Parents are mismatched between two revisions."""
 
536
    
 
537
 
 
538
class WeaveInvalidChecksum(WeaveError):
 
539
    """Text did not match it's checksum: %(message)s"""
 
540
 
 
541
 
 
542
class WeaveTextDiffers(WeaveError):
 
543
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
544
 
 
545
    def __init__(self, revision_id, weave_a, weave_b):
 
546
        WeaveError.__init__(self)
 
547
        self.revision_id = revision_id
 
548
        self.weave_a = weave_a
 
549
        self.weave_b = weave_b
 
550
 
 
551
 
 
552
class WeaveTextDiffers(WeaveError):
 
553
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
554
 
 
555
    def __init__(self, revision_id, weave_a, weave_b):
 
556
        WeaveError.__init__(self)
 
557
        self.revision_id = revision_id
 
558
        self.weave_a = weave_a
 
559
        self.weave_b = weave_b
 
560
 
 
561
 
 
562
class VersionedFileError(BzrNewError):
 
563
    """Versioned file error."""
 
564
 
 
565
 
 
566
class RevisionNotPresent(VersionedFileError):
 
567
    """Revision {%(revision_id)s} not present in %(file_id)s."""
 
568
 
 
569
    def __init__(self, revision_id, file_id):
 
570
        VersionedFileError.__init__(self)
 
571
        self.revision_id = revision_id
 
572
        self.file_id = file_id
 
573
 
 
574
 
 
575
class RevisionAlreadyPresent(VersionedFileError):
 
576
    """Revision {%(revision_id)s} already present in %(file_id)s."""
 
577
 
 
578
    def __init__(self, revision_id, file_id):
 
579
        VersionedFileError.__init__(self)
 
580
        self.revision_id = revision_id
 
581
        self.file_id = file_id
 
582
 
 
583
 
 
584
class KnitError(BzrNewError):
 
585
    """Knit error"""
 
586
 
 
587
 
 
588
class KnitHeaderError(KnitError):
 
589
    """Knit header error: %(badline)r unexpected"""
 
590
 
 
591
    def __init__(self, badline):
 
592
        KnitError.__init__(self)
 
593
        self.badline = badline
 
594
 
 
595
 
 
596
class KnitCorrupt(KnitError):
 
597
    """Knit %(filename)s corrupt: %(how)s"""
 
598
 
 
599
    def __init__(self, filename, how):
 
600
        KnitError.__init__(self)
 
601
        self.filename = filename
 
602
        self.how = how
 
603
 
 
604
 
 
605
class NoSuchExportFormat(BzrNewError):
 
606
    """Export format %(format)r not supported"""
 
607
    def __init__(self, format):
 
608
        BzrNewError.__init__(self)
 
609
        self.format = format
 
610
 
 
611
 
 
612
class TransportError(BzrError):
 
613
    """All errors thrown by Transport implementations should derive
 
614
    from this class.
 
615
    """
 
616
    def __init__(self, msg=None, orig_error=None):
 
617
        if msg is None and orig_error is not None:
 
618
            msg = str(orig_error)
 
619
        BzrError.__init__(self, msg)
 
620
        self.msg = msg
 
621
        self.orig_error = orig_error
 
622
 
 
623
 
 
624
# A set of semi-meaningful errors which can be thrown
 
625
class TransportNotPossible(TransportError):
 
626
    """This is for transports where a specific function is explicitly not
 
627
    possible. Such as pushing files to an HTTP server.
 
628
    """
 
629
    pass
 
630
 
 
631
 
 
632
class ConnectionError(TransportError):
 
633
    """A connection problem prevents file retrieval.
 
634
    This does not indicate whether the file exists or not; it indicates that a
 
635
    precondition for requesting the file was not met.
 
636
    """
 
637
    def __init__(self, msg=None, orig_error=None):
 
638
        TransportError.__init__(self, msg=msg, orig_error=orig_error)
 
639
 
 
640
 
 
641
class ConnectionReset(TransportError):
 
642
    """The connection has been closed."""
 
643
    pass
 
644
 
 
645
 
 
646
class ConflictsInTree(BzrError):
 
647
    def __init__(self):
 
648
        BzrError.__init__(self, "Working tree has conflicts.")
 
649
 
 
650
 
 
651
class ParseConfigError(BzrError):
 
652
    def __init__(self, errors, filename):
 
653
        if filename is None:
 
654
            filename = ""
 
655
        message = "Error(s) parsing config file %s:\n%s" % \
 
656
            (filename, ('\n'.join(e.message for e in errors)))
 
657
        BzrError.__init__(self, message)
 
658
 
 
659
 
 
660
class SigningFailed(BzrError):
 
661
    def __init__(self, command_line):
 
662
        BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
 
663
                               % command_line)
 
664
 
 
665
 
 
666
class WorkingTreeNotRevision(BzrError):
 
667
    def __init__(self, tree):
 
668
        BzrError.__init__(self, "The working tree for %s has changed since"
 
669
                          " last commit, but weave merge requires that it be"
 
670
                          " unchanged." % tree.basedir)
 
671
 
 
672
 
 
673
class CantReprocessAndShowBase(BzrNewError):
 
674
    """Can't reprocess and show base.
 
675
Reprocessing obscures relationship of conflicting lines to base."""
 
676
 
 
677
 
 
678
class GraphCycleError(BzrNewError):
 
679
    """Cycle in graph %(graph)r"""
 
680
    def __init__(self, graph):
 
681
        BzrNewError.__init__(self)
 
682
        self.graph = graph
 
683
 
 
684
 
 
685
class NotConflicted(BzrNewError):
 
686
    """File %(filename)s is not conflicted."""
 
687
 
 
688
    def __init__(self, filename):
 
689
        BzrNewError.__init__(self)
 
690
        self.filename = filename
 
691
 
 
692
 
 
693
class MustUseDecorated(Exception):
 
694
    """A decorating function has requested its original command be used.
 
695
    
 
696
    This should never escape bzr, so does not need to be printable.
 
697
    """
 
698
 
 
699
 
 
700
class MissingText(BzrNewError):
 
701
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
 
702
 
 
703
    def __init__(self, branch, text_revision, file_id):
 
704
        BzrNewError.__init__(self)
 
705
        self.branch = branch
 
706
        self.base = branch.base
 
707
        self.text_revision = text_revision
 
708
        self.file_id = file_id
 
709
 
 
710
 
 
711
class DuplicateKey(BzrNewError):
 
712
    """Key %(key)s is already present in map"""
 
713
 
 
714
 
 
715
class MalformedTransform(BzrNewError):
 
716
    """Tree transform is malformed %(conflicts)r"""
 
717
 
 
718
 
 
719
class BzrBadParameter(BzrNewError):
 
720
    """A bad parameter : %(param)s is not usable.
 
721
    
 
722
    This exception should never be thrown, but it is a base class for all
 
723
    parameter-to-function errors.
 
724
    """
 
725
    def __init__(self, param):
 
726
        BzrNewError.__init__(self)
 
727
        self.param = param
 
728
 
 
729
 
 
730
class BzrBadParameterNotUnicode(BzrBadParameter):
 
731
    """Parameter %(param)s is neither unicode nor utf8."""
 
732
 
 
733
 
 
734
class ReusingTransform(BzrNewError):
 
735
    """Attempt to reuse a transform that has already been applied."""
 
736
 
 
737
 
 
738
class CantMoveRoot(BzrNewError):
 
739
    """Moving the root directory is not supported at this time"""
 
740
 
 
741
 
 
742
class BzrBadParameterNotString(BzrBadParameter):
 
743
    """Parameter %(param)s is not a string or unicode string."""
 
744
 
 
745
 
 
746
class BzrBadParameterMissing(BzrBadParameter):
 
747
    """Parameter $(param)s is required but not present."""
 
748
 
 
749
 
 
750
class DependencyNotPresent(BzrNewError):
 
751
    """Unable to import library "%(library)s": %(error)s"""
 
752
 
 
753
    def __init__(self, library, error):
 
754
        BzrNewError.__init__(self, library=library, error=error)
 
755
 
 
756
 
 
757
class ParamikoNotPresent(DependencyNotPresent):
 
758
    """Unable to import paramiko (required for sftp support): %(error)s"""
 
759
 
 
760
    def __init__(self, error):
 
761
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
762
 
 
763
 
 
764
class UninitializableFormat(BzrNewError):
 
765
    """Format %(format)s cannot be initialised by this version of bzr."""
 
766
 
 
767
    def __init__(self, format):
 
768
        BzrNewError.__init__(self)
 
769
        self.format = format
 
770
 
 
771
 
 
772
class NoDiff3(BzrNewError):
 
773
    """Diff3 is not installed on this machine."""
 
774
 
 
775
 
 
776
class ExistingLimbo(BzrNewError):
 
777
    """This tree contains left-over files from a failed operation.
 
778
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
779
    keep, and delete it when you are done.
 
780
    """
 
781
    def __init__(self, limbo_dir):
 
782
       BzrNewError.__init__(self)
 
783
       self.limbo_dir = limbo_dir
 
784
 
 
785
 
 
786
class ImmortalLimbo(BzrNewError):
 
787
    """Unable to delete transform temporary directory $(limbo_dir)s.
 
788
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
789
    keep, and delete it when you are done.
 
790
    """
 
791
    def __init__(self, limbo_dir):
 
792
       BzrNewError.__init__(self)
 
793
       self.limbo_dir = limbo_dir
 
794
 
 
795
 
 
796
class OutOfDateTree(BzrNewError):
 
797
    """Working tree is out of date, please run 'bzr update'."""
 
798
 
 
799
    def __init__(self, tree):
 
800
        BzrNewError.__init__(self)
 
801
        self.tree = tree
 
802
 
 
803
 
 
804
class MergeModifiedFormatError(BzrNewError):
 
805
    """Error in merge modified format"""
 
806
 
 
807
 
 
808
class ConflictFormatError(BzrNewError):
 
809
    """Format error in conflict listings"""
 
810
 
 
811
 
 
812
class CorruptRepository(BzrNewError):
 
813
    """An error has been detected in the repository %(repo_path)s.
 
814
Please run bzr reconcile on this repository."""
 
815
 
 
816
    def __init__(self, repo):
 
817
        BzrNewError.__init__(self)
 
818
        self.repo_path = repo.bzrdir.root_transport.base
 
819
 
 
820
 
 
821
class UpgradeRequired(BzrNewError):
 
822
    """To use this feature you must upgrade your branch at %(path)s."""
 
823
 
 
824
    def __init__(self, path):
 
825
        BzrNewError.__init__(self)
 
826
        self.path = path
 
827
 
 
828
 
 
829
class LocalRequiresBoundBranch(BzrNewError):
 
830
    """Cannot perform local-only commits on unbound branches."""
 
831
 
 
832
 
 
833
class MissingProgressBarFinish(BzrNewError):
 
834
    """A nested progress bar was not 'finished' correctly."""
 
835
 
 
836
 
 
837
class UnsupportedOperation(BzrNewError):
 
838
    """The method %(mname)s is not supported on objects of type %(tname)s."""
 
839
    def __init__(self, method, method_self):
 
840
        self.method = method
 
841
        self.mname = method.__name__
 
842
        self.tname = type(method_self).__name__