~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Michael Ellerman
  • Date: 2006-02-28 14:45:51 UTC
  • mto: (1558.1.18 Aaron's integration)
  • mto: This revision was merged to the branch mainline in revision 1586.
  • Revision ID: michael@ellerman.id.au-20060228144551-3d9941ecde4a0b0a
Update contrib/pwk for -p1 diffs from bzr

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
#
 
7
 
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
#
 
12
 
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Exceptions for bzr, and reporting of them.
18
18
 
19
 
There are 3 different classes of error:
20
 
 
21
 
 * KeyboardInterrupt, and OSError with EPIPE - the program terminates 
22
 
   with an appropriate short message
23
 
 
24
 
 * User errors, indicating a problem caused by the user such as a bad URL.
25
 
   These are printed in a short form.
26
 
 
27
 
 * Internal unexpected errors, including most Python builtin errors
28
 
   and some raised from inside bzr.  These are printed with a full 
29
 
   traceback and an invitation to report the bug.
30
 
 
31
19
Exceptions are caught at a high level to report errors to the user, and
32
20
might also be caught inside the program.  Therefore it needs to be
33
21
possible to convert them to a meaningful string, and also for them to be
46
34
... except:
47
35
...   print sys.exc_type
48
36
...   print sys.exc_value
49
 
...   path = getattr(sys.exc_value, 'path', None)
 
37
...   path = getattr(sys.exc_value, 'path')
50
38
...   if path is not None:
51
39
...     print path
52
40
bzrlib.errors.NotBranchError
56
44
Therefore:
57
45
 
58
46
 * create a new exception class for any class of error that can be
59
 
   usefully distinguished.  If no callers are likely to want to catch
60
 
   one but not another, don't worry about them.
61
 
 
62
 
 * the __str__ method should generate something useful; BzrError provides
63
 
   a good default implementation
64
 
 
65
 
Exception strings should start with a capital letter and should not have a
66
 
final fullstop.
 
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.
67
54
"""
68
55
 
69
 
from warnings import warn
70
 
 
71
 
from bzrlib.patches import (PatchSyntax, 
72
 
                            PatchConflict, 
73
 
                            MalformedPatchHeader,
74
 
                            MalformedHunkHeader,
75
 
                            MalformedLine,)
76
 
 
77
 
 
78
56
# based on Scott James Remnant's hct error classes
79
57
 
80
58
# TODO: is there any value in providing the .args field used by standard
88
66
# TODO: Convert all the other error classes here to BzrNewError, and eliminate
89
67
# the old one.
90
68
 
91
 
# TODO: The pattern (from hct) of using classes docstrings as message
92
 
# templates is cute but maybe not such a great idea - perhaps should have a
93
 
# separate static message_template.
94
 
 
95
69
 
96
70
class BzrError(StandardError):
97
 
    
98
 
    is_user_error = True
99
 
    
100
71
    def __str__(self):
101
72
        # XXX: Should we show the exception class in 
102
73
        # exceptions that don't provide their own message?  
135
106
class BzrCheckError(BzrNewError):
136
107
    """Internal check failed: %(message)s"""
137
108
 
138
 
    is_user_error = False
139
 
 
140
109
    def __init__(self, message):
141
110
        BzrNewError.__init__(self)
142
111
        self.message = message
144
113
 
145
114
class InvalidEntryName(BzrNewError):
146
115
    """Invalid entry name: %(name)s"""
147
 
 
148
 
    is_user_error = False
149
 
 
150
116
    def __init__(self, name):
151
117
        BzrNewError.__init__(self)
152
118
        self.name = name
162
128
class InvalidRevisionId(BzrNewError):
163
129
    """Invalid revision-id {%(revision_id)s} in %(branch)s"""
164
130
    def __init__(self, revision_id, branch):
165
 
        # branch can be any string or object with __str__ defined
166
131
        BzrNewError.__init__(self)
167
132
        self.revision_id = revision_id
168
133
        self.branch = branch
169
134
 
170
135
 
171
136
class NoWorkingTree(BzrNewError):
172
 
    """No WorkingTree exists for %(base)s."""
 
137
    """No WorkingTree exists for %s(base)."""
173
138
    
174
139
    def __init__(self, base):
175
140
        BzrNewError.__init__(self)
177
142
 
178
143
 
179
144
class NotLocalUrl(BzrNewError):
180
 
    """%(url)s is not a local path."""
 
145
    """%s(url) is not a local path."""
181
146
    
182
147
    def __init__(self, url):
183
148
        BzrNewError.__init__(self)
184
149
        self.url = url
185
150
 
186
151
 
187
 
class BzrCommandError(BzrNewError):
188
 
    """Error from user command"""
189
 
 
190
 
    is_user_error = True
191
 
 
192
 
    # Error from malformed user command; please avoid raising this as a
193
 
    # generic exception not caused by user input.
 
152
class BzrCommandError(BzrError):
 
153
    # Error from malformed user command
 
154
    # This is being misused as a generic exception
 
155
    # pleae subclass. RBC 20051030
194
156
    #
195
157
    # I think it's a waste of effort to differentiate between errors that
196
158
    # are not intended to be caught anyway.  UI code need not subclass
197
159
    # BzrCommandError, and non-UI code should not throw a subclass of
198
160
    # BzrCommandError.  ADHB 20051211
199
 
    def __init__(self, msg):
200
 
        self.msg = msg
201
 
 
202
161
    def __str__(self):
203
 
        return self.msg
 
162
        return self.args[0]
204
163
 
205
164
 
206
165
class BzrOptionError(BzrCommandError):
207
 
    """Error in command line options"""
 
166
    """Some missing or otherwise incorrect option was supplied."""
208
167
 
209
168
    
210
 
class StrictCommitFailed(BzrNewError):
211
 
    """Commit refused because there are unknown files in the tree"""
212
 
 
213
 
 
214
 
# XXX: Should be unified with TransportError; they seem to represent the
215
 
# same thing
 
169
class StrictCommitFailed(Exception):
 
170
    """Commit refused because there are unknowns in the tree."""
 
171
 
 
172
 
216
173
class PathError(BzrNewError):
217
174
    """Generic path error: %(path)r%(extra)s)"""
218
 
 
219
175
    def __init__(self, path, extra=None):
220
176
        BzrNewError.__init__(self)
221
177
        self.path = path
237
193
    """Directory not empty: %(path)r%(extra)s"""
238
194
 
239
195
 
240
 
class ResourceBusy(PathError):
241
 
    """Device or resource busy: %(path)r%(extra)s"""
242
 
 
243
 
 
244
196
class PermissionDenied(PathError):
245
197
    """Permission denied: %(path)r%(extra)s"""
246
198
 
247
199
 
248
 
class InvalidURL(PathError):
249
 
    """Invalid url supplied to transport: %(path)r%(extra)s"""
250
 
 
251
 
 
252
 
class InvalidURLJoin(PathError):
253
 
    """Invalid URL join request: %(args)s%(extra)s"""
254
 
 
255
 
    def __init__(self, msg, base, args):
256
 
        PathError.__init__(self, base, msg)
257
 
        self.args = [base]
258
 
        self.args.extend(args)
259
 
 
260
 
 
261
 
class UnsupportedProtocol(PathError):
262
 
    """Unsupported protocol for url "%(path)s"%(extra)s"""
263
 
 
264
 
    def __init__(self, url, extra):
265
 
        PathError.__init__(self, url, extra=extra)
266
 
 
267
 
 
268
200
class PathNotChild(BzrNewError):
269
201
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
270
 
 
271
 
    is_user_error = False
272
 
 
273
202
    def __init__(self, path, base, extra=None):
274
203
        BzrNewError.__init__(self)
275
204
        self.path = path
280
209
            self.extra = ''
281
210
 
282
211
 
283
 
class InvalidNormalization(PathError):
284
 
    """Path %(path)r is not unicode normalized"""
285
 
 
286
 
 
287
 
# TODO: This is given a URL; we try to unescape it but doing that from inside
288
 
# the exception object is a bit undesirable.
289
 
# TODO: Probably this behavior of should be a common superclass 
290
 
class NotBranchError(PathError):
 
212
class NotBranchError(BzrNewError):
291
213
    """Not a branch: %(path)s"""
292
 
 
293
214
    def __init__(self, path):
294
 
       import bzrlib.urlutils as urlutils
295
 
       self.path = urlutils.unescape_for_display(path, 'ascii')
296
 
 
297
 
 
298
 
class AlreadyBranchError(PathError):
299
 
    """Already a branch: %(path)s."""
300
 
 
301
 
 
302
 
class BranchExistsWithoutWorkingTree(PathError):
303
 
    """Directory contains a branch, but no working tree \
