~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: John Arbash Meinel
  • Date: 2006-08-15 15:50:31 UTC
  • mto: This revision was merged to the branch mainline in revision 1927.
  • Revision ID: john@arbash-meinel.com-20060815155031-f1480d692d2cf9d2
There is no strict ordering file addition, other than directories are added before child files

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# (C) 2005 Canonical
2
 
 
 
1
# Copyright (C) 2005, 2006 Canonical
 
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
 
19
31
Exceptions are caught at a high level to report errors to the user, and
20
32
might also be caught inside the program.  Therefore it needs to be
21
33
possible to convert them to a meaningful string, and also for them to be
34
46
... except:
35
47
...   print sys.exc_type
36
48
...   print sys.exc_value
37
 
...   path = getattr(sys.exc_value, 'path')
 
49
...   path = getattr(sys.exc_value, 'path', None)
38
50
...   if path is not None:
39
51
...     print path
40
52
bzrlib.errors.NotBranchError
44
56
Therefore:
45
57
 
46
58
 * 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.
 
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.
54
67
"""
55
68
 
 
69
from warnings import warn
 
70
 
 
71
from bzrlib.patches import (PatchSyntax, 
 
72
                            PatchConflict, 
 
73
                            MalformedPatchHeader,
 
74
                            MalformedHunkHeader,
 
75
                            MalformedLine,)
 
76
 
 
77
 
56
78
# based on Scott James Remnant's hct error classes
57
79
 
58
80
# TODO: is there any value in providing the .args field used by standard
66
88
# TODO: Convert all the other error classes here to BzrNewError, and eliminate
67
89
# the old one.
68
90
 
 
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
 
69
95
 
70
96
class BzrError(StandardError):
 
97
    
 
98
    is_user_error = True
 
99
    
71
100
    def __str__(self):
72
101
        # XXX: Should we show the exception class in 
73
102
        # exceptions that don't provide their own message?  
105
134
 
106
135
class BzrCheckError(BzrNewError):
107
136
    """Internal check failed: %(message)s"""
 
137
 
 
138
    is_user_error = False
 
139
 
108
140
    def __init__(self, message):
109
141
        BzrNewError.__init__(self)
110
142
        self.message = message
112
144
 
113
145
class InvalidEntryName(BzrNewError):
114
146
    """Invalid entry name: %(name)s"""
 
147
 
 
148
    is_user_error = False
 
149
 
115
150
    def __init__(self, name):
116
151
        BzrNewError.__init__(self)
117
152
        self.name = name
127
162
class InvalidRevisionId(BzrNewError):
128
163
    """Invalid revision-id {%(revision_id)s} in %(branch)s"""
129
164
    def __init__(self, revision_id, branch):
 
165
        # branch can be any string or object with __str__ defined
130
166
        BzrNewError.__init__(self)
131
167
        self.revision_id = revision_id
132
168
        self.branch = branch
133
169
 
134
170
 
135
171
class NoWorkingTree(BzrNewError):
136
 
    """No WorkingTree exists for %s(base)."""
 
172
    """No WorkingTree exists for %(base)s."""
137
173
    
138
174
    def __init__(self, base):
139
175
        BzrNewError.__init__(self)
141
177
 
142
178
 
143
179
class NotLocalUrl(BzrNewError):
144
 
    """%s(url) is not a local path."""
 
180
    """%(url)s is not a local path."""
145
181
    
146
182
    def __init__(self, url):
147
183
        BzrNewError.__init__(self)
148
184
        self.url = url
149
185
 
150
186
 
151
 
class BzrCommandError(BzrError):
152
 
    # Error from malformed user command
153
 
    # This is being misused as a generic exception
154
 
    # pleae subclass. RBC 20051030
 
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.
155
194
    #
156
195
    # I think it's a waste of effort to differentiate between errors that
157
196
    # are not intended to be caught anyway.  UI code need not subclass
158
197
    # BzrCommandError, and non-UI code should not throw a subclass of
159
198
    # BzrCommandError.  ADHB 20051211
 
199
    def __init__(self, msg):
 
200
        self.msg = msg
 
201
 
160
202
    def __str__(self):
161
 
        return self.args[0]
 
203
        return self.msg
162
204
 
163
205
 
164
206
class BzrOptionError(BzrCommandError):
165
 
    """Some missing or otherwise incorrect option was supplied."""
 
207
    """Error in command line options"""
166
208
 
167
209
    
168
 
class StrictCommitFailed(Exception):
169
 
    """Commit refused because there are unknowns in the tree."""
170
 
 
171
 
 
 
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
172
216
class PathError(BzrNewError):
173
217
    """Generic path error: %(path)r%(extra)s)"""
 
218
 
174
219
    def __init__(self, path, extra=None):
175
220
        BzrNewError.__init__(self)
176
221
        self.path = path
188
233
    """File exists: %(path)r%(extra)s"""
189
234
 
190
235
 
 
236
class DirectoryNotEmpty(PathError):
 
237
    """Directory not empty: %(path)r%(extra)s"""
 
238
 
 
239
 
 
240
class ResourceBusy(PathError):
 
241
    """Device or resource busy: %(path)r%(extra)s"""
 
242
 
 
243
 
191
244
class PermissionDenied(PathError):
192
245
    """Permission denied: %(path)r%(extra)s"""
193
246
 
194
247
 
 
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
 
195
268
class PathNotChild(BzrNewError):
196
269
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
 
270
 
 
271
    is_user_error = False
 
272
 
197
273
    def __init__(self, path, base, extra=None):
198
274
        BzrNewError.__init__(self)
199
275
        self.path = path
204
280
            self.extra = ''
205
281
 
206
282
 
207
 
class NotBranchError(BzrNewError):
 
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):
208
291
    """Not a branch: %(path)s"""
 
292
 
209
293
    def __init__(self, path):
210
 
        BzrNewError.__init__(self)
211
 
        self.path = 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"""
 
