/brz/remove-bazaar

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

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Robert Collins
  • Date: 2006-09-15 22:46:02 UTC
  • mto: (2017.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 2018.
  • Revision ID: robertc@robertcollins.net-20060915224602-3b939c8c84018c0d
Update to the TreeBuilder tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006 Canonical
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""Exceptions for bzr, and reporting of them.
 
18
 
 
19
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
Exceptions are caught at a high level to report errors to the user, and
 
32
might also be caught inside the program.  Therefore it needs to be
 
33
possible to convert them to a meaningful string, and also for them to be
 
34
interrogated by the program.
 
35
 
 
36
Exceptions are defined such that the arguments given to the constructor
 
37
are stored in the object as properties of the same name.  When the
 
38
object is printed as a string, the doc string of the class is used as
 
39
a format string with the property dictionary available to it.
 
40
 
 
41
This means that exceptions can used like this:
 
42
 
 
43
>>> import sys
 
44
>>> try:
 
45
...   raise NotBranchError(path='/foo/bar')
 
46
... except:
 
47
...   print sys.exc_type
 
48
...   print sys.exc_value
 
49
...   path = getattr(sys.exc_value, 'path', None)
 
50
...   if path is not None:
 
51
...     print path
 
52
bzrlib.errors.NotBranchError
 
53
Not a branch: /foo/bar
 
54
/foo/bar
 
55
 
 
56
Therefore:
 
57
 
 
58
 * 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.
 
67
"""
 
68
 
 
69
from warnings import warn
 
70
 
 
71
from bzrlib.patches import (PatchSyntax, 
 
72
                            PatchConflict, 
 
73
                            MalformedPatchHeader,
 
74
                            MalformedHunkHeader,
 
75
                            MalformedLine,)
 
76
 
 
77
 
 
78
# based on Scott James Remnant's hct error classes
 
79
 
 
80
# TODO: is there any value in providing the .args field used by standard
 
81
# python exceptions?   A list of values with no names seems less useful 
 
82
# to me.
 
83
 
 
84
# TODO: Perhaps convert the exception to a string at the moment it's 
 
85
# constructed to make sure it will succeed.  But that says nothing about
 
86
# exceptions that are never raised.
 
87
 
 
88
# TODO: Convert all the other error classes here to BzrNewError, and eliminate
 
89
# the old one.
 
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
 
 
95
 
 
96
class BzrError(StandardError):
 
97
    
 
98
    is_user_error = True
 
99
    
 
100
    def __str__(self):
 
101
        # XXX: Should we show the exception class in 
 
102
        # exceptions that don't provide their own message?  
 
103
        # maybe it should be done at a higher level
 
104
        ## n = self.__class__.__name__ + ': '
 
105
        n = ''
 
106
        if len(self.args) == 1:
 
107
            return str(self.args[0])
 
108
        elif len(self.args) == 2:
 
109
            # further explanation or suggestions
 
110
            try:
 
111
                return n + '\n  '.join([self.args[0]] + self.args[1])
 
112
            except TypeError:
 
113
                return n + "%r" % self
 
114
        else:
 
115
            return n + `self.args`
 
116
 
 
117
 
 
118
class BzrNewError(BzrError):
 
119
    """bzr error"""
 
120
    # base classes should override the docstring with their human-
 
121
    # readable explanation
 
122
 
 
123
    def __init__(self, **kwds):
 
124
        for key, value in kwds.items():
 
125
            setattr(self, key, value)
 
126
 
 
127
    def __str__(self):
 
128
        try:
 
129
            # __str__() should always return a 'str' object
 
130
            # never a 'unicode' object.
 
131
            s = self.__doc__ % self.__dict__
 
132
            if isinstance(s, unicode):
 
133
                return s.encode('utf8')
 
134
            return s
 
135
        except (TypeError, NameError, ValueError, KeyError), e:
 
136
            return 'Unprintable exception %s(%r): %s' \
 
137
                % (self.__class__.__name__,
 
138
                   self.__dict__, str(e))
 
139
 
 
140
 
 
141
class AlreadyBuilding(BzrNewError):
 
142
    """The tree builder is already building a tree."""
 
143
 
 
144
 
 
145
class BzrCheckError(BzrNewError):
 
146
    """Internal check failed: %(message)s"""
 
147
 
 
148
    is_user_error = False
 
149
 
 
150
    def __init__(self, message):
 
151
        BzrNewError.__init__(self)
 
152
        self.message = message
 
153
 
 
154
 
 
155
class InvalidEntryName(BzrNewError):
 
156
    """Invalid entry name: %(name)s"""
 
157
 
 
158
    is_user_error = False
 
159
 
 
160
    def __init__(self, name):
 
161
        BzrNewError.__init__(self)
 
162
        self.name = name
 
163
 
 
164
 
 
165
class InvalidRevisionNumber(BzrNewError):
 
166
    """Invalid revision number %(revno)d"""
 
167
    def __init__(self, revno):
 
168
        BzrNewError.__init__(self)
 
169
        self.revno = revno
 
170
 
 
171
 
 
172
class InvalidRevisionId(BzrNewError):
 
173
    """Invalid revision-id {%(revision_id)s} in %(branch)s"""
 
174
 
 
175
    def __init__(self, revision_id, branch):
 
176
        # branch can be any string or object with __str__ defined
 
177
        BzrNewError.__init__(self)
 
178
        self.revision_id = revision_id
 
179
        self.branch = branch
 
180
 
 
181
 
 
182
class NoSuchId(BzrNewError):
 
183
    """The file id %(file_id)s is not present in the tree %(tree)s."""
 
184
    
 
185
    def __init__(self, tree, file_id):
 
186
        BzrNewError.__init__(self)
 
187
        self.file_id = file_id
 
188
        self.tree = tree
 
189
 
 
190
 
 
191
class NoWorkingTree(BzrNewError):
 
192
    """No WorkingTree exists for %(base)s."""
 
193
    
 
194
    def __init__(self, base):
 
195
        BzrNewError.__init__(self)
 
196
        self.base = base
 
197
 
 
198
 
 
199
class NotBuilding(BzrNewError):
 
200
    """Not currently building a tree."""
 
201
 
 
202
 
 
203
class NotLocalUrl(BzrNewError):
 
204
    """%(url)s is not a local path."""
 
205
    
 
206
    def __init__(self, url):
 
207
        BzrNewError.__init__(self)
 
208
        self.url = url
 
209
 
 
210
 
 
211
class BzrCommandError(BzrNewError):
 
212
    """Error from user command"""
 
213
 
 
214
    is_user_error = True
 
215
 
 
216
    # Error from malformed user command; please avoid raising this as a
 
217
    # generic exception not caused by user input.
 
218
    #
 
219
    # I think it's a waste of effort to differentiate between errors that
 
220
    # are not intended to be caught anyway.  UI code need not subclass
 
221
    # BzrCommandError, and non-UI code should not throw a subclass of
 
222
    # BzrCommandError.  ADHB 20051211
 
223
    def __init__(self, msg):
 
224
        # Object.__str__() must return a real string
 
225
        # returning a Unicode string is a python error.
 
226
        if isinstance(msg, unicode):
 
227
            self.msg = msg.encode('utf8')
 
228
        else:
 
229
            self.msg = msg
 
230
 
 
231
    def __str__(self):
 
232
        return self.msg
 
233
 
 
234
 
 
235
class BzrOptionError(BzrCommandError):
 
236
    """Error in command line options"""
 
237
 
 
238
    
 
239
class StrictCommitFailed(BzrNewError):
 
240
    """Commit refused because there are unknown files in the tree"""
 
241
 
 
242
 
 
243
# XXX: Should be unified with TransportError; they seem to represent the
 
244
# same thing
 
245
class PathError(BzrNewError):
 
246
    """Generic path error: %(path)r%(extra)s)"""
 
247
 
 
248
    def __init__(self, path, extra=None):
 
249
        BzrNewError.__init__(self)
 
250
        self.path = path
 
251
        if extra:
 
252
            self.extra = ': ' + str(extra)
 
253
        else:
 
254
            self.extra = ''
 
255
 
 
256
 
 
257
class NoSuchFile(PathError):
 
258
    """No such file: %(path)r%(extra)s"""
 
259
 
 
260
 
 
261
class FileExists(PathError):
 
262
    """File exists: %(path)r%(extra)s"""
 
263
 
 
264
 
 
265
class DirectoryNotEmpty(PathError):
 
266
    """Directory not empty: %(path)r%(extra)s"""
 
267
 
 
268
 
 
269
class ResourceBusy(PathError):
 
270
    """Device or resource busy: %(path)r%(extra)s"""
 
271
 
 
272
 
 
273
class PermissionDenied(PathError):
 
274
    """Permission denied: %(path)r%(extra)s"""
 
275
 
 
276
 
 
277
class InvalidURL(PathError):
 
278
    """Invalid url supplied to transport: %(path)r%(extra)s"""
 
279
 
 
280
 
 
281
class InvalidURLJoin(PathError):
 
282
    """Invalid URL join request: %(args)s%(extra)s"""
 
283
 
 
284
    def __init__(self, msg, base, args):
 
285
        PathError.__init__(self, base, msg)
 
286
        self.args = [base]
 
287
        self.args.extend(args)
 
288
 
 
289
 
 
290
class UnsupportedProtocol(PathError):
 
291
    """Unsupported protocol for url "%(path)s"%(extra)s"""
 
292
 
 
293
    def __init__(self, url, extra):
 
294
        PathError.__init__(self, url, extra=extra)
 
295
 
 
296
 
 
297
class PathNotChild(BzrNewError):
 
298
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
 
299
 
 
300
    is_user_error = False
 
301
 
 
302
    def __init__(self, path, base, extra=None):
 
303
        BzrNewError.__init__(self)
 
304
        self.path = path
 
305
        self.base = base
 
306
        if extra:
 
307
            self.extra = ': ' + str(extra)
 
308
        else:
 
309
            self.extra = ''
 
310
 
 
311
 
 
312
class InvalidNormalization(PathError):
 
313
    """Path %(path)r is not unicode normalized"""
 
314
 
 
315
 
 
316
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
317
# the exception object is a bit undesirable.
 
318
# TODO: Probably this behavior of should be a common superclass 
 
319
class NotBranchError(PathError):
 
320
    """Not a branch: %(path)s"""
 
321
 
 
322
    def __init__(self, path):
 
323
       import bzrlib.urlutils as urlutils
 
324
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
325
 
 
326
 
 
327
class AlreadyBranchError(PathError):
 
328
    """Already a branch: %(path)s."""
 
329
 
 
330
 
 
331
class BranchExistsWithoutWorkingTree(PathError):
 
332
    """Directory contains a branch, but no working tree \
 