304
 
(use bzr checkout if you wish to build a working tree): %(path)s"""
 
215
        BzrNewError.__init__(self)
 
216
        self.path = path
305
217
 
306
218
 
307
219
class NoRepositoryPresent(BzrNewError):
308
 
    """No repository present: %(path)r"""
 
220
    """Not repository present: %(path)r"""
309
221
    def __init__(self, bzrdir):
310
222
        BzrNewError.__init__(self)
311
223
        self.path = bzrdir.transport.clone('..').base
321
233
        self.path = path
322
234
 
323
235
 
324
 
class UnsupportedFormatError(BzrNewError):
325
 
    """Unsupported branch format: %(format)s"""
326
 
 
327
 
 
328
 
class UnknownFormatError(BzrNewError):
329
 
    """Unknown branch format: %(format)r"""
 
236
class UnsupportedFormatError(BzrError):
 
237
    """Specified path is a bzr branch that we recognize but cannot read."""
 
238
    def __str__(self):
 
239
        return 'unsupported branch format: %s' % self.args[0]
 
240
 
 
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]
330
246
 
331
247
 
332
248
class IncompatibleFormat(BzrNewError):
345
261
        self.path = path
346
262
 
347
263
 
348
 
class PathsNotVersionedError(BzrNewError):
349
 
    # used when reporting several paths are not versioned
350
 
    """Path(s) are not versioned: %(paths_as_string)s"""
351
 
 
352
 
    def __init__(self, paths):
353
 
        from bzrlib.osutils import quotefn
354
 
        BzrNewError.__init__(self)
355
 
        self.paths = paths
356
 
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
357
 
 
358
 
 
359
 
class PathsDoNotExist(BzrNewError):
360
 
    """Path(s) do not exist: %(paths_as_string)s"""
361
 
 
362
 
    # used when reporting that paths are neither versioned nor in the working
363
 
    # tree
364
 
 
365
 
    def __init__(self, paths):
366
 
        # circular import
367
 
        from bzrlib.osutils import quotefn
368
 
        BzrNewError.__init__(self)
369
 
        self.paths = paths
370
 
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
371
 
 
372
 
 
373
 
class BadFileKindError(BzrNewError):
374
 
    """Cannot operate on %(filename)s of unsupported kind %(kind)s"""
375
 
 
376
 
 
377
 
class ForbiddenControlFileError(BzrNewError):
378
 
    """Cannot operate on %(filename)s because it is a control file"""
 
264
class BadFileKindError(BzrError):
 
265
    """Specified file is of a kind that cannot be added.
 