305
 
 
306
 
 
307
class AtomicFileAlreadyClosed(PathError):
 
308
    """'%(function)s' called on an AtomicFile after it was closed: %(path)s"""
 
309
 
 
310
    def __init__(self, path, function):
 
311
        PathError.__init__(self, path=path, extra=None)
 
312
        self.function = function
 
313
 
 
314
 
 
315
class InaccessibleParent(PathError):
 
316
    """Parent not accessible given base %(base)s and relative path %(path)s"""
 
317
 
 
318
    def __init__(self, path, base):
 
319
        PathError.__init__(self, path)
 
320
        self.base = base
212
321
 
213
322
 
214
323
class NoRepositoryPresent(BzrNewError):
215
 
    """Not repository present: %(path)r"""
 
324
    """No repository present: %(path)r"""
216
325
    def __init__(self, bzrdir):
217
326
        BzrNewError.__init__(self)
218
327
        self.path = bzrdir.transport.clone('..').base
228
337
        self.path = path
229
338
 
230
339
 
231
 
class UnsupportedFormatError(BzrError):
232
 
    """Specified path is a bzr branch that we recognize but cannot read."""
233
 
    def __str__(self):
234
 
        return 'unsupported branch format: %s' % self.args[0]
235
 
 
236
 
 
237
 
class UnknownFormatError(BzrError):
238
 
    """Specified path is a bzr branch whose format we do not recognize."""
239
 
    def __str__(self):
240
 
        return 'unknown branch format: %s' % self.args[0]
 
340
class UnsupportedFormatError(BzrNewError):
 
341
    """Unsupported branch format: %(format)s"""
 
342
 
 
343
 
 
344
class UnknownFormatError(BzrNewError):
 
345
    """Unknown branch format: %(format)r"""
241
346
 
242
347
 
243
348
class IncompatibleFormat(BzrNewError):
256
361
        self.path = path
257
362
 
258
363
 
259
 
class BadFileKindError(BzrError):
260
 
    """Specified file is of a kind that cannot be added.
261
 
 
262
 
    (For example a symlink or device file.)"""
263
 
 
264
 
 
265
 
class ForbiddenFileError(BzrError):
266
 
    """Cannot operate on a file because it is a control file."""
267
 
 
268
 
 
269
 
class LockError(Exception):
270
 
    """Lock error"""
 
364
class PathsNotVersionedError(BzrNewError):
 
365
    # used when reporting several paths are not versioned
 
366
    """Path(s) are not versioned: %(paths_as_string)s"""
 
367
 
 
368
    def __init__(self, paths):
 