333
(use bzr checkout if you wish to build a working tree): %(path)s"""
 
334
 
 
335
 
 
336
class AtomicFileAlreadyClosed(PathError):
 
337
    """'%(function)s' called on an AtomicFile after it was closed: %(path)s"""
 
338
 
 
339
    def __init__(self, path, function):
 
340
        PathError.__init__(self, path=path, extra=None)
 
341
        self.function = function
 
342
 
 
343
 
 
344
class InaccessibleParent(PathError):
 
345
    """Parent not accessible given base %(base)s and relative path %(path)s"""
 
346
 
 
347
    def __init__(self, path, base):
 
348
        PathError.__init__(self, path)
 
349
        self.base = base
 
350
 
 
351
 
 
352
class NoRepositoryPresent(BzrNewError):
 
353
    """No repository present: %(path)r"""
 
354
    def __init__(self, bzrdir):
 
355
        BzrNewError.__init__(self)
 
356
        self.path = bzrdir.transport.clone('..').base
 
357
 
 
358
 
 
359
class FileInWrongBranch(BzrNewError):
 
360
    """File %(path)s in not in branch %(branch_base)s."""
 
361
 
 
362
    def __init__(self, branch, path):
 
363
        BzrNewError.__init__(self)
 
364
        self.branch = branch
 
365
        self.branch_base = branch.base
 
366
        self.path = path
 
367
 
 
368
 
 
369
class UnsupportedFormatError(BzrNewError):
 
370
    """Unsupported branch format: %(format)s"""
 
371
 
 
372
 
 
373
class UnknownFormatError(BzrNewError):
 
374
    """Unknown branch format: %(format)r"""
 
375
 
 
376
 
 
377
class IncompatibleFormat(BzrNewError):
 
378
    """Format %(format)s is not compatible with .bzr version %(bzrdir)s."""
 
379
 
 
380
    def __init__(self, format, bzrdir_format):
 
381
        BzrNewError.__init__(self)
 
382
        self.format = format
 
383
        self.bzrdir = bzrdir_format
 
384
 
 
385
 
 
386
class NotVersionedError(BzrNewError):
 
387
    """%(path)s is not versioned"""
 
388
    def __init__(self, path):
 
389
        BzrNewError.__init__(self)
 
390
        self.path = path
 
391
 
 
392
 
 
393
class PathsNotVersionedError(BzrNewError):
 
394
    # used when reporting several paths are not versioned
 
395
    """Path(s) are not versioned: %(paths_as_string)s"""
 
396
 
 
397
    def __init__(self, paths):
 
398
        from bzrlib.osutils import quotefn
 
399
        BzrNewError.__init__(self)
 
400
        self.paths = paths
 
401
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
402
 
 
403
 
 
404
class PathsDoNotExist(BzrNewError):
 
405
    """Path(s) do not exist: %(paths_as_string)s"""
 
406
 
 
407
    # used when reporting that paths are neither versioned nor in the working
 
408
    # tree
 
409
 
 
410
    def __init__(self, paths):
 
411
        # circular import
 
412
        from bzrlib.osutils import quotefn
 
413
        BzrNewError.__init__(self)
 
414
        self.paths = paths
 
415
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
416
 
 
417
 
 
418
class BadFileKindError(BzrNewError):
 
419
    """Cannot operate on %(filename)s of unsupported kind %(kind)s"""
 
420
 
 
421
 
 
422
class ForbiddenControlFileError(BzrNewError):
 
423
    """Cannot operate on %(filename)s because it is a control file"""
 
424
 
 
425
 
 
426
class LockError(BzrNewError):
 
427
    """Lock error: %(message)s"""
 
428
    # All exceptions from the lock/unlock functions should be from
 
429
    # this exception class.  They will be translated as necessary. The
 
430
    # original exception is available as e.original_error
 
431
    #
 
432
    # New code should prefer to raise specific subclasses
 
433
    def __init__(self, message):
 
434
        self.message = message
 
435
 
 
436
 
 
437
class CommitNotPossible(LockError):
 
438
    """A commit was attempted but we do not have a write lock open."""
 
439
    def __init__(self):
 
440
        pass
 
441
 
 
442
 
 
443
class AlreadyCommitted(LockError):
 
444
    """A rollback was requested, but is not able to be accomplished."""
 
445
    def __init__(self):
 
446
        pass
 
447
 
 
448
 
 
449
class ReadOnlyError(LockError):
 
450
    """A write attempt was made in a read only transaction on %(obj)s"""
 
451
    def __init__(self, obj):
 
452
        self.obj = obj
 
453
 
 
454
 
 
455
class OutSideTransaction(BzrNewError):
 
456
    """A transaction related operation was attempted after the transaction finished."""
 
457
 
 
458
 
 
459
class ObjectNotLocked(LockError):
 
460
    """%(obj)r is not locked"""
 
461
 
 
462
    is_user_error = False
 
463
 
 
464
    # this can indicate that any particular object is not locked; see also
 
465
    # LockNotHeld which means that a particular *lock* object is not held by
 
466
    # the caller -- perhaps they should be unified.
 
467
    def __init__(self, obj):
 
468
        self.obj = obj
 
469
 
 
470
 
 
471
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
472
    """Cannot change object %(obj)r in read only transaction"""
 
473
    def __init__(self, obj):
 
474
        self.obj = obj
 
475
 
 
476
 
 
477
class UnlockableTransport(LockError):
 
478
    """Cannot lock: transport is read only: %(transport)s"""
 
479
    def __init__(self, transport):
 
480
        self.transport = transport
 
481
 
 
482
 
 
483
class LockContention(LockError):
 
484
    """Could not acquire lock %(lock)s"""
 
485
    # TODO: show full url for lock, combining the transport and relative bits?
 
486
    def __init__(self, lock):
 
487
        self.lock = lock
 
488
 
 
489
 
 
490
class LockBroken(LockError):
 
491
    """Lock was broken while still open: %(lock)s - check storage consistency!"""
 
492
    def __init__(self, lock):
 
493
        self.lock = lock
 
494
 
 
495
 
 
496
class LockBreakMismatch(LockError):
 
497
    """Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
 