266
 
 
267
    (For example a symlink or device file.)"""
 
268
 
 
269
 
 
270
class ForbiddenFileError(BzrError):
 
271
    """Cannot operate on a file because it is a control file."""
379
272
 
380
273
 
381
274
class LockError(BzrNewError):
407
300
        self.obj = obj
408
301
 
409
302
 
410
 
class OutSideTransaction(BzrNewError):
411
 
    """A transaction related operation was attempted after the transaction finished."""
412
 
 
413
 
 
414
 
class ObjectNotLocked(LockError):
415
 
    """%(obj)r is not locked"""
416
 
 
417
 
    is_user_error = False
418
 
 
419
 
    # this can indicate that any particular object is not locked; see also
420
 
    # LockNotHeld which means that a particular *lock* object is not held by
421
 
    # the caller -- perhaps they should be unified.
422
 
    def __init__(self, obj):
423
 
        self.obj = obj
 
303
class BranchNotLocked(LockError):
 
304
    """Branch %(branch)r is not locked"""
 
305
    def __init__(self, branch):
 
306
        # XXX: sometimes called with a LockableFiles instance not a Branch
 
307
        self.branch = branch
424
308
 
425
309
 
426
310
class ReadOnlyObjectDirtiedError(ReadOnlyError):
462
346
        self.lock = lock
463
347
 
464
348
 
 
349
class BranchNotLocked(LockError):
 
350
    """Branch %(branch)r not locked"""
 
351
    def __init__(self, branch):
 
352
        self.branch = branch
 
353
 
 
354
 
465
355
class PointlessCommit(BzrNewError):
466
356
    """No changes to commit"""
467
357
 
478
368
        self.format = format
479
369
 
480
370
 
481
 
 
482
371
class StrictCommitFailed(Exception):
483
372
    """Commit refused because there are unknowns in the tree."""
484
373
 
485
 
 
486
 
class NoSuchRevision(BzrNewError):
487
 
    """Branch %(branch)s has no revision %(revision)s"""
488
 
 
489
 
    is_user_error = False
490
 
 
 
374
class NoSuchRevision(BzrError):
491
375
    def __init__(self, branch, revision):
492
376
        self.branch = branch
493
377
        self.revision = revision
 
378
        msg = "Branch %s has no revision %s" % (branch, revision)
 
379
        BzrError.__init__(self, msg)
494
380
 
495
381
 
496
382
class HistoryMissing(BzrError):
501
387
                          % (branch, object_type, object_id))
502
388
 
503
389
 
504
 
class DivergedBranches(BzrNewError):
505
 
    "These branches have diverged.  Use the merge command to reconcile them."""