369
        from bzrlib.osutils import quotefn
 
370
        BzrNewError.__init__(self)
 
371
        self.paths = paths
 
372
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
373
 
 
374
 
 
375
class PathsDoNotExist(BzrNewError):
 
376
    """Path(s) do not exist: %(paths_as_string)s"""
 
377
 
 
378
    # used when reporting that paths are neither versioned nor in the working
 
379
    # tree
 
380
 
 
381
    def __init__(self, paths):
 
382
        # circular import
 
383
        from bzrlib.osutils import quotefn
 
384
        BzrNewError.__init__(self)
 
385
        self.paths = paths
 
386
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
387
 
 
388
 
 
389
class BadFileKindError(BzrNewError):
 
390
    """Cannot operate on %(filename)s of unsupported kind %(kind)s"""
 
391
 
 
392
 
 
393
class ForbiddenControlFileError(BzrNewError):
 
394
    """Cannot operate on %(filename)s because it is a control file"""
 
395
 
 
396
 
 
397
class LockError(BzrNewError):
 
398
    """Lock error: %(message)s"""
271
399
    # All exceptions from the lock/unlock functions should be from
272
400
    # this exception class.  They will be translated as necessary. The
273
401
    # original exception is available as e.original_error
 
402
    #
 
403
    # New code should prefer to raise specific subclasses
 
404
    def __init__(self, message):
 
405
        self.message = message
274
406
 
275
407
 
276
408
class CommitNotPossible(LockError):
277
409
    """A commit was attempted but we do not have a write lock open."""
 
410
    def __init__(self):
 
411
        pass
278
412
 
279
413
 
280
414
class AlreadyCommitted(LockError):
281
415
    """A rollback was requested, but is not able to be accomplished."""
 
416
    def __init__(self):
 
417
        pass
282
418
 
283
419
 
284
420
class ReadOnlyError(LockError):
285
 
    """A write attempt was made in a read only transaction."""
 
421
    """A write attempt was made in a read only transaction on %(obj)s"""
 
422
    def __init__(self, obj):
 
423
        self.obj = obj
 
424
 
 
425
 
 
426
class OutSideTransaction(BzrNewError):
 
427
    """A transaction related operation was attempted after the transaction finished."""
 
428
 
 
429
 
 
430
class ObjectNotLocked(LockError):
 
431
    """%(obj)r is not locked"""
 
432
 
 
433
    is_user_error = False
 
434
 
 
435
    # this can indicate that any particular object is not locked; see also
 
436
    # LockNotHeld which means that a particular *lock* object is not held by
 
437
    # the caller -- perhaps they should be unified.
 
438
    def __init__(self, obj):
 
439
        self.obj = obj
 
440
 
 
441
 
 
442
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
443
    """Cannot change object %(obj)r in read only transaction"""
 
444
    def __init__(self, obj):
 
445
        self.obj = obj
 
446
 
 
447
 
 
448
class UnlockableTransport(LockError):
 
449
    """Cannot lock: transport is read only: %(transport)s"""
 
450
    def __init__(self, transport):
 
451
        self.transport = transport
 
452
 
 
453
 
 
454
class LockContention(LockError):
 
455
    """Could not acquire lock %(lock)s"""
 
456
    # TODO: show full url for lock, combining the transport and relative bits?
 
457
    def __init__(self, lock):
 
458
        self.lock = lock
 
459
 
 
460
 
 
461
class LockBroken(LockError):
 
462
    """Lock was broken while still open: %(lock)s - check storage consistency!"""
 
463
    def __init__(self, lock):
 
464
        self.lock = lock
 
465
 
 
466
 
 
467
class LockBreakMismatch(LockError):
 
468
    """Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
 
469
    def __init__(self, lock, holder, target):
 
470
        self.lock = lock
 
471
        self.holder = holder
 
472
        self.target = target
 
473
 
 
474
 
 
475
class LockNotHeld(LockError):
 
476
    """Lock not held: %(lock)s"""
 
477
    def __init__(self, lock):
 
478
        self.lock = lock
286
479
 
287
480
 
288
481
class PointlessCommit(BzrNewError):
293
486
    """Upgrade URL cannot work with readonly URL's."""
294
487
 
295
488
 
 
489
class UpToDateFormat(BzrNewError):
 
