/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: Martin Pool
  • Date: 2006-04-19 07:16:05 UTC
  • mto: This revision was merged to the branch mainline in revision 1675.
  • Revision ID: mbp@sourcefrog.net-20060419071605-51207e739c997442
Give a clear error for bzr status of an unversioned, nonexistent file. (Malone #3619)

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 %(base)s."""
 
140
    
 
141
    def __init__(self, base):
 
142
        BzrNewError.__init__(self)
 
143
        self.base = base
 
144
 
 
145
 
 
146
class NotLocalUrl(BzrNewError):
 
147
    """%(url)s 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 PathsDoNotExist(BzrNewError):
 
284
    # used when reporting that paths are neither versioned nor in the working
 
285
    # tree
 
286
    """Path(s) do not exist: %(paths_as_string)s"""
 
287
 
 
288
    def __init__(self, paths):
 
289
        from bzrlib.osutils import quotefn
 
290
        BzrNewError.__init__(self)
 
291
        self.paths = paths
 
292
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
293
 
 
294
 
 
295
 
 
296
class BadFileKindError(BzrError):
 
297
    """Specified file is of a kind that cannot be added.
 
298
 
 
299
    (For example a symlink or device file.)"""
 
300
 
 
301
 
 
302
class ForbiddenFileError(BzrError):
 
303
    """Cannot operate on a file because it is a control file."""
 
304
 
 
305
 
 
306
class LockError(BzrNewError):
 
307
    """Lock error: %(message)s"""
 
308
    # All exceptions from the lock/unlock functions should be from
 
309
    # this exception class.  They will be translated as necessary. The
 
310
    # original exception is available as e.original_error
 
311
    #
 
312
    # New code should prefer to raise specific subclasses
 
313
    def __init__(self, message):
 
314
        self.message = message
 
315
 
 
316
 
 
317
class CommitNotPossible(LockError):
 
318
    """A commit was attempted but we do not have a write lock open."""
 
319
    def __init__(self):
 
320
        pass
 
321
 
 
322
 
 
323
class AlreadyCommitted(LockError):
 
324
    """A rollback was requested, but is not able to be accomplished."""
 
325
    def __init__(self):
 
326
        pass
 
327
 
 
328
 
 
329
class ReadOnlyError(LockError):
 
330
    """A write attempt was made in a read only transaction on %(obj)s"""
 
331
    def __init__(self, obj):
 
332
        self.obj = obj
 
333
 
 
334
 
 
335
class OutSideTransaction(BzrNewError):
 
336
    """A transaction related operation was attempted after the transaction finished."""
 
337
 
 
338
 
 
339
class ObjectNotLocked(LockError):
 
340
    """%(obj)r is not locked"""
 
341
    # this can indicate that any particular object is not locked; see also
 
342
    # LockNotHeld which means that a particular *lock* object is not held by
 
343
    # the caller -- perhaps they should be unified.
 
344
    def __init__(self, obj):
 
345
        self.obj = obj
 
346
 
 
347
 
 
348
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
349
    """Cannot change object %(obj)r in read only transaction"""
 
350
    def __init__(self, obj):
 
351
        self.obj = obj
 
352
 
 
353
 
 
354
class UnlockableTransport(LockError):
 
355
    """Cannot lock: transport is read only: %(transport)s"""
 
356
    def __init__(self, transport):
 
357
        self.transport = transport
 
358
 
 
359
 
 
360
class LockContention(LockError):
 
361
    """Could not acquire lock %(lock)s"""
 
362
    # TODO: show full url for lock, combining the transport and relative bits?
 
363
    def __init__(self, lock):
 
364
        self.lock = lock
 
365
 
 
366
 
 
367
class LockBroken(LockError):
 
368
    """Lock was broken while still open: %(lock)s - check storage consistency!"""
 
369
    def __init__(self, lock):
 
370
        self.lock = lock
 
371
 
 
372
 
 
373
class LockBreakMismatch(LockError):
 
374
    """Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
 
375
    def __init__(self, lock, holder, target):
 
376
        self.lock = lock
 
377
        self.holder = holder
 
378
        self.target = target
 
379
 
 
380
 
 
381
class LockNotHeld(LockError):
 
382
    """Lock not held: %(lock)s"""
 
383
    def __init__(self, lock):
 
384
        self.lock = lock
 
385
 
 
386
 
 
387
class PointlessCommit(BzrNewError):
 
388
    """No changes to commit"""
 
389
 
 
390
 
 
391
class UpgradeReadonly(BzrNewError):
 
392
    """Upgrade URL cannot work with readonly URL's."""
 
393
 
 
394
 
 
395
class UpToDateFormat(BzrNewError):
 
396
    """The branch format %(format)s is already at the most recent format."""
 
397
 
 
398
    def __init__(self, format):
 
399
        BzrNewError.__init__(self)
 
400
        self.format = format
 
401
 
 
402
 
 
403
 
 
404
class StrictCommitFailed(Exception):
 
405
    """Commit refused because there are unknowns in the tree."""
 
406
 
 
407
 
 
408
class NoSuchRevision(BzrError):
 
409
    def __init__(self, branch, revision):
 
410
        self.branch = branch
 
411
        self.revision = revision
 
412
        msg = "Branch %s has no revision %s" % (branch, revision)
 
413
        BzrError.__init__(self, msg)
 
414
 
 
415
 
 
416
class HistoryMissing(BzrError):
 
417
    def __init__(self, branch, object_type, object_id):
 
418
        self.branch = branch
 
419
        BzrError.__init__(self,
 
420
                          '%s is missing %s {%s}'
 
421
                          % (branch, object_type, object_id))
 
422
 
 
423
 
 
424
class DivergedBranches(BzrError):
 
425
 
 
426
    def __init__(self, branch1, branch2):
 
427
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
 
428
        self.branch1 = branch1
 
429
        self.branch2 = branch2
 
430
 
 
431
 
 
432
class UnrelatedBranches(BzrCommandError):
 
433
    def __init__(self):
 
434
        msg = "Branches have no common ancestor, and no base revision"\
 
435
            " specified."
 
436
        BzrCommandError.__init__(self, msg)
 
437
 
 
438
 
 
439
class NoCommonAncestor(BzrError):
 
440
    def __init__(self, revision_a, revision_b):
 
441
        msg = "Revisions have no common ancestor: %s %s." \
 
442
            % (revision_a, revision_b) 
 
443
        BzrError.__init__(self, msg)
 
444
 
 
445
 
 
446
class NoCommonRoot(BzrError):
 
447
    def __init__(self, revision_a, revision_b):
 
448
        msg = "Revisions are not derived from the same root: %s %s." \
 
449
            % (revision_a, revision_b) 
 
450
        BzrError.__init__(self, msg)
 
451
 
 
452
 
 
453
 
 
454
class NotAncestor(BzrError):
 
455
    def __init__(self, rev_id, not_ancestor_id):
 
456
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
 
457
                                                        rev_id)
 