498
    def __init__(self, lock, holder, target):
 
499
        self.lock = lock
 
500
        self.holder = holder
 
501
        self.target = target
 
502
 
 
503
 
 
504
class LockNotHeld(LockError):
 
505
    """Lock not held: %(lock)s"""
 
506
    def __init__(self, lock):
 
507
        self.lock = lock
 
508
 
 
509
 
 
510
class PointlessCommit(BzrNewError):
 
511
    """No changes to commit"""
 
512
 
 
513
 
 
514
class UpgradeReadonly(BzrNewError):
 
515
    """Upgrade URL cannot work with readonly URL's."""
 
516
 
 
517
 
 
518
class UpToDateFormat(BzrNewError):
 
519
    """The branch format %(format)s is already at the most recent format."""
 
520
 
 
521
    def __init__(self, format):
 
522
        BzrNewError.__init__(self)
 
523
        self.format = format
 
524
 
 
525
 
 
526
class StrictCommitFailed(Exception):
 
527
    """Commit refused because there are unknowns in the tree."""
 
528
 
 
529
 
 
530
class NoSuchRevision(BzrNewError):
 
531
    """Branch %(branch)s has no revision %(revision)s"""
 
532
 
 
533
    is_user_error = False
 
534
 
 
535
    def __init__(self, branch, revision):
 