490
    """The branch format %(format)s is already at the most recent format."""
 
491
 
 
492
    def __init__(self, format):
 
493
        BzrNewError.__init__(self)
 
494
        self.format = format
 
495
 
 
496
 
 
497
 
296
498
class StrictCommitFailed(Exception):
297
499
    """Commit refused because there are unknowns in the tree."""
298
500
 
299
501
 
300
 
class NoSuchRevision(BzrError):
 
502
class NoSuchRevision(BzrNewError):
 
503
    """Branch %(branch)s has no revision %(revision)s"""
 
504
 
 
505
    is_user_error = False
 
506
 
301
507
    def __init__(self, branch, revision):
302
508
        self.branch = branch
303
509
        self.revision = revision
304
 
        msg = "Branch %s has no revision %s" % (branch, revision)
305
 
        BzrError.__init__(self, msg)
306
510
 
307
511
 
308
512
class HistoryMissing(BzrError):
313
517
                          % (branch, object_type, object_id))
314
518
 
315
519
 
316
 
class DivergedBranches(BzrError):
 
520
class DivergedBranches(BzrNewError):
 
521
    "These branches have diverged.  Use the merge command to reconcile them."""
 
522
 
 
523
    is_user_error = True
 
524
 
317
525
    def __init__(self, branch1, branch2):
318
 
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
319
526
        self.branch1 = branch1
320
527
        self.branch2 = branch2
321
528
 
322
529
 
323
 
class UnrelatedBranches(BzrCommandError):
324
 
    def __init__(self):
325
 
        msg = "Branches have no common ancestor, and no base revision"\
326
 
            " specified."
327
 
        BzrCommandError.__init__(self, msg)
328
 
 
329
 
class NoCommonAncestor(BzrError):
 
530
class UnrelatedBranches(BzrNewError):
 
531
    "Branches have no common ancestor, and no merge base revision was specified."
 
532
 
 
533
    is_user_error = True
 
534
 
 
535
 
 
536
class NoCommonAncestor(BzrNewError):
 
537
    "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
538
 
330
539
    def __init__(self, revision_a, revision_b):
331
 
        msg = "Revisions have no common ancestor: %s %s." \
332
 
            % (revision_a, revision_b) 
333
 
        BzrError.__init__(self, msg)
 
540
        self.revision_a = revision_a
 
541
        self.revision_b = revision_b
 
542
 
334
543
 
335
544
class NoCommonRoot(BzrError):
336
545
    def __init__(self, revision_a, revision_b):
338
547
            % (revision_a, revision_b) 
339
548
        BzrError.__init__(self, msg)
340
549
 
 
550
 
 
551
 
341
552
class NotAncestor(BzrError):
342
553
    def __init__(self, rev_id, not_ancestor_id):
343
554
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
356
567
 
357
568
class AmbiguousBase(BzrError):
358
569
    def __init__(self, bases):
359
 
        msg = "The correct base is unclear, becase %s are all equally close" %\
 
570
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
571
                DeprecationWarning)
 
572
        msg = "The correct base is unclear, because %s are all equally close" %\
360
573
            ", ".join(bases)
361
574
        BzrError.__init__(self, msg)
362
575
        self.bases = bases
363
576
 
 
577
 
364
578
class NoCommits(BzrError):
365
579
    def __init__(self, branch):
366
580
        msg = "Branch %s has no commits." % branch
367
581
        BzrError.__init__(self, msg)
368
582
 
 
583
 
369
584
class UnlistableStore(BzrError):
370
585
    def __init__(self, store):
371
586
        BzrError.__init__(self, "Store %s is not listable" % store)
372
587
 
 
588
 
 
589
 
373
590
class UnlistableBranch(BzrError):
374
591
    def __init__(self, br):
375
592
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
376
593
 
377
594
 
 
595
class BoundBranchOutOfDate(BzrNewError):
 
596
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
 
597
    def __init__(self, branch, master):
 
598
        BzrNewError.__init__(self)
 
599
        self.branch = branch
 
600
        self.master = master
 
601
 
 
602
        
 
603
class CommitToDoubleBoundBranch(BzrNewError):
 
604
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
 
605
    def __init__(self, branch, master, remote):
 
606
        BzrNewError.__init__(self)
 