458
        BzrError.__init__(self, msg)
 
459
        self.rev_id = rev_id
 
460
        self.not_ancestor_id = not_ancestor_id
 
461
 
 
462
 
 
463
class InstallFailed(BzrError):
 
464
    def __init__(self, revisions):
 
465
        msg = "Could not install revisions:\n%s" % " ,".join(revisions)
 
466
        BzrError.__init__(self, msg)
 
467
        self.revisions = revisions
 
468
 
 
469
 
 
470
class AmbiguousBase(BzrError):
 
471
    def __init__(self, bases):
 
472
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
473
                DeprecationWarning)
 
474
        msg = "The correct base is unclear, becase %s are all equally close" %\
 
475
            ", ".join(bases)
 
476
        BzrError.__init__(self, msg)
 
477
        self.bases = bases
 
478
 
 
479
 
 
480
class NoCommits(BzrError):
 
481
    def __init__(self, branch):
 
482
        msg = "Branch %s has no commits." % branch
 
483
        BzrError.__init__(self, msg)
 
484
 
 
485
 
 
486
class UnlistableStore(BzrError):
 
487
    def __init__(self, store):
 
488
        BzrError.__init__(self, "Store %s is not listable" % store)
 
489
 
 
490
 
 
491
 
 
492
class UnlistableBranch(BzrError):
 
493
    def __init__(self, br):
 
494
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
495
 
 
496
 
 
497
class BoundBranchOutOfDate(BzrNewError):
 
498
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
 
499
    def __init__(self, branch, master):
 
500
        BzrNewError.__init__(self)
 
501
        self.branch = branch
 
502
        self.master = master
 
503
 
 
504
        
 
505
class CommitToDoubleBoundBranch(BzrNewError):
 
506
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
 
507
    def __init__(self, branch, master, remote):
 
508
        BzrNewError.__init__(self)
 
509
        self.branch = branch
 
510
        self.master = master
 