536
        BzrNewError.__init__(self, branch=branch, revision=revision)
 
537
 
 
538
 
 
539
class NoSuchRevisionSpec(BzrNewError):
 
540
    """No namespace registered for string: %(spec)r"""
 
541
 
 
542
    def __init__(self, spec):
 
543
        BzrNewError.__init__(self, spec=spec)
 
544
 
 
545
 
 
546
class InvalidRevisionSpec(BzrNewError):
 
547
    """Requested revision: '%(spec)s' does not exist in branch:
 
548
%(branch)s%(extra)s"""
 
549
 
 
550
    def __init__(self, spec, branch, extra=None):
 
551
        BzrNewError.__init__(self, branch=branch, spec=spec)
 
552
        if extra:
 
553
            self.extra = '\n' + str(extra)
 
554
        else:
 
555
            self.extra = ''
 
556
 
 
557
 
 
558
class HistoryMissing(BzrError):
 
559
    def __init__(self, branch, object_type, object_id):
 
560
        self.branch = branch
 
561
        BzrError.__init__(self,
 
562
                          '%s is missing %s {%s}'
 
563
                          % (branch, object_type, object_id))
 
564
 
 
565
 
 
566
class DivergedBranches(BzrNewError):
 
567
    "These branches have diverged.  Use the merge command to reconcile them."""
 
568
 
 
569
    is_user_error = True
 
570
 
 
571
    def __init__(self, branch1, branch2):
 
572
        self.branch1 = branch1
 
573
        self.branch2 = branch2
 
574
 
 
575
 
 
576
class UnrelatedBranches(BzrNewError):
 
577
    "Branches have no common ancestor, and no merge base revision was specified."
 
578
 
 
579
    is_user_error = True
 
580
 
 
581
 
 
582
class NoCommonAncestor(BzrNewError):
 
583
    "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
584
 
 
585
    def __init__(self, revision_a, revision_b):
 
586
        self.revision_a = revision_a
 
587
        self.revision_b = revision_b
 
588
 
 
589
 
 
590
class NoCommonRoot(BzrError):
 
591
    def __init__(self, revision_a, revision_b):
 
592
        msg = "Revisions are not derived from the same root: %s %s." \
 
593
            % (revision_a, revision_b) 
 
594
        BzrError.__init__(self, msg)
 
595
 
 
596
 
 
597
 
 
598
class NotAncestor(BzrError):
 
599
    def __init__(self, rev_id, not_ancestor_id):
 
600
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
 
601
                                                        rev_id)
 
602
        BzrError.__init__(self, msg)
 
603
        self.rev_id = rev_id
 
604
        self.not_ancestor_id = not_ancestor_id
 
605
 
 
606
 
 
607
class InstallFailed(BzrError):
 
608
    def __init__(self, revisions):
 
609
        msg = "Could not install revisions:\n%s" % " ,".join(revisions)
 
610
        BzrError.__init__(self, msg)
 
611
        self.revisions = revisions
 
612
 
 
613
 
 
614
class AmbiguousBase(BzrError):
 
615
    def __init__(self, bases):
 
616
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
617
                DeprecationWarning)
 
618
        msg = "The correct base is unclear, because %s are all equally close" %\
 
619
            ", ".join(bases)
 
620
        BzrError.__init__(self, msg)
 
621
        self.bases = bases
 
622
 
 
623
 
 
624
class NoCommits(BzrNewError):
 
625
    """Branch %(branch)s has no commits."""
 
626
 
 
627
    def __init__(self, branch):
 
628
        BzrNewError.__init__(self, branch=branch)
 
629
 
 
630
 
 
631
class UnlistableStore(BzrError):
 
632
    def __init__(self, store):
 
633
        BzrError.__init__(self, "Store %s is not listable" % store)
 
634
 
 
635
 
 
636
 
 
637
class UnlistableBranch(BzrError):
 
638
    def __init__(self, br):
 
