~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Olaf Conradi
  • Date: 2006-03-28 23:30:02 UTC
  • mto: (1661.1.1 bzr.mbp.remember)
  • mto: This revision was merged to the branch mainline in revision 1663.
  • Revision ID: olaf@conradi.org-20060328233002-f6262df0e19c1963
Added testcases for using pull with --remember. Moved remember code to
beginning of cmd_pull. This remembers the location in case of a failure
during pull.

Show diffs side-by-side

added added

removed removed

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