/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Robert Collins
  • Date: 2006-04-20 01:27:45 UTC
  • mto: (1711.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1674.
  • Revision ID: robertc@robertcollins.net-20060420012745-5c1d423d144b7d08
Remove unneeded optimisation in fetch_texts - the interversioned file optimisers now do this.

Show diffs side-by-side

added added

removed removed

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