607
        self.branch = branch
 
608
        self.master = master
 
609
        self.remote = remote
 
610
 
 
611
 
 
612
class OverwriteBoundBranch(BzrNewError):
 
613
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
 
614
    def __init__(self, branch):
 
615
        BzrNewError.__init__(self)
 
616
        self.branch = branch
 
617
 
 
618
 
 
619
class BoundBranchConnectionFailure(BzrNewError):
 
620
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
 
621
    def __init__(self, branch, target, error):
 
622
        BzrNewError.__init__(self)
 
623
        self.branch = branch
 
624
        self.target = target
 
625
        self.error = error
 
626
 
 
627
 
378
628
class WeaveError(BzrNewError):
379
629
    """Error in processing weave: %(message)s"""
 
630
 
380
631
    def __init__(self, message=None):
381
632
        BzrNewError.__init__(self)
382
633
        self.message = message
385
636
class WeaveRevisionAlreadyPresent(WeaveError):
386
637
    """Revision {%(revision_id)s} already present in %(weave)s"""
387
638
    def __init__(self, revision_id, weave):
 
639
 
388
640
        WeaveError.__init__(self)
389
641
        self.revision_id = revision_id
390
642
        self.weave = weave
392
644
 
393
645
class WeaveRevisionNotPresent(WeaveError):
394
646
    """Revision {%(revision_id)s} not present in %(weave)s"""
 
647
 
395
648
    def __init__(self, revision_id, weave):
396
649
        WeaveError.__init__(self)
397
650
        self.revision_id = revision_id
400
653
 
401
654
class WeaveFormatError(WeaveError):
402
655
    """Weave invariant violated: %(what)s"""
 
656
 
403
657
    def __init__(self, what):
404
658
        WeaveError.__init__(self)
405
659
        self.what = what
423
677
        self.weave_b = weave_b
424
678
 
425
679
 
 
680
class WeaveTextDiffers(WeaveError):
 
681
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
682
 
 
683
    def __init__(self, revision_id, weave_a, weave_b):
 
684
        WeaveError.__init__(self)
 
685
        self.revision_id = revision_id
 
686
        self.weave_a = weave_a
 
687
        self.weave_b = weave_b
 
688
 
 
689
 
 
690
class VersionedFileError(BzrNewError):
 
691
    """Versioned file error."""
 
692
 
 
693
 
 
694
class RevisionNotPresent(VersionedFileError):
 
695
    """Revision {%(revision_id)s} not present in %(file_id)s."""
 
696
 
 
697
    def __init__(self, revision_id, file_id):
 
698
        VersionedFileError.__init__(self)
 
699
        self.revision_id = revision_id
 
700
        self.file_id = file_id
 
701
 
 
702
 
 
703
class RevisionAlreadyPresent(VersionedFileError):
 
704
    """Revision {%(revision_id)s} already present in %(file_id)s."""
 
705
 
 
706
    def __init__(self, revision_id, file_id):
 
707
        VersionedFileError.__init__(self)
 
708
        self.revision_id = revision_id
 
709
        self.file_id = file_id
 
710
 
 
711
 
 
712
class KnitError(BzrNewError):
 
713
    """Knit error"""
 
714
 
 
715
 
 
716
class KnitHeaderError(KnitError):
 
717
    """Knit header error: %(badline)r unexpected"""
 
718
 
 
719
    def __init__(self, badline):
 
720
        KnitError.__init__(self)
 
721
        self.badline = badline
 
722
 
 
723
 
 
724
class KnitCorrupt(KnitError):
 
725
    """Knit %(filename)s corrupt: %(how)s"""
 
726
 
 
727
    def __init__(self, filename, how):
 
728
        KnitError.__init__(self)
 
729
        self.filename = filename
 
730
        self.how = how
 
731
 
 
732
 
426
733
class NoSuchExportFormat(BzrNewError):
427
734
    """Export format %(format)r not supported"""
428
735
    def __init__(self, format):
430
737
        self.format = format
431
738
 
432
739
 
433
 
class TransportError(BzrError):
434
 
    """All errors thrown by Transport implementations should derive
435
 
    from this class.
436
 
    """
 
740
class TransportError(BzrNewError):
 
741
    """Transport error: %(msg)s %(orig_error)s"""
 