639
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
640
 
 
641
 
 
642
class BoundBranchOutOfDate(BzrNewError):
 
643
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
 
644
    def __init__(self, branch, master):
 
645
        BzrNewError.__init__(self)
 
646
        self.branch = branch
 
647
        self.master = master
 
648
 
 
649
        
 
650
class CommitToDoubleBoundBranch(BzrNewError):
 
651
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
 
652
    def __init__(self, branch, master, remote):
 
653
        BzrNewError.__init__(self)
 
654
        self.branch = branch
 
655
        self.master = master
 
656
        self.remote = remote
 
657
 
 
658
 
 
659
class OverwriteBoundBranch(BzrNewError):
 
660
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
 
661
    def __init__(self, branch):
 
662
        BzrNewError.__init__(self)
 
663
        self.branch = branch
 
664
 
 
665
 
 
666
class BoundBranchConnectionFailure(BzrNewError):
 
667
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
 
668
    def __init__(self, branch, target, error):
 
669
        BzrNewError.__init__(self)
 
670
        self.branch = branch
 
671
        self.target = target
 
672
        self.error = error
 
673
 
 
674
 
 
675
class WeaveError(BzrNewError):
 
676
    """Error in processing weave: %(message)s"""
 
677
 
 
678
    def __init__(self, message=None):
 
679
        BzrNewError.__init__(self)
 
680
        self.message = message
 
681
 
 
682
 
 
683
class WeaveRevisionAlreadyPresent(WeaveError):
 
684
    """Revision {%(revision_id)s} already present in %(weave)s"""
 
685
    def __init__(self, revision_id, weave):
 
686
 
 
687
        WeaveError.__init__(self)
 
688
        self.revision_id = revision_id
 
689
        self.weave = weave
 
690
 
 
691
 
 
692
class WeaveRevisionNotPresent(WeaveError):
 
693
    """Revision {%(revision_id)s} not present in %(weave)s"""
 
694
 
 
695
    def __init__(self, revision_id, weave):
 
696
        WeaveError.__init__(self)
 
697
        self.revision_id = revision_id
 
698
        self.weave = weave
 
699
 
 
700
 
 
701
class WeaveFormatError(WeaveError):
 
702
    """Weave invariant violated: %(what)s"""
 
703
 
 
704
    def __init__(self, what):
 
705
        WeaveError.__init__(self)
 
706
        self.what = what
 
707
 
 
708
 
 
709
class WeaveParentMismatch(WeaveError):
 
710
    """Parents are mismatched between two revisions."""
 
711
    
 
712
 
 
713
class WeaveInvalidChecksum(WeaveError):
 
714
    """Text did not match it's checksum: %(message)s"""
 
715
 
 
716
 
 
717
class WeaveTextDiffers(WeaveError):
 
718
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
719
 
 
720
    def __init__(self, revision_id, weave_a, weave_b):
 
721
        WeaveError.__init__(self)
 
722
        self.revision_id = revision_id
 
723
        self.weave_a = weave_a
 
724
        self.weave_b = weave_b
 
725
 
 
726
 
 
727
class WeaveTextDiffers(WeaveError):
 
728
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
729
 
 
730
    def __init__(self, revision_id, weave_a, weave_b):
 
731
        WeaveError.__init__(self)
 
732
        self.revision_id = revision_id
 
733
        self.weave_a = weave_a
 
734
        self.weave_b = weave_b
 
735
 
 
736
 
 
737
class VersionedFileError(BzrNewError):
 
738
    """Versioned file error."""
 
739
 
 
740
 
 
741
class RevisionNotPresent(VersionedFileError):
 
742
    """Revision {%(revision_id)s} not present in %(file_id)s."""
 
743
 
 
744
    def __init__(self, revision_id, file_id):
 
745
        VersionedFileError.__init__(self)
 
746
        self.revision_id = revision_id
 
747
        self.file_id = file_id
 
748
 
 
749
 
 
750
class RevisionAlreadyPresent(VersionedFileError):
 
751
    """Revision {%(revision_id)s} already present in %(file_id)s."""
 
752
 
 
753
    def __init__(self, revision_id, file_id):
 
754
        VersionedFileError.__init__(self)
 
755
        self.revision_id = revision_id
 
756
        self.file_id = file_id
 
757
 
 
758
 
 
759
class KnitError(BzrNewError):
 
760
    """Knit error"""
 
761
 
 
762
 
 
763
class KnitHeaderError(KnitError):
 
764
    """Knit header error: %(badline)r unexpected"""
 
765
 
 
766
    def __init__(self, badline):
 
767
        KnitError.__init__(self)
 
768
        self.badline = badline
 
769
 
 
770
 
 
771
class KnitCorrupt(KnitError):
 
772
    """Knit %(filename)s corrupt: %(how)s"""
 
773
 
 
774
    def __init__(self, filename, how):
 
775
        KnitError.__init__(self)
 
776
        self.filename = filename
 
777
        self.how = how
 
778
 
 
779
 
 
780
class NoSuchExportFormat(BzrNewError):
 
781
    """Export format %(format)r not supported"""
 
782
    def __init__(self, format):
 
783
        BzrNewError.__init__(self)
 
784
        self.format = format
 
785
 
 
786
 
 
787
class TransportError(BzrNewError):
 
788
    """Transport error: %(msg)s %(orig_error)s"""
 
789
 
 
790
    def __init__(self, msg=None, orig_error=None):
 
791
        if msg is None and orig_error is not None:
 
792
            msg = str(orig_error)
 
793
        if orig_error is None:
 
794
            orig_error = ''
 