506
 
 
507
 
    is_user_error = True
508
 
 
 
390
class DivergedBranches(BzrError):
509
391
    def __init__(self, branch1, branch2):
 
392
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
510
393
        self.branch1 = branch1
511
394
        self.branch2 = branch2
512
395
 
513
396
 
514
 
class UnrelatedBranches(BzrNewError):
515
 
    "Branches have no common ancestor, and no merge base revision was specified."
516
 
 
517
 
    is_user_error = True
518
 
 
519
 
 
520
 
class NoCommonAncestor(BzrNewError):
521
 
    "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
522
 
 
 
397
class UnrelatedBranches(BzrCommandError):
 
398
    def __init__(self):
 
399
        msg = "Branches have no common ancestor, and no base revision"\
 
400
            " specified."
 
401
        BzrCommandError.__init__(self, msg)
 
402
 
 
403
 
 
404
class NoCommonAncestor(BzrError):
523
405
    def __init__(self, revision_a, revision_b):
524
 
        self.revision_a = revision_a
525
 
        self.revision_b = revision_b
 
406
        msg = "Revisions have no common ancestor: %s %s." \
 
407
            % (revision_a, revision_b) 
 
408
        BzrError.__init__(self, msg)
526
409
 
527
410
 
528
411
class NoCommonRoot(BzrError):
532
415
        BzrError.__init__(self, msg)
533
416
 
534
417
 
535
 
 
536
418
class NotAncestor(BzrError):
537
419
    def __init__(self, rev_id, not_ancestor_id):
538
420
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
551
433
 
552
434
class AmbiguousBase(BzrError):
553
435
    def __init__(self, bases):
554
 
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
555
 
                DeprecationWarning)
556
 
        msg = "The correct base is unclear, because %s are all equally close" %\
 
436
        msg = "The correct base is unclear, becase %s are all equally close" %\
557
437
            ", ".join(bases)
558
438
        BzrError.__init__(self, msg)
559
439
        self.bases = bases
570
450
        BzrError.__init__(self, "Store %s is not listable" % store)
571
451
 
572
452
 
573
 
 
574
453
class UnlistableBranch(BzrError):
575
454
    def __init__(self, br):
576
455
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
577
456
 
578
457
 
579
 
class BoundBranchOutOfDate(BzrNewError):
580
 
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
581
 
    def __init__(self, branch, master):
582
 
        BzrNewError.__init__(self)
583
 
        self.branch = branch
584
 
        self.master = master
585
 
 
586
 
        
587
 
class CommitToDoubleBoundBranch(BzrNewError):
588
 
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
589
 
    def __init__(self, branch, master, remote):
590
 
        BzrNewError.__init__(self)