511
        self.remote = remote
 
512
 
 
513
 
 
514
class OverwriteBoundBranch(BzrNewError):
 
515
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
 
516
    def __init__(self, branch):
 
517
        BzrNewError.__init__(self)
 
518
        self.branch = branch
 
519
 
 
520
 
 
521
class BoundBranchConnectionFailure(BzrNewError):
 
522
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
 
523
    def __init__(self, branch, target, error):
 
524
        BzrNewError.__init__(self)
 
525
        self.branch = branch
 
526
        self.target = target
 
527
        self.error = error
 
528
 
 
529
 
 
530
class WeaveError(BzrNewError):
 
531
    """Error in processing weave: %(message)s"""
 
532
 
 
533
    def __init__(self, message=None):
 
534
        BzrNewError.__init__(self)
 
535
        self.message = message
 
536
 
 
537
 
 
538
class WeaveRevisionAlreadyPresent(WeaveError):
 
539
    """Revision {%(revision_id)s} already present in %(weave)s"""
 
540
    def __init__(self, revision_id, weave):
 
541
 
 
542
        WeaveError.__init__(self)
 
543
        self.revision_id = revision_id
 
544
        self.weave = weave
 
545
 
 
546
 
 
547
class WeaveRevisionNotPresent(WeaveError):
 
548
    """Revision {%(revision_id)s} not present in %(weave)s"""
 
549
 
 
550
    def __init__(self, revision_id, weave):
 
551
        WeaveError.__init__(self)
 
552
        self.revision_id = revision_id
 
553
        self.weave = weave
 
554
 
 
555
 
 
556
class WeaveFormatError(WeaveError):
 
557
    """Weave invariant violated: %(what)s"""
 
558
 
 
559
    def __init__(self, what):
 
560
        WeaveError.__init__(self)
 
561
        self.what = what
 
562
 
 
563
 
 
564
class WeaveParentMismatch(WeaveError):
 
565
    """Parents are mismatched between two revisions."""
 
566
    
 
567
 
 
568
class WeaveInvalidChecksum(WeaveError):
 
569
    """Text did not match it's checksum: %(message)s"""
 
570
 
 
571
 
 
572
class WeaveTextDiffers(WeaveError):
 
573
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
574
 
 
575
    def __init__(self, revision_id, weave_a, weave_b):
 
576
        WeaveError.__init__(self)
 
577
        self.revision_id = revision_id
 
578
        self.weave_a = weave_a
 
579
        self.weave_b = weave_b
 
580
 
 
581
 
 
582
class WeaveTextDiffers(WeaveError):
 
583
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
584
 
 
585
    def __init__(self, revision_id, weave_a, weave_b):
 
586
        WeaveError.__init__(self)
 
587
        self.revision_id = revision_id
 
588
        self.weave_a = weave_a
 
589
        self.weave_b = weave_b
 
590
 
 
591
 
 
592
class VersionedFileError(BzrNewError):
 
593
    """Versioned file error."""
 
594
 
 
595
 
 
596
class RevisionNotPresent(VersionedFileError):
 
597
    """Revision {%(revision_id)s} not present in %(file_id)s."""
 
598
 
 
599
    def __init__(self, revision_id, file_id):
 
600
        VersionedFileError.__init__(self)
 
601
        self.revision_id = revision_id
 
602
        self.file_id = file_id
 
603
 
 
604
 
 
605
class RevisionAlreadyPresent(VersionedFileError):
 
606
    """Revision {%(revision_id)s} already present in %(file_id)s."""
 
607
 
 
608
    def __init__(self, revision_id, file_id):
 
609
        VersionedFileError.__init__(self)
 
610
        self.revision_id = revision_id
 
611
        self.file_id = file_id
 
612
 
 
613
 
 
614
class KnitError(BzrNewError):
 
615
    """Knit error"""
 
616
 
 
617
 
 
618
class KnitHeaderError(KnitError):
 
619
    """Knit header error: %(badline)r unexpected"""
 
620
 
 
621
    def __init__(self, badline):
 
622
        KnitError.__init__(self)
 
623
        self.badline = badline
 
624
 
 
625
 
 
626
class KnitCorrupt(KnitError):
 
627
    """Knit %(filename)s corrupt: %(how)s"""
 
628
 
 
629
    def __init__(self, filename, how):
 
630
        KnitError.__init__(self)
 
631
        self.filename = filename
 
632
        self.how = how
 
633
 
 
634
 
 
635
class NoSuchExportFormat(BzrNewError):
 