795
        if msg is None:
 
796
            msg =  ''
 
797
        self.msg = msg
 
798
        self.orig_error = orig_error
 
799
        BzrNewError.__init__(self)
 
800
 
 
801
 
 
802
# A set of semi-meaningful errors which can be thrown
 
803
class TransportNotPossible(TransportError):
 
804
    """Transport operation not possible: %(msg)s %(orig_error)%"""
 
805
 
 
806
 
 
807
class ConnectionError(TransportError):
 
808
    """Connection error: %(msg)s %(orig_error)s"""
 
809
 
 
810
 
 
811
class ConnectionReset(TransportError):
 
812
    """Connection closed: %(msg)s %(orig_error)s"""
 
813
 
 
814
 
 
815
class InvalidRange(TransportError):
 
816
    """Invalid range access in %(path)s at %(offset)s."""
 
817
    
 
818
    def __init__(self, path, offset):
 
819
        TransportError.__init__(self, ("Invalid range access in %s at %d"
 
820
                                       % (path, offset)))
 
821
        self.path = path
 
822
        self.offset = offset
 
823
 
 
824
 
 
825
class InvalidHttpResponse(TransportError):
 
826
    """Invalid http response for %(path)s: %(msg)s"""
 
827
 
 
828
    def __init__(self, path, msg, orig_error=None):
 
829
        self.path = path
 
830
        TransportError.__init__(self, msg, orig_error=orig_error)
 
831
 
 
832
 
 
833
class InvalidHttpRange(InvalidHttpResponse):
 
834
    """Invalid http range "%(range)s" for %(path)s: %(msg)s"""
 
835
    
 
836
    def __init__(self, path, range, msg):
 
837
        self.range = range
 
838
        InvalidHttpResponse.__init__(self, path, msg)
 
839
 
 
840
 
 
841
class InvalidHttpContentType(InvalidHttpResponse):
 
842
    """Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s"""
 
843
    
 
844
    def __init__(self, path, ctype, msg):
 
845
        self.ctype = ctype
 
846
        InvalidHttpResponse.__init__(self, path, msg)
 
847
 
 
848
 
 
849
class ConflictsInTree(BzrError):
 
850
    def __init__(self):
 
851
        BzrError.__init__(self, "Working tree has conflicts.")
 
852
 
 
853
 
 
854
class ParseConfigError(BzrError):
 
855
    def __init__(self, errors, filename):
 
856
        if filename is None:
 
857
            filename = ""
 
858
        message = "Error(s) parsing config file %s:\n%s" % \
 
859
            (filename, ('\n'.join(e.message for e in errors)))
 
860
        BzrError.__init__(self, message)
 
861
 
 
862
 
 
863
class SigningFailed(BzrError):
 
864
    def __init__(self, command_line):
 
865
        BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
 
866
                               % command_line)
 
867
 
 
868
 
 
869
class WorkingTreeNotRevision(BzrError):
 
870
    def __init__(self, tree):
 
871
        BzrError.__init__(self, "The working tree for %s has changed since"
 
872
                          " last commit, but weave merge requires that it be"
 
873
                          " unchanged." % tree.basedir)
 
874
 
 
875
 
 
876
class CantReprocessAndShowBase(BzrNewError):
 
877
    """Can't reprocess and show base.
 
878
Reprocessing obscures relationship of conflicting lines to base."""
 
879
 
 
880
 
 
881
class GraphCycleError(BzrNewError):
 
882
    """Cycle in graph %(graph)r"""
 
883
    def __init__(self, graph):
 
884
        BzrNewError.__init__(self)
 
885
        self.graph = graph
 
886
 
 
887
 
 
888
class NotConflicted(BzrNewError):
 
889
    """File %(filename)s is not conflicted."""
 
890
 
 
891
    def __init__(self, filename):
 
892
        BzrNewError.__init__(self)
 
893
        self.filename = filename
 
894
 
 
895
 
 
896
class MustUseDecorated(Exception):
 
897
    """A decorating function has requested its original command be used.
 
898
    
 
899
    This should never escape bzr, so does not need to be printable.
 
900
    """
 
901
 
 
902
 
 
903
class NoBundleFound(BzrNewError):
 
904
    """No bundle was found in %(filename)s"""
 
905
    def __init__(self, filename):
 
906
        BzrNewError.__init__(self)
 
907
        self.filename = filename
 
908
 
 
909
 
 
910
class BundleNotSupported(BzrNewError):
 
911
    """Unable to handle bundle version %(version)s: %(msg)s"""
 
912
    def __init__(self, version, msg):
 
913
        BzrNewError.__init__(self)
 
914
        self.version = version
 
915
        self.msg = msg
 
916
 
 
917
 
 
918
class MissingText(BzrNewError):
 
919
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
 
920
 
 
921
    def __init__(self, branch, text_revision, file_id):
 
922
        BzrNewError.__init__(self)
 
923
        self.branch = branch
 
924
        self.base = branch.base
 
925
        self.text_revision = text_revision
 
926
        self.file_id = file_id
 
927
 
 
928
 
 
929
class DuplicateKey(BzrNewError):
 
930
    """Key %(key)s is already present in map"""
 
931
 
 
932
 
 
933
class MalformedTransform(BzrNewError):
 
934
    """Tree transform is malformed %(conflicts)r"""
 
935
 
 
936
 
 
937
class BzrBadParameter(BzrNewError):
 
938
    """A bad parameter : %(param)s is not usable.
 
939
    
 
940
    This exception should never be thrown, but it is a base class for all
 
941
    parameter-to-function errors.
 
942
    """
 