742
 
437
743
    def __init__(self, msg=None, orig_error=None):
438
744
        if msg is None and orig_error is not None:
439
745
            msg = str(orig_error)
440
 
        BzrError.__init__(self, msg)
 
746
        if orig_error is None:
 
747
            orig_error = ''
 
748
        if msg is None:
 
749
            msg =  ''
441
750
        self.msg = msg
442
751
        self.orig_error = orig_error
 
752
        BzrNewError.__init__(self)
 
753
 
443
754
 
444
755
# A set of semi-meaningful errors which can be thrown
445
756
class TransportNotPossible(TransportError):
446
 
    """This is for transports where a specific function is explicitly not
447
 
    possible. Such as pushing files to an HTTP server.
448
 
    """
449
 
    pass
 
757
    """Transport operation not possible: %(msg)s %(orig_error)%"""
450
758
 
451
759
 
452
760
class ConnectionError(TransportError):
453
 
    """A connection problem prevents file retrieval.
454
 
    This does not indicate whether the file exists or not; it indicates that a
455
 
    precondition for requesting the file was not met.
456
 
    """
457
 
    def __init__(self, msg=None, orig_error=None):
458
 
        TransportError.__init__(self, msg=msg, orig_error=orig_error)
 
761
    """Connection error: %(msg)s %(orig_error)s"""
459
762
 
460
763
 
461
764
class ConnectionReset(TransportError):
462
 
    """The connection has been closed."""
463
 
    pass
 
765
    """Connection closed: %(msg)s %(orig_error)s"""
 
766
 
 
767
 
 
768
class InvalidRange(TransportError):
 
769
    """Invalid range access."""
 
770
    
 
771
    def __init__(self, path, offset):
 
772
        TransportError.__init__(self, ("Invalid range access in %s at %d"
 
773
                                       % (path, offset)))
 
774
 
 
775
 
 
776
class InvalidHttpResponse(TransportError):
 
777
    """Invalid http response for %(path)s: %(msg)s"""
 
778
 
 
779
    def __init__(self, path, msg, orig_error=None):
 
780
        self.path = path
 
781
        TransportError.__init__(self, msg, orig_error=orig_error)
 
782
 
 
783
 
 
784
class InvalidHttpRange(InvalidHttpResponse):
 
785
    """Invalid http range "%(range)s" for %(path)s: %(msg)s"""
 
786
    
 
787
    def __init__(self, path, range, msg):
 
788
        self.range = range
 
789
        InvalidHttpResponse.__init__(self, path, msg)
 
790
 
 
791
 
 
792
class InvalidHttpContentType(InvalidHttpResponse):
 
793
    """Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s"""
 
794
    
 
795
    def __init__(self, path, ctype, msg):
 
796
        self.ctype = ctype
 
797
        InvalidHttpResponse.__init__(self, path, msg)
 
798
 
464
799
 
465
800
class ConflictsInTree(BzrError):
466
801
    def __init__(self):
467
802
        BzrError.__init__(self, "Working tree has conflicts.")
468
803
 
 
804
 
469
805
class ParseConfigError(BzrError):
470
806
    def __init__(self, errors, filename):
471
807
        if filename is None:
474
810
            (filename, ('\n'.join(e.message for e in errors)))
475
811
        BzrError.__init__(self, message)
476
812
 
 
813
 
477
814
class SigningFailed(BzrError):
478
815
    def __init__(self, command_line):
479
816
        BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
480
817
                               % command_line)
481
818
 
 
819
 
482
820
class WorkingTreeNotRevision(BzrError):
483
821
    def __init__(self, tree):
484
822
        BzrError.__init__(self, "The working tree for %s has changed since"
485
823
                          " last commit, but weave merge requires that it be"
486
824
                          " unchanged." % tree.basedir)
487
825
 
 
826
 
488
827
class CantReprocessAndShowBase(BzrNewError):
489
828
    """Can't reprocess and show base.
490
829
Reprocessing obscures relationship of conflicting lines to base."""
491
830
 
 
831
 
492
832
class GraphCycleError(BzrNewError):
493
833
    """Cycle in graph %(graph)r"""
494
834
    def __init__(self, graph):