636
    """Export format %(format)r not supported"""
 
637
    def __init__(self, format):
 
638
        BzrNewError.__init__(self)
 
639
        self.format = format
 
640
 
 
641
 
 
642
class TransportError(BzrError):
 
643
    """All errors thrown by Transport implementations should derive
 
644
    from this class.
 
645
    """
 
646
    def __init__(self, msg=None, orig_error=None):
 
647
        if msg is None and orig_error is not None:
 
648
            msg = str(orig_error)
 
649
        BzrError.__init__(self, msg)
 
650
        self.msg = msg
 
651
        self.orig_error = orig_error
 
652
 
 
653
 
 
654
# A set of semi-meaningful errors which can be thrown
 
655
class TransportNotPossible(TransportError):
 
656
    """This is for transports where a specific function is explicitly not
 
657
    possible. Such as pushing files to an HTTP server.
 
658
    """
 
659
    pass
 
660
 
 
661
 
 
662
class ConnectionError(TransportError):
 
663
    """A connection problem prevents file retrieval.
 
664
    This does not indicate whether the file exists or not; it indicates that a
 
665
    precondition for requesting the file was not met.
 
666
    """
 
667
    def __init__(self, msg=None, orig_error=None):
 
668
        TransportError.__init__(self, msg=msg, orig_error=orig_error)
 
669
 
 
670
 
 
671
class ConnectionReset(TransportError):
 
672
    """The connection has been closed."""
 
673
    pass
 
674
 
 
675
 
 
676
class ConflictsInTree(BzrError):
 
677
    def __init__(self):
 
678
        BzrError.__init__(self, "Working tree has conflicts.")
 
679
 
 
680
 
 
681
class ParseConfigError(BzrError):
 
682
    def __init__(self, errors, filename):
 
683
        if filename is None:
 
684
            filename = ""
 
685
        message = "Error(s) parsing config file %s:\n%s" % \
 
686
            (filename, ('\n'.join(e.message for e in errors)))
 
687
        BzrError.__init__(self, message)
 
688
 
 
689
 
 
690
class SigningFailed(BzrError):
 
691
    def __init__(self, command_line):
 
692
        BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
 
693
                               % command_line)
 
694
 
 
695
 
 
696
class WorkingTreeNotRevision(BzrError):
 
697
    def __init__(self, tree):
 
698
        BzrError.__init__(self, "The working tree for %s has changed since"
 
699
                          " last commit, but weave merge requires that it be"
 
700
                          " unchanged." % tree.basedir)
 
701
 
 
702
 
 
703
class CantReprocessAndShowBase(BzrNewError):
 
704
    """Can't reprocess and show base.
 
705
Reprocessing obscures relationship of conflicting lines to base."""
 
706
 
 
707
 
 
708
class GraphCycleError(BzrNewError):
 
709
    """Cycle in graph %(graph)r"""
 
710
    def __init__(self, graph):
 
711
        BzrNewError.__init__(self)
 
712
        self.graph = graph
 
713
 
 
714
 
 
715
class NotConflicted(BzrNewError):
 
716
    """File %(filename)s is not conflicted."""
 
717
 
 
718
    def __init__(self, filename):
 
719
        BzrNewError.__init__(self)
 
720
        self.filename = filename
 
721
 
 
722
 
 
723
class MustUseDecorated(Exception):
 
724
    """A decorating function has requested its original command be used.
 
725
    
 
726
    This should never escape bzr, so does not need to be printable.
 
727
    """
 
728
 
 
729
 
 
730
class MissingText(BzrNewError):
 
731
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
 
732
 
 
733
    def __init__(self, branch, text_revision, file_id):
 
734
        BzrNewError.__init__(self)
 
735
        self.branch = branch
 
736
        self.base = branch.base
 
737
        self.text_revision = text_revision
 
738
        self.file_id = file_id
 
739
 
 
740
 
 
741
class DuplicateKey(BzrNewError):
 
742
    """Key %(key)s is already present in map"""
 
743
 
 
744
 
 
745
class MalformedTransform(BzrNewError):
 
746
    """Tree transform is malformed %(conflicts)r"""
 
747
 
 
748
 
 
749
class BzrBadParameter(BzrNewError):
 
750
    """A bad parameter : %(param)s is not usable.
 
751
    
 
752
    This exception should never be thrown, but it is a base class for all
 
753
    parameter-to-function errors.
 
754
    """
 