943
    def __init__(self, param):
 
944
        BzrNewError.__init__(self)
 
945
        self.param = param
 
946
 
 
947
 
 
948
class BzrBadParameterNotUnicode(BzrBadParameter):
 
949
    """Parameter %(param)s is neither unicode nor utf8."""
 
950
 
 
951
 
 
952
class ReusingTransform(BzrNewError):
 
953
    """Attempt to reuse a transform that has already been applied."""
 
954
 
 
955
 
 
956
class CantMoveRoot(BzrNewError):
 
957
    """Moving the root directory is not supported at this time"""
 
958
 
 
959
 
 
960
class BzrBadParameterNotString(BzrBadParameter):
 
961
    """Parameter %(param)s is not a string or unicode string."""
 
962
 
 
963
 
 
964
class BzrBadParameterMissing(BzrBadParameter):
 
965
    """Parameter $(param)s is required but not present."""
 
966
 
 
967
 
 
968
class BzrBadParameterUnicode(BzrBadParameter):
 
969
    """Parameter %(param)s is unicode but only byte-strings are permitted."""
 
970
 
 
971
 
 
972
class BzrBadParameterContainsNewline(BzrBadParameter):
 
973
    """Parameter %(param)s contains a newline."""
 
974
 
 
975
 
 
976
class DependencyNotPresent(BzrNewError):
 
977
    """Unable to import library "%(library)s": %(error)s"""
 
978
 
 
979
    def __init__(self, library, error):
 
980
        BzrNewError.__init__(self, library=library, error=error)
 
981
 
 
982
 
 
983
class ParamikoNotPresent(DependencyNotPresent):
 
984
    """Unable to import paramiko (required for sftp support): %(error)s"""
 
985
 
 
986
    def __init__(self, error):
 
987
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
988
 
 
989
 
 
990
class PointlessMerge(BzrNewError):
 
991
    """Nothing to merge."""
 
992
 
 
993
 
 
994
class UninitializableFormat(BzrNewError):
 
995
    """Format %(format)s cannot be initialised by this version of bzr."""
 
996
 
 
997
    def __init__(self, format):
 
998
        BzrNewError.__init__(self)
 
999
        self.format = format
 
1000
 
 
1001
 
 
1002
class BadConversionTarget(BzrNewError):
 
1003
    """Cannot convert to format %(format)s.  %(problem)s"""
 
1004
 
 
1005
    def __init__(self, problem, format):
 
1006
        BzrNewError.__init__(self)
 
1007
        self.problem = problem
 
1008
        self.format = format
 
1009
 
 
1010
 
 
1011
class NoDiff(BzrNewError):
 
1012
    """Diff is not installed on this machine: %(msg)s"""
 
1013
 
 
1014
    def __init__(self, msg):
 
1015
        BzrNewError.__init__(self, msg=msg)
 
1016
 
 
1017
 
 
1018
class NoDiff3(BzrNewError):
 
1019
    """Diff3 is not installed on this machine."""
 
1020
 
 
1021
 
 
1022
class ExistingLimbo(BzrNewError):
 
1023
    """This tree contains left-over files from a failed operation.
 
1024
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
1025
    keep, and delete it when you are done.
 
1026
    """
 
1027
    def __init__(self, limbo_dir):
 
1028
       BzrNewError.__init__(self)
 
1029
       self.limbo_dir = limbo_dir
 
1030
 
 
1031
 
 
1032
class ImmortalLimbo(BzrNewError):
 
1033
    """Unable to delete transform temporary directory $(limbo_dir)s.
 
1034
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
1035
    keep, and delete it when you are done.
 
1036
    """
 
1037
    def __init__(self, limbo_dir):
 
1038
       BzrNewError.__init__(self)
 
1039
       self.limbo_dir = limbo_dir
 
1040
 
 
1041
 
 
1042
class OutOfDateTree(BzrNewError):
 
1043
    """Working tree is out of date, please run 'bzr update'."""
 
1044
 
 
1045
    def __init__(self, tree):
 
1046
        BzrNewError.__init__(self)
 
1047
        self.tree = tree
 
1048
 
 
1049
 
 
1050
class MergeModifiedFormatError(BzrNewError):
 
1051
    """Error in merge modified format"""
 
1052
 
 
1053
 
 
1054
class ConflictFormatError(BzrNewError):
 
1055
    """Format error in conflict listings"""
 
1056
 
 
1057
 
 
1058
class CorruptRepository(BzrNewError):
 
1059
    """An error has been detected in the repository %(repo_path)s.
 
1060
Please run bzr reconcile on this repository."""
 
1061
 
 
1062
    def __init__(self, repo):
 
1063
        BzrNewError.__init__(self)
 
1064
        self.repo_path = repo.bzrdir.root_transport.base
 
1065
 
 
1066
 
 
1067
class UpgradeRequired(BzrNewError):
 
1068
    """To use this feature you must upgrade your branch at %(path)s."""
 
1069
 
 
1070
    def __init__(self, path):
 
1071
        BzrNewError.__init__(self)
 
1072
        self.path = path
 
1073
 
 
1074
 
 
1075
class LocalRequiresBoundBranch(BzrNewError):
 
1076
    """Cannot perform local-only commits on unbound branches."""
 
1077
 
 
1078
 
 
1079
class MissingProgressBarFinish(BzrNewError):
 
1080
    """A nested progress bar was not 'finished' correctly."""
 
1081
 
 
1082
 
 
1083
class InvalidProgressBarType(BzrNewError):
 