591
 
        self.branch = branch
592
 
        self.master = master
593
 
        self.remote = remote
594
 
 
595
 
 
596
 
class OverwriteBoundBranch(BzrNewError):
597
 
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
598
 
    def __init__(self, branch):
599
 
        BzrNewError.__init__(self)
600
 
        self.branch = branch
601
 
 
602
 
 
603
 
class BoundBranchConnectionFailure(BzrNewError):
604
 
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
605
 
    def __init__(self, branch, target, error):
606
 
        BzrNewError.__init__(self)
607
 
        self.branch = branch
608
 
        self.target = target
609
 
        self.error = error
610
 
 
611
 
 
612
458
class WeaveError(BzrNewError):
613
459
    """Error in processing weave: %(message)s"""
614
 
 
615
460
    def __init__(self, message=None):
616
461
        BzrNewError.__init__(self)
617
462
        self.message = message
620
465
class WeaveRevisionAlreadyPresent(WeaveError):
621
466
    """Revision {%(revision_id)s} already present in %(weave)s"""
622
467
    def __init__(self, revision_id, weave):
623
 
 
624
468
        WeaveError.__init__(self)
625
469
        self.revision_id = revision_id
626
470
        self.weave = weave
628
472
 
629
473
class WeaveRevisionNotPresent(WeaveError):
630
474
    """Revision {%(revision_id)s} not present in %(weave)s"""
631
 
 
632
475
    def __init__(self, revision_id, weave):
633
476
        WeaveError.__init__(self)
634
477
        self.revision_id = revision_id
637
480
 
638
481
class WeaveFormatError(WeaveError):
639
482
    """Weave invariant violated: %(what)s"""
640
 
 
641
483
    def __init__(self, what):
642
484
        WeaveError.__init__(self)
643
485
        self.what = what
671
513
        self.weave_b = weave_b
672
514
 
673
515
 
674
 
class VersionedFileError(BzrNewError):
675
 
    """Versioned file error."""
676
 
 
677
 
 
678
 
class RevisionNotPresent(VersionedFileError):
679
 
    """Revision {%(revision_id)s} not present in %(file_id)s."""
680
 
 
681
 
    def __init__(self, revision_id, file_id):
682
 
        VersionedFileError.__init__(self)
683
 
        self.revision_id = revision_id
684
 
        self.file_id = file_id
685
 
 
686
 
 
687
 
class RevisionAlreadyPresent(VersionedFileError):
688
 
    """Revision {%(revision_id)s} already present in %(file_id)s."""
689
 
 
690
 
    def __init__(self, revision_id, file_id):
691
 
        VersionedFileError.__init__(self)
692
 
        self.revision_id = revision_id
693
 
        self.file_id = file_id
694
 
 
695
 
 
696
 
class KnitError(BzrNewError):
697
 
    """Knit error"""
698
 
 
699
 
 
700
 
class KnitHeaderError(KnitError):
701
 
    """Knit header error: %(badline)r unexpected"""
702
 
 
703
 
    def __init__(self, badline):
704
 
        KnitError.__init__(self)
705
 
        self.badline = badline
706
 
 
707
 
 
708
 
class KnitCorrupt(KnitError):
709
 
    """Knit %(filename)s corrupt: %(how)s"""
710
 
 
711
 
    def __init__(self, filename, how):
712
 
        KnitError.__init__(self)
713
 
        self.filename = filename
714
 
        self.how = how
715
 
 
716
 
 
717
516
class NoSuchExportFormat(BzrNewError):
718
517
    """Export format %(format)r not supported"""
719
518
    def __init__(self, format):
721
520
        self.format = format
722
521
 
723
522
 
724
 
class TransportError(BzrNewError):
725
 
    """Transport error: %(msg)s %(orig_error)s"""
726
 
 
 
523
class TransportError(BzrError):
 
524
    """All errors thrown by Transport implementations should derive
 
525
    from this class.
 
526
    """
727
527
    def __init__(self, msg=None, orig_error=None):
728
528
        if msg is None and orig_error is not None:
729
529
            msg = str(orig_error)
730
 
        if orig_error is None:
731
 
            orig_error = ''
732
 
        if msg is None:
733
 
            msg =  ''
 
530
        BzrError.__init__(self, msg)
734
531
        self.msg = msg
735
532
        self.orig_error = orig_error
736
 
        BzrNewError.__init__(self)
737
533
 
738
534
 
739
535
# A set of semi-meaningful errors which can be thrown
740
536
class TransportNotPossible(TransportError):
741
 
    """Transport operation not possible: %(msg)s %(orig_error)%"""
 
537
    """This is for transports where a specific function is explicitly not
 
538
    possible. Such as pushing files to an HTTP server.
 
539
    """
 
540
    pass
742
541
 
743
542
 
744
543
class ConnectionError(TransportError):
745
 
    """Connection error: %(msg)s %(orig_error)s"""
 
544
    """A connection problem prevents file retrieval.
 
545
    This does not indicate whether the file exists or not; it indicates that a
 
546
    precondition for requesting the file was not met.
 
547
    """
 
548
    def __init__(self, msg=None, orig_error=None):
 
549
        TransportError.__init__(self, msg=msg, orig_error=orig_error)
746
550
 
747
551
 
748
552
class ConnectionReset(TransportError):
749
 
    """Connection closed: %(msg)s %(orig_error)s"""
750
 
 
751
 
 
752
 
class InvalidRange(TransportError):
753
 
    """Invalid range access."""
754
 
    
755
 
    def __init__(self, path, offset):
756
 
        TransportError.__init__(self, ("Invalid range access in %s at %d"
757
 
                                       % (path, offset)))
758
 
 
759
 
 
760
 
class InvalidHttpResponse(TransportError):
761
 
    """Invalid http response for %(path)s: %(msg)s"""
762
 
 
763
 
    def __init__(self, path, msg, orig_error=None):
764
 
        self.path = path
765
 
        TransportError.__init__(self, msg, orig_error=orig_error)
766
 
 
767
 
 
768
 
class InvalidHttpRange(InvalidHttpResponse):
769
 
    """Invalid http range "%(range)s" for %(path)s: %(msg)s"""
770
 
    
771
 
    def __init__(self, path, range, msg):
772
 
        self.range = range
773
 
        InvalidHttpResponse.__init__(self, path, msg)
774
 
 
775
 
 
776
 
class InvalidHttpContentType(InvalidHttpResponse):
777
 
    """Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s"""
778
 
    
779
 
    def __init__(self, path, ctype, msg):
780
 
        self.ctype = ctype
781
 
        InvalidHttpResponse.__init__(self, path, msg)
 
553
    """The connection has been closed."""
 
554
    pass
782
555
 
783
556
 
784
557
class ConflictsInTree(BzrError):
835
608
    """
836
609
 
837
610
 
838
 
class NoBundleFound(BzrNewError):
839
 
    """No bundle was found in %(filename)s"""
840
 
    def __init__(self, filename):
841
 
        BzrNewError.__init__(self)
842
 
        self.filename = filename
843
 
 
844
 
 
845
 
class BundleNotSupported(BzrNewError):
846
 
    """Unable to handle bundle version %(version)s: %(msg)s"""
847
 
    def __init__(self, version, msg):
848
 
        BzrNewError.__init__(self)
849
 
        self.version = version
850
 
        self.msg = msg
851
 
 
852
 
 
853
611
class MissingText(BzrNewError):
854
612
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
855
613
 
860
618
        self.text_revision = text_revision
861
619
        self.file_id = file_id
862
620
 
863
 
 
864
621
class DuplicateKey(BzrNewError):
865
622
    """Key %(key)s is already present in map"""
866
623
 
867
 
 
868
624
class MalformedTransform(BzrNewError):
869
625
    """Tree transform is malformed %(conflicts)r"""
870
626
 
900
656
    """Parameter $(param)s is required but not present."""
901
657
 
902
658
 
903
 
class BzrBadParameterUnicode(BzrBadParameter):
904
 
    """Parameter %(param)s is unicode but only byte-strings are permitted."""
905
 
 
906
 
 
907
 
class BzrBadParameterContainsNewline(BzrBadParameter):
908
 
    """Parameter %(param)s contains a newline."""
909
 
 
910
 
 
911
659
class DependencyNotPresent(BzrNewError):
912
 
    """Unable to import library "%(library)s": %(error)s"""
 
660
    """Unable to import library: %(library)s, %(error)s"""
913
661
 
914
662
    def __init__(self, library, error):
915
663
        BzrNewError.__init__(self, library=library, error=error)
930
678
        self.format = format
931
679
 
932
680
 
933
 
class NoDiff(BzrNewError):
934
 
    """Diff is not installed on this machine: %(msg)s"""
935
 
 
936
 
    def __init__(self, msg):
937
 
        super(NoDiff, self).__init__(msg=msg)
938
 
 
939
 
 
940
681
class NoDiff3(BzrNewError):
941
682
    """Diff3 is not installed on this machine."""
942
683
 
967
708
    def __init__(self, tree):
968
709
        BzrNewError.__init__(self)
969
710
        self.tree = tree
970
 
 
971
 
 
972
 
class MergeModifiedFormatError(BzrNewError):
973
 
    """Error in merge modified format"""
974
 
 
975
 
 
976
 
class ConflictFormatError(BzrNewError):
977
 
    """Format error in conflict listings"""
978
 
 
979
 
 
980
 
class CorruptRepository(BzrNewError):
981
 
    """An error has been detected in the repository %(repo_path)s.