755
    def __init__(self, param):
 
756
        BzrNewError.__init__(self)
 
757
        self.param = param
 
758
 
 
759
 
 
760
class BzrBadParameterNotUnicode(BzrBadParameter):
 
761
    """Parameter %(param)s is neither unicode nor utf8."""
 
762
 
 
763
 
 
764
class ReusingTransform(BzrNewError):
 
765
    """Attempt to reuse a transform that has already been applied."""
 
766
 
 
767
 
 
768
class CantMoveRoot(BzrNewError):
 
769
    """Moving the root directory is not supported at this time"""
 
770
 
 
771
 
 
772
class BzrBadParameterNotString(BzrBadParameter):
 
773
    """Parameter %(param)s is not a string or unicode string."""
 
774
 
 
775
 
 
776
class BzrBadParameterMissing(BzrBadParameter):
 
777
    """Parameter $(param)s is required but not present."""
 
778
 
 
779
 
 
780
class DependencyNotPresent(BzrNewError):
 
781
    """Unable to import library "%(library)s": %(error)s"""
 
782
 
 
783
    def __init__(self, library, error):
 
784
        BzrNewError.__init__(self, library=library, error=error)
 
785
 
 
786
 
 
787
class ParamikoNotPresent(DependencyNotPresent):
 
788
    """Unable to import paramiko (required for sftp support): %(error)s"""
 
789
 
 
790
    def __init__(self, error):
 
791
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
792
 
 
793
 
 
794
class UninitializableFormat(BzrNewError):
 
795
    """Format %(format)s cannot be initialised by this version of bzr."""
 
796
 
 
797
    def __init__(self, format):
 
798
        BzrNewError.__init__(self)
 
799
        self.format = format
 
800
 
 
801
 
 
802
class NoDiff3(BzrNewError):
 
803
    """Diff3 is not installed on this machine."""
 
804
 
 
805
 
 
806
class ExistingLimbo(BzrNewError):
 
807
    """This tree contains left-over files from a failed operation.
 
808
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
809
    keep, and delete it when you are done.
 
810
    """
 
811
    def __init__(self, limbo_dir):
 
812
       BzrNewError.__init__(self)
 
813
       self.limbo_dir = limbo_dir
 
814
 
 
815
 
 
816
class ImmortalLimbo(BzrNewError):
 
817
    """Unable to delete transform temporary directory $(limbo_dir)s.
 
818
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
819
    keep, and delete it when you are done.
 
820
    """
 
821
    def __init__(self, limbo_dir):
 
822
       BzrNewError.__init__(self)
 
823
       self.limbo_dir = limbo_dir
 
824
 
 
825
 
 
826
class OutOfDateTree(BzrNewError):
 
827
    """Working tree is out of date, please run 'bzr update'."""
 
828
 
 
829
    def __init__(self, tree):
 
830
        BzrNewError.__init__(self)
 
831
        self.tree = tree
 
832
 
 
833
 
 
834
class MergeModifiedFormatError(BzrNewError):
 
835
    """Error in merge modified format"""
 
836
 
 
837
 
 
838
class ConflictFormatError(BzrNewError):
 
839
    """Format error in conflict listings"""
 
840
 
 
841
 
 
842
class CorruptRepository(BzrNewError):
 
843
    """An error has been detected in the repository %(repo_path)s.
 
844
Please run bzr reconcile on this repository."""
 
845
 
 
846
    def __init__(self, repo):
 
847
        BzrNewError.__init__(self)
 
848
        self.repo_path = repo.bzrdir.root_transport.base
 
849
 
 
850
 
 
851
class UpgradeRequired(BzrNewError):
 
852
    """To use this feature you must upgrade your branch at %(path)s."""
 
853
 
 
854
    def __init__(self, path):
 
855
        BzrNewError.__init__(self)
 
856
        self.path = path
 
857
 
 
858
 
 
859
class LocalRequiresBoundBranch(BzrNewError):
 
860
    """Cannot perform local-only commits on unbound branches."""
 
861
 
 
862
 
 
863
class MissingProgressBarFinish(BzrNewError):
 
864
    """A nested progress bar was not 'finished' correctly."""
 
865
 
 
866
 
 
867
class UnsupportedOperation(BzrNewError):
 
868
    """The method %(mname)s is not supported on objects of type %(tname)s."""
 
869
    def __init__(self, method, method_self):
 
870
        self.method = method
 
871
        self.mname = method.__name__
 
872
        self.tname = type(method_self).__name__