/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: John Arbash Meinel
  • Date: 2005-09-15 21:35:53 UTC
  • mfrom: (907.1.57)
  • mto: (1393.2.1)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: john@arbash-meinel.com-20050915213552-a6c83a5ef1e20897
(broken) Transport work is merged in. Tests do not pass yet.

Show diffs side-by-side

added added

removed removed

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