1084
    """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
 
1085
Select one of: %(valid_types)s"""
 
1086
 
 
1087
    def __init__(self, bar_type, valid_types):
 
1088
        BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
1089
 
 
1090
 
 
1091
class UnsupportedOperation(BzrNewError):
 
1092
    """The method %(mname)s is not supported on objects of type %(tname)s."""
 
1093
    def __init__(self, method, method_self):
 
1094
        self.method = method
 
1095
        self.mname = method.__name__
 
1096
        self.tname = type(method_self).__name__
 
1097
 
 
1098
 
 
1099
class BinaryFile(BzrNewError):
 
1100
    """File is binary but should be text."""
 
1101
 
 
1102
 
 
1103
class IllegalPath(BzrNewError):
 
1104
    """The path %(path)s is not permitted on this platform"""
 
1105
 
 
1106
    def __init__(self, path):
 
1107
        BzrNewError.__init__(self)
 
1108
        self.path = path
 
1109
 
 
1110
 
 
1111
class TestamentMismatch(BzrNewError):
 
1112
    """Testament did not match expected value.  
 
1113
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured 
 
1114
       {%(measured)s}
 
1115
    """
 
1116
    def __init__(self, revision_id, expected, measured):
 
1117
        self.revision_id = revision_id
 
1118
        self.expected = expected
 
1119
        self.measured = measured
 
1120
 
 
1121
 
 
1122
class NotABundle(BzrNewError):
 
1123
    """Not a bzr revision-bundle: %(text)r"""
 
1124
 
 
1125
    def __init__(self, text):
 
1126
        BzrNewError.__init__(self)
 
1127
        self.text = text
 
1128
 
 
1129
 
 
1130
class BadBundle(BzrNewError): 
 
1131
    """Bad bzr revision-bundle: %(text)r"""
 
1132
 
 
1133
    def __init__(self, text):
 
1134
        BzrNewError.__init__(self)
 
1135
        self.text = text
 
1136
 
 
1137
 
 
1138
class MalformedHeader(BadBundle): 
 
1139
    """Malformed bzr revision-bundle header: %(text)r"""
 
1140
 
 
1141
    def __init__(self, text):
 
1142
        BzrNewError.__init__(self)
 
1143
        self.text = text
 
1144
 
 
1145
 
 
1146
class MalformedPatches(BadBundle): 
 
1147
    """Malformed patches in bzr revision-bundle: %(text)r"""
 
1148
 
 
1149
    def __init__(self, text):
 
1150
        BzrNewError.__init__(self)
 
1151
        self.text = text
 
1152
 
 
1153
 
 
1154
class MalformedFooter(BadBundle): 
 
1155
    """Malformed footer in bzr revision-bundle: %(text)r"""
 
1156
 
 
1157
    def __init__(self, text):
 
1158
        BzrNewError.__init__(self)
 
1159
        self.text = text
 
1160
 
 
1161
 
 
1162
class UnsupportedEOLMarker(BadBundle):
 
1163
    """End of line marker was not \\n in bzr revision-bundle"""    
 
1164
 
 
1165
    def __init__(self):
 
1166
        BzrNewError.__init__(self)
 
1167
 
 
1168
 
 
1169
class BadInventoryFormat(BzrNewError):
 
1170
    """Root class for inventory serialization errors"""
 
1171
 
 
1172
 
 
1173
class UnexpectedInventoryFormat(BadInventoryFormat):
 
1174
    """The inventory was not in the expected format:\n %(msg)s"""
 
1175
 
 
1176
    def __init__(self, msg):
 
1177
        BadInventoryFormat.__init__(self, msg=msg)
 
1178
 
 
1179
 
 
1180
class UnknownSSH(BzrNewError):
 
1181
    """Unrecognised value for BZR_SSH environment variable: %(vendor)s"""
 
1182
 
 
1183
    def __init__(self, vendor):
 
1184
        BzrNewError.__init__(self)
 
1185
        self.vendor = vendor
 
1186
 
 
1187
 
 
1188
class GhostRevisionUnusableHere(BzrNewError):
 
1189
    """Ghost revision {%(revision_id)s} cannot be used here."""
 
1190
 
 
1191
    def __init__(self, revision_id):
 
1192
        BzrNewError.__init__(self)
 
1193
        self.revision_id = revision_id
 
1194
 
 
1195
 
 
1196
class IllegalUseOfScopeReplacer(BzrNewError):
 
1197
    """ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"""
 
1198
 
 
1199
    is_user_error = False
 
1200
 
 
1201
    def __init__(self, name, msg, extra=None):
 
1202
        BzrNewError.__init__(self)
 
1203
        self.name = name
 
1204
        self.msg = msg
 
1205
        if extra:
 
1206
            self.extra = ': ' + str(extra)
 
1207
        else:
 
1208
            self.extra = ''
 
1209
 
 
1210
 
 
1211
class InvalidImportLine(BzrNewError):
 
1212
    """Not a valid import statement: %(msg)\n%(text)s"""
 
1213
 
 
1214
    is_user_error = False
 
1215
 
 
1216
    def __init__(self, text, msg):
 
1217
        BzrNewError.__init__(self)
 
1218
        self.text = text
 
1219
        self.msg = msg
 
1220
 
 
1221
 
 
1222
class ImportNameCollision(BzrNewError):
 
1223
    """Tried to import an object to the same name as an existing object. %(name)s"""
 
1224
 
 
1225
    is_user_error = False
 
1226
 
 
1227
    def __init__(self, name):
 
1228
        BzrNewError.__init__(self)
 
1229
        self.name = name