511
851
    """
512
852
 
513
853
 
 
854
class NoBundleFound(BzrNewError):
 
855
    """No bundle was found in %(filename)s"""
 
856
    def __init__(self, filename):
 
857
        BzrNewError.__init__(self)
 
858
        self.filename = filename
 
859
 
 
860
 
 
861
class BundleNotSupported(BzrNewError):
 
862
    """Unable to handle bundle version %(version)s: %(msg)s"""
 
863
    def __init__(self, version, msg):
 
864
        BzrNewError.__init__(self)
 
865
        self.version = version
 
866
        self.msg = msg
 
867
 
 
868
 
514
869
class MissingText(BzrNewError):
515
870
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
516
871
 
522
877
        self.file_id = file_id
523
878
 
524
879
 
 
880
class DuplicateKey(BzrNewError):
 
881
    """Key %(key)s is already present in map"""
 
882
 
 
883
 
 
884
class MalformedTransform(BzrNewError):
 
885
    """Tree transform is malformed %(conflicts)r"""
 
886
 
 
887
 
525
888
class BzrBadParameter(BzrNewError):
526
889
    """A bad parameter : %(param)s is not usable.
527
890
    
537
900
    """Parameter %(param)s is neither unicode nor utf8."""
538
901
 
539
902
 
 
903
class ReusingTransform(BzrNewError):
 
904
    """Attempt to reuse a transform that has already been applied."""
 
905
 
 
906
 
 
907
class CantMoveRoot(BzrNewError):
 
908
    """Moving the root directory is not supported at this time"""
 
909
 
 
910
 
540
911
class BzrBadParameterNotString(BzrBadParameter):
541
912
    """Parameter %(param)s is not a string or unicode string."""
542
913
 
545
916
    """Parameter $(param)s is required but not present."""
546
917
 
547
918
 
 
919
class BzrBadParameterUnicode(BzrBadParameter):
 
920
    """Parameter %(param)s is unicode but only byte-strings are permitted."""
 
921
 
 
922
 
 
923
class BzrBadParameterContainsNewline(BzrBadParameter):
 
924
    """Parameter %(param)s contains a newline."""
 
925
 
 
926
 
548
927
class DependencyNotPresent(BzrNewError):
549
 
    """Unable to import library: %(library)s, %(error)s"""
 
928
    """Unable to import library "%(library)s": %(error)s"""
550
929
 
551
930
    def __init__(self, library, error):
552
931
        BzrNewError.__init__(self, library=library, error=error)
565
944
    def __init__(self, format):
566
945
        BzrNewError.__init__(self)
567
946
        self.format = format
 
947
 
 
948
 
 
949
class NoDiff(BzrNewError):
 
950
    """Diff is not installed on this machine: %(msg)s"""
 
951
 
 
952
    def __init__(self, msg):
 
953
        BzrNewError.__init__(self, msg=msg)
 
954
 
 
955
 
 
956
class NoDiff3(BzrNewError):
 
957
    """Diff3 is not installed on this machine."""
 
958
 
 
959
 
 
960
class ExistingLimbo(BzrNewError):
 
961
    """This tree contains left-over files from a failed operation.
 
962
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
963
    keep, and delete it when you are done.
 
964
    """
 
965
    def __init__(self, limbo_dir):
 
966
       BzrNewError.__init__(self)
 
967
       self.limbo_dir = limbo_dir
 
968
 
 
969
 
 
970
class ImmortalLimbo(BzrNewError):
 
971
    """Unable to delete transform temporary directory $(limbo_dir)s.
 
972
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
973
    keep, and delete it when you are done.
 
974
    """
 
975
    def __init__(self, limbo_dir):
 
976
       BzrNewError.__init__(self)
 
977
       self.limbo_dir = limbo_dir
 
978
 
 
979
 
 
980
class OutOfDateTree(BzrNewError):
 
981
    """Working tree is out of date, please run 'bzr update'."""
 
982
 
 
983
    def __init__(self, tree):
 
984
        BzrNewError.__init__(self)
 
985
        self.tree = tree
 
986
 
 
987
 
 
988
class MergeModifiedFormatError(BzrNewError):
 
989
    """Error in merge modified format"""
 
990
 
 
991
 
 
992
class ConflictFormatError(BzrNewError):
 
993
    """Format error in conflict listings"""
 