982
 
Please run bzr reconcile on this repository."""
983
 
 
984
 
    def __init__(self, repo):
985
 
        BzrNewError.__init__(self)
986
 
        self.repo_path = repo.bzrdir.root_transport.base
987
 
 
988
 
 
989
 
class UpgradeRequired(BzrNewError):
990
 
    """To use this feature you must upgrade your branch at %(path)s."""
991
 
 
992
 
    def __init__(self, path):
993
 
        BzrNewError.__init__(self)
994
 
        self.path = path
995
 
 
996
 
 
997
 
class LocalRequiresBoundBranch(BzrNewError):
998
 
    """Cannot perform local-only commits on unbound branches."""
999
 
 
1000
 
 
1001
 
class MissingProgressBarFinish(BzrNewError):
1002
 
    """A nested progress bar was not 'finished' correctly."""
1003
 
 
1004
 
 
1005
 
class InvalidProgressBarType(BzrNewError):
1006
 
    """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
1007
 
Select one of: %(valid_types)s"""
1008
 
 
1009
 
    def __init__(self, bar_type, valid_types):
1010
 
        BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1011
 
 
1012
 
 
1013
 
class UnsupportedOperation(BzrNewError):
1014
 
    """The method %(mname)s is not supported on objects of type %(tname)s."""
1015
 
    def __init__(self, method, method_self):
1016
 
        self.method = method
1017
 
        self.mname = method.__name__
1018
 
        self.tname = type(method_self).__name__
1019
 
 
1020
 
 
1021
 
class BinaryFile(BzrNewError):
1022
 
    """File is binary but should be text."""
1023
 
 
1024
 
 
1025
 
class IllegalPath(BzrNewError):
1026
 
    """The path %(path)s is not permitted on this platform"""
1027
 
 
1028
 
    def __init__(self, path):
1029
 
        BzrNewError.__init__(self)
1030
 
        self.path = path
1031
 
 
1032
 
 
1033
 
class TestamentMismatch(BzrNewError):
1034
 
    """Testament did not match expected value.  
1035
 
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured 
1036
 
       {%(measured)s}
1037
 
    """
1038
 
    def __init__(self, revision_id, expected, measured):
1039
 
        self.revision_id = revision_id
1040
 
        self.expected = expected
1041
 
        self.measured = measured
1042
 
 
1043
 
 
1044
 
class NotABundle(BzrNewError):
1045
 
    """Not a bzr revision-bundle: %(text)r"""
1046
 
 
1047
 
    def __init__(self, text):
1048
 
        self.text = text
1049
 
 
1050
 
 
1051
 
class BadBundle(Exception): pass
1052
 
 
1053
 
 
1054
 
class MalformedHeader(BadBundle): pass
1055
 
 
1056
 
 
1057
 
class MalformedPatches(BadBundle): pass
1058
 
 
1059
 
 
1060
 
class MalformedFooter(BadBundle): pass