994
 
 
995
 
 
996
class CorruptRepository(BzrNewError):
 
997
    """An error has been detected in the repository %(repo_path)s.
 
998
Please run bzr reconcile on this repository."""
 
999
 
 
1000
    def __init__(self, repo):
 
1001
        BzrNewError.__init__(self)
 
1002
        self.repo_path = repo.bzrdir.root_transport.base
 
1003
 
 
1004
 
 
1005
class UpgradeRequired(BzrNewError):
 
1006
    """To use this feature you must upgrade your branch at %(path)s."""
 
1007
 
 
1008
    def __init__(self, path):
 
1009
        BzrNewError.__init__(self)
 
1010
        self.path = path
 
1011
 
 
1012
 
 
1013
class LocalRequiresBoundBranch(BzrNewError):
 
1014
    """Cannot perform local-only commits on unbound branches."""
 
1015
 
 
1016
 
 
1017
class MissingProgressBarFinish(BzrNewError):
 
1018
    """A nested progress bar was not 'finished' correctly."""
 
1019
 
 
1020
 
 
1021
class InvalidProgressBarType(BzrNewError):
 
1022
    """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
 
1023
Select one of: %(valid_types)s"""
 
1024
 
 
1025
    def __init__(self, bar_type, valid_types):
 
1026
        BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
1027
 
 
1028
 
 
1029
class UnsupportedOperation(BzrNewError):
 
1030
    """The method %(mname)s is not supported on objects of type %(tname)s."""
 
1031
    def __init__(self, method, method_self):
 
1032
        self.method = method
 
1033
        self.mname = method.__name__
 
1034
        self.tname = type(method_self).__name__
 
1035
 
 
1036
 
 
1037
class BinaryFile(BzrNewError):
 
1038
    """File is binary but should be text."""
 
1039
 
 
1040
 
 
1041
class IllegalPath(BzrNewError):
 
1042
    """The path %(path)s is not permitted on this platform"""
 
1043
 
 
1044
    def __init__(self, path):
 
1045
        BzrNewError.__init__(self)
 
1046
        self.path = path
 
1047
 
 
1048
 
 
1049
class TestamentMismatch(BzrNewError):
 
1050
    """Testament did not match expected value.  
 
1051
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured 
 
1052
       {%(measured)s}
 
1053
    """
 
1054
    def __init__(self, revision_id, expected, measured):
 
1055
        self.revision_id = revision_id
 
1056
        self.expected = expected
 
1057
        self.measured = measured
 
1058
 
 
1059
 
 
1060
class NotABundle(BzrNewError):
 
1061
    """Not a bzr revision-bundle: %(text)r"""
 
1062
 
 
1063
    def __init__(self, text):
 
1064
        BzrNewError.__init__(self)
 
1065
        self.text = text
 
1066
 
 
1067
 
 
1068
class BadBundle(BzrNewError): 
 
1069
    """Bad bzr revision-bundle: %(text)r"""
 
1070
 
 
1071
    def __init__(self, text):
 
1072
        BzrNewError.__init__(self)
 
1073
        self.text = text
 
1074
 
 
1075
 
 
1076
class MalformedHeader(BadBundle): 
 
1077
    """Malformed bzr revision-bundle header: %(text)r"""
 
1078
 
 
1079
    def __init__(self, text):
 
1080
        BzrNewError.__init__(self)
 
1081
        self.text = text
 
1082
 
 
1083
 
 
1084
class MalformedPatches(BadBundle): 
 
1085
    """Malformed patches in bzr revision-bundle: %(text)r"""
 
1086
 
 
1087
    def __init__(self, text):
 
1088
        BzrNewError.__init__(self)
 
1089
        self.text = text
 
1090
 
 
1091
 
 
1092
class MalformedFooter(BadBundle): 
 
1093
    """Malformed footer in bzr revision-bundle: %(text)r"""
 
1094
 
 
1095
    def __init__(self, text):
 
1096
        BzrNewError.__init__(self)
 
1097
        self.text = text
 
1098
 
 
1099
class UnsupportedEOLMarker(BadBundle):
 
1100
    """End of line marker was not \\n in bzr revision-bundle"""    
 
1101
 
 
1102
    def __init__(self):
 
1103
        BzrNewError.__init__(self)