/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

(Andrew Bennetts, Robert Collins) Add test_http.RecordingServer, and use it to
test HttpTransport._post.

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 ReadingCompleted(BzrNewError):
 
270
    """The MediumRequest '%(request)s' has already had finish_reading called upon it - the request has been completed and no more data may be read."""
 
271
 
 
272
    def __init__(self, request):
 
273
        BzrNewError.__init__(self)
 
274
        self.request = request
 
275
 
 
276
 
 
277
class ResourceBusy(PathError):
 
278
    """Device or resource busy: %(path)r%(extra)s"""
 
279
 
 
280
 
 
281
class PermissionDenied(PathError):
 
282
    """Permission denied: %(path)r%(extra)s"""
 
283
 
 
284
 
 
285
class InvalidURL(PathError):
 
286
    """Invalid url supplied to transport: %(path)r%(extra)s"""
 
287
 
 
288
 
 
289
class InvalidURLJoin(PathError):
 
290
    """Invalid URL join request: %(args)s%(extra)s"""
 
291
 
 
292
    def __init__(self, msg, base, args):
 
293
        PathError.__init__(self, base, msg)
 
294
        self.args = [base]
 
295
        self.args.extend(args)
 
296
 
 
297
 
 
298
class UnsupportedProtocol(PathError):
 
299
    """Unsupported protocol for url "%(path)s"%(extra)s"""
 
300
 
 
301
    def __init__(self, url, extra):
 
302
        PathError.__init__(self, url, extra=extra)
 
303
 
 
304
 
 
305
class ShortReadvError(PathError):
 
306
    """readv() read %(actual)s bytes rather than %(length)s bytes at %(offset)s for %(path)s%(extra)s"""
 
307
 
 
308
    is_user_error = False
 
309
 
 
310
    def __init__(self, path, offset, length, actual, extra=None):
 
311
        PathError.__init__(self, path, extra=extra)
 
312
        self.offset = offset
 
313
        self.length = length
 
314
        self.actual = actual
 
315
 
 
316
 
 
317
class PathNotChild(BzrNewError):
 
318
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
 
319
 
 
320
    is_user_error = False
 
321
 
 
322
    def __init__(self, path, base, extra=None):
 
323
        BzrNewError.__init__(self)
 
324
        self.path = path
 
325
        self.base = base
 
326
        if extra:
 
327
            self.extra = ': ' + str(extra)
 
328
        else:
 
329
            self.extra = ''
 
330
 
 
331
 
 
332
class InvalidNormalization(PathError):
 
333
    """Path %(path)r is not unicode normalized"""
 
334
 
 
335
 
 
336
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
337
# the exception object is a bit undesirable.
 
338
# TODO: Probably this behavior of should be a common superclass 
 
339
class NotBranchError(PathError):
 
340
    """Not a branch: %(path)s"""
 
341
 
 
342
    def __init__(self, path):
 
343
       import bzrlib.urlutils as urlutils
 
344
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
345
 
 
346
 
 
347
class AlreadyBranchError(PathError):
 
348
    """Already a branch: %(path)s."""
 
349
 
 
350
 
 
351
class BranchExistsWithoutWorkingTree(PathError):
 
352
    """Directory contains a branch, but no working tree \
 
353
(use bzr checkout if you wish to build a working tree): %(path)s"""
 
354
 
 
355
 
 
356
class AtomicFileAlreadyClosed(PathError):
 
357
    """'%(function)s' called on an AtomicFile after it was closed: %(path)s"""
 
358
 
 
359
    def __init__(self, path, function):
 
360
        PathError.__init__(self, path=path, extra=None)
 
361
        self.function = function
 
362
 
 
363
 
 
364
class InaccessibleParent(PathError):
 
365
    """Parent not accessible given base %(base)s and relative path %(path)s"""
 
366
 
 
367
    def __init__(self, path, base):
 
368
        PathError.__init__(self, path)
 
369
        self.base = base
 
370
 
 
371
 
 
372
class NoRepositoryPresent(BzrNewError):
 
373
    """No repository present: %(path)r"""
 
374
    def __init__(self, bzrdir):
 
375
        BzrNewError.__init__(self)
 
376
        self.path = bzrdir.transport.clone('..').base
 
377
 
 
378
 
 
379
class FileInWrongBranch(BzrNewError):
 
380
    """File %(path)s in not in branch %(branch_base)s."""
 
381
 
 
382
    def __init__(self, branch, path):
 
383
        BzrNewError.__init__(self)
 
384
        self.branch = branch
 
385
        self.branch_base = branch.base
 
386
        self.path = path
 
387
 
 
388
 
 
389
class UnsupportedFormatError(BzrNewError):
 
390
    """Unsupported branch format: %(format)s"""
 
391
 
 
392
 
 
393
class UnknownFormatError(BzrNewError):
 
394
    """Unknown branch format: %(format)r"""
 
395
 
 
396
 
 
397
class IncompatibleFormat(BzrNewError):
 
398
    """Format %(format)s is not compatible with .bzr version %(bzrdir)s."""
 
399
 
 
400
    def __init__(self, format, bzrdir_format):
 
401
        BzrNewError.__init__(self)
 
402
        self.format = format
 
403
        self.bzrdir = bzrdir_format
 
404
 
 
405
 
 
406
class NotVersionedError(BzrNewError):
 
407
    """%(path)s is not versioned"""
 
408
    def __init__(self, path):
 
409
        BzrNewError.__init__(self)
 
410
        self.path = path
 
411
 
 
412
 
 
413
class PathsNotVersionedError(BzrNewError):
 
414
    # used when reporting several paths are not versioned
 
415
    """Path(s) are not versioned: %(paths_as_string)s"""
 
416
 
 
417
    def __init__(self, paths):
 
418
        from bzrlib.osutils import quotefn
 
419
        BzrNewError.__init__(self)
 
420
        self.paths = paths
 
421
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
422
 
 
423
 
 
424
class PathsDoNotExist(BzrNewError):
 
425
    """Path(s) do not exist: %(paths_as_string)s"""
 
426
 
 
427
    # used when reporting that paths are neither versioned nor in the working
 
428
    # tree
 
429
 
 
430
    def __init__(self, paths):
 
431
        # circular import
 
432
        from bzrlib.osutils import quotefn
 
433
        BzrNewError.__init__(self)
 
434
        self.paths = paths
 
435
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
436
 
 
437
 
 
438
class BadFileKindError(BzrNewError):
 
439
    """Cannot operate on %(filename)s of unsupported kind %(kind)s"""
 
440
 
 
441
 
 
442
class ForbiddenControlFileError(BzrNewError):
 
443
    """Cannot operate on %(filename)s because it is a control file"""
 
444
 
 
445
 
 
446
class LockError(BzrNewError):
 
447
    """Lock error: %(message)s"""
 
448
    # All exceptions from the lock/unlock functions should be from
 
449
    # this exception class.  They will be translated as necessary. The
 
450
    # original exception is available as e.original_error
 
451
    #
 
452
    # New code should prefer to raise specific subclasses
 
453
    def __init__(self, message):
 
454
        self.message = message
 
455
 
 
456
 
 
457
class CommitNotPossible(LockError):
 
458
    """A commit was attempted but we do not have a write lock open."""
 
459
    def __init__(self):
 
460
        pass
 
461
 
 
462
 
 
463
class AlreadyCommitted(LockError):
 
464
    """A rollback was requested, but is not able to be accomplished."""
 
465
    def __init__(self):
 
466
        pass
 
467
 
 
468
 
 
469
class ReadOnlyError(LockError):
 
470
    """A write attempt was made in a read only transaction on %(obj)s"""
 
471
    def __init__(self, obj):
 
472
        self.obj = obj
 
473
 
 
474
 
 
475
class OutSideTransaction(BzrNewError):
 
476
    """A transaction related operation was attempted after the transaction finished."""
 
477
 
 
478
 
 
479
class ObjectNotLocked(LockError):
 
480
    """%(obj)r is not locked"""
 
481
 
 
482
    is_user_error = False
 
483
 
 
484
    # this can indicate that any particular object is not locked; see also
 
485
    # LockNotHeld which means that a particular *lock* object is not held by
 
486
    # the caller -- perhaps they should be unified.
 
487
    def __init__(self, obj):
 
488
        self.obj = obj
 
489
 
 
490
 
 
491
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
492
    """Cannot change object %(obj)r in read only transaction"""
 
493
    def __init__(self, obj):
 
494
        self.obj = obj
 
495
 
 
496
 
 
497
class UnlockableTransport(LockError):
 
498
    """Cannot lock: transport is read only: %(transport)s"""
 
499
    def __init__(self, transport):
 
500
        self.transport = transport
 
501
 
 
502
 
 
503
class LockContention(LockError):
 
504
    """Could not acquire lock %(lock)s"""
 
505
    # TODO: show full url for lock, combining the transport and relative bits?
 
506
    def __init__(self, lock):
 
507
        self.lock = lock
 
508
 
 
509
 
 
510
class LockBroken(LockError):
 
511
    """Lock was broken while still open: %(lock)s - check storage consistency!"""
 
512
    def __init__(self, lock):
 
513
        self.lock = lock
 
514
 
 
515
 
 
516
class LockBreakMismatch(LockError):
 
517
    """Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"""
 
518
    def __init__(self, lock, holder, target):
 
519
        self.lock = lock
 
520
        self.holder = holder
 
521
        self.target = target
 
522
 
 
523
 
 
524
class LockNotHeld(LockError):
 
525
    """Lock not held: %(lock)s"""
 
526
    def __init__(self, lock):
 
527
        self.lock = lock
 
528
 
 
529
 
 
530
class PointlessCommit(BzrNewError):
 
531
    """No changes to commit"""
 
532
 
 
533
 
 
534
class UpgradeReadonly(BzrNewError):
 
535
    """Upgrade URL cannot work with readonly URL's."""
 
536
 
 
537
 
 
538
class UpToDateFormat(BzrNewError):
 
539
    """The branch format %(format)s is already at the most recent format."""
 
540
 
 
541
    def __init__(self, format):
 
542
        BzrNewError.__init__(self)
 
543
        self.format = format
 
544
 
 
545
 
 
546
class StrictCommitFailed(Exception):
 
547
    """Commit refused because there are unknowns in the tree."""
 
548
 
 
549
 
 
550
class NoSuchRevision(BzrNewError):
 
551
    """Branch %(branch)s has no revision %(revision)s"""
 
552
 
 
553
    is_user_error = False
 
554
 
 
555
    def __init__(self, branch, revision):
 
556
        BzrNewError.__init__(self, branch=branch, revision=revision)
 
557
 
 
558
 
 
559
class NoSuchRevisionSpec(BzrNewError):
 
560
    """No namespace registered for string: %(spec)r"""
 
561
 
 
562
    def __init__(self, spec):
 
563
        BzrNewError.__init__(self, spec=spec)
 
564
 
 
565
 
 
566
class InvalidRevisionSpec(BzrNewError):
 
567
    """Requested revision: '%(spec)s' does not exist in branch:
 
568
%(branch)s%(extra)s"""
 
569
 
 
570
    def __init__(self, spec, branch, extra=None):
 
571
        BzrNewError.__init__(self, branch=branch, spec=spec)
 
572
        if extra:
 
573
            self.extra = '\n' + str(extra)
 
574
        else:
 
575
            self.extra = ''
 
576
 
 
577
 
 
578
class HistoryMissing(BzrError):
 
579
    def __init__(self, branch, object_type, object_id):
 
580
        self.branch = branch
 
581
        BzrError.__init__(self,
 
582
                          '%s is missing %s {%s}'
 
583
                          % (branch, object_type, object_id))
 
584
 
 
585
 
 
586
class DivergedBranches(BzrNewError):
 
587
    "These branches have diverged.  Use the merge command to reconcile them."""
 
588
 
 
589
    is_user_error = True
 
590
 
 
591
    def __init__(self, branch1, branch2):
 
592
        self.branch1 = branch1
 
593
        self.branch2 = branch2
 
594
 
 
595
 
 
596
class UnrelatedBranches(BzrNewError):
 
597
    "Branches have no common ancestor, and no merge base revision was specified."
 
598
 
 
599
    is_user_error = True
 
600
 
 
601
 
 
602
class NoCommonAncestor(BzrNewError):
 
603
    "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
604
 
 
605
    def __init__(self, revision_a, revision_b):
 
606
        self.revision_a = revision_a
 
607
        self.revision_b = revision_b
 
608
 
 
609
 
 
610
class NoCommonRoot(BzrError):
 
611
    def __init__(self, revision_a, revision_b):
 
612
        msg = "Revisions are not derived from the same root: %s %s." \
 
613
            % (revision_a, revision_b) 
 
614
        BzrError.__init__(self, msg)
 
615
 
 
616
 
 
617
 
 
618
class NotAncestor(BzrError):
 
619
    def __init__(self, rev_id, not_ancestor_id):
 
620
        msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id, 
 
621
                                                        rev_id)
 
622
        BzrError.__init__(self, msg)
 
623
        self.rev_id = rev_id
 
624
        self.not_ancestor_id = not_ancestor_id
 
625
 
 
626
 
 
627
class InstallFailed(BzrError):
 
628
    def __init__(self, revisions):
 
629
        msg = "Could not install revisions:\n%s" % " ,".join(revisions)
 
630
        BzrError.__init__(self, msg)
 
631
        self.revisions = revisions
 
632
 
 
633
 
 
634
class AmbiguousBase(BzrError):
 
635
    def __init__(self, bases):
 
636
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
637
                DeprecationWarning)
 
638
        msg = "The correct base is unclear, because %s are all equally close" %\
 
639
            ", ".join(bases)
 
640
        BzrError.__init__(self, msg)
 
641
        self.bases = bases
 
642
 
 
643
 
 
644
class NoCommits(BzrNewError):
 
645
    """Branch %(branch)s has no commits."""
 
646
 
 
647
    def __init__(self, branch):
 
648
        BzrNewError.__init__(self, branch=branch)
 
649
 
 
650
 
 
651
class UnlistableStore(BzrError):
 
652
    def __init__(self, store):
 
653
        BzrError.__init__(self, "Store %s is not listable" % store)
 
654
 
 
655
 
 
656
 
 
657
class UnlistableBranch(BzrError):
 
658
    def __init__(self, br):
 
659
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
660
 
 
661
 
 
662
class BoundBranchOutOfDate(BzrNewError):
 
663
    """Bound branch %(branch)s is out of date with master branch %(master)s."""
 
664
    def __init__(self, branch, master):
 
665
        BzrNewError.__init__(self)
 
666
        self.branch = branch
 
667
        self.master = master
 
668
 
 
669
        
 
670
class CommitToDoubleBoundBranch(BzrNewError):
 
671
    """Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."""
 
672
    def __init__(self, branch, master, remote):
 
673
        BzrNewError.__init__(self)
 
674
        self.branch = branch
 
675
        self.master = master
 
676
        self.remote = remote
 
677
 
 
678
 
 
679
class OverwriteBoundBranch(BzrNewError):
 
680
    """Cannot pull --overwrite to a branch which is bound %(branch)s"""
 
681
    def __init__(self, branch):
 
682
        BzrNewError.__init__(self)
 
683
        self.branch = branch
 
684
 
 
685
 
 
686
class BoundBranchConnectionFailure(BzrNewError):
 
687
    """Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"""
 
688
    def __init__(self, branch, target, error):
 
689
        BzrNewError.__init__(self)
 
690
        self.branch = branch
 
691
        self.target = target
 
692
        self.error = error
 
693
 
 
694
 
 
695
class WeaveError(BzrNewError):
 
696
    """Error in processing weave: %(message)s"""
 
697
 
 
698
    def __init__(self, message=None):
 
699
        BzrNewError.__init__(self)
 
700
        self.message = message
 
701
 
 
702
 
 
703
class WeaveRevisionAlreadyPresent(WeaveError):
 
704
    """Revision {%(revision_id)s} already present in %(weave)s"""
 
705
    def __init__(self, revision_id, weave):
 
706
 
 
707
        WeaveError.__init__(self)
 
708
        self.revision_id = revision_id
 
709
        self.weave = weave
 
710
 
 
711
 
 
712
class WeaveRevisionNotPresent(WeaveError):
 
713
    """Revision {%(revision_id)s} not present in %(weave)s"""
 
714
 
 
715
    def __init__(self, revision_id, weave):
 
716
        WeaveError.__init__(self)
 
717
        self.revision_id = revision_id
 
718
        self.weave = weave
 
719
 
 
720
 
 
721
class WeaveFormatError(WeaveError):
 
722
    """Weave invariant violated: %(what)s"""
 
723
 
 
724
    def __init__(self, what):
 
725
        WeaveError.__init__(self)
 
726
        self.what = what
 
727
 
 
728
 
 
729
class WeaveParentMismatch(WeaveError):
 
730
    """Parents are mismatched between two revisions."""
 
731
    
 
732
 
 
733
class WeaveInvalidChecksum(WeaveError):
 
734
    """Text did not match it's checksum: %(message)s"""
 
735
 
 
736
 
 
737
class WeaveTextDiffers(WeaveError):
 
738
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
739
 
 
740
    def __init__(self, revision_id, weave_a, weave_b):
 
741
        WeaveError.__init__(self)
 
742
        self.revision_id = revision_id
 
743
        self.weave_a = weave_a
 
744
        self.weave_b = weave_b
 
745
 
 
746
 
 
747
class WeaveTextDiffers(WeaveError):
 
748
    """Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"""
 
749
 
 
750
    def __init__(self, revision_id, weave_a, weave_b):
 
751
        WeaveError.__init__(self)
 
752
        self.revision_id = revision_id
 
753
        self.weave_a = weave_a
 
754
        self.weave_b = weave_b
 
755
 
 
756
 
 
757
class VersionedFileError(BzrNewError):
 
758
    """Versioned file error."""
 
759
 
 
760
 
 
761
class RevisionNotPresent(VersionedFileError):
 
762
    """Revision {%(revision_id)s} not present in %(file_id)s."""
 
763
 
 
764
    def __init__(self, revision_id, file_id):
 
765
        VersionedFileError.__init__(self)
 
766
        self.revision_id = revision_id
 
767
        self.file_id = file_id
 
768
 
 
769
 
 
770
class RevisionAlreadyPresent(VersionedFileError):
 
771
    """Revision {%(revision_id)s} already present in %(file_id)s."""
 
772
 
 
773
    def __init__(self, revision_id, file_id):
 
774
        VersionedFileError.__init__(self)
 
775
        self.revision_id = revision_id
 
776
        self.file_id = file_id
 
777
 
 
778
 
 
779
class KnitError(BzrNewError):
 
780
    """Knit error"""
 
781
 
 
782
 
 
783
class KnitHeaderError(KnitError):
 
784
    """Knit header error: %(badline)r unexpected"""
 
785
 
 
786
    def __init__(self, badline):
 
787
        KnitError.__init__(self)
 
788
        self.badline = badline
 
789
 
 
790
 
 
791
class KnitCorrupt(KnitError):
 
792
    """Knit %(filename)s corrupt: %(how)s"""
 
793
 
 
794
    def __init__(self, filename, how):
 
795
        KnitError.__init__(self)
 
796
        self.filename = filename
 
797
        self.how = how
 
798
 
 
799
 
 
800
class NoSuchExportFormat(BzrNewError):
 
801
    """Export format %(format)r not supported"""
 
802
 
 
803
    def __init__(self, format):
 
804
        BzrNewError.__init__(self)
 
805
        self.format = format
 
806
 
 
807
 
 
808
 
 
809
class TooManyConcurrentRequests(BzrNewError):
 
810
    """The medium '%(medium)s' has reached its concurrent request limit. Be sure to finish_writing and finish_reading on the current request that is open."""
 
811
 
 
812
    def __init__(self, medium):
 
813
        BzrNewError.__init__(self)
 
814
        self.medium = medium
 
815
 
 
816
 
 
817
class TransportError(BzrNewError):
 
818
    """Transport error: %(msg)s %(orig_error)s"""
 
819
 
 
820
    def __init__(self, msg=None, orig_error=None):
 
821
        if msg is None and orig_error is not None:
 
822
            msg = str(orig_error)
 
823
        if orig_error is None:
 
824
            orig_error = ''
 
825
        if msg is None:
 
826
            msg =  ''
 
827
        self.msg = msg
 
828
        self.orig_error = orig_error
 
829
        BzrNewError.__init__(self)
 
830
 
 
831
 
 
832
class SmartProtocolError(TransportError):
 
833
    """Generic bzr smart protocol error: %(details)s"""
 
834
 
 
835
    def __init__(self, details):
 
836
        self.details = details
 
837
 
 
838
 
 
839
# A set of semi-meaningful errors which can be thrown
 
840
class TransportNotPossible(TransportError):
 
841
    """Transport operation not possible: %(msg)s %(orig_error)%"""
 
842
 
 
843
 
 
844
class ConnectionError(TransportError):
 
845
    """Connection error: %(msg)s %(orig_error)s"""
 
846
 
 
847
 
 
848
class ConnectionReset(TransportError):
 
849
    """Connection closed: %(msg)s %(orig_error)s"""
 
850
 
 
851
 
 
852
class InvalidRange(TransportError):
 
853
    """Invalid range access in %(path)s at %(offset)s."""
 
854
    
 
855
    def __init__(self, path, offset):
 
856
        TransportError.__init__(self, ("Invalid range access in %s at %d"
 
857
                                       % (path, offset)))
 
858
        self.path = path
 
859
        self.offset = offset
 
860
 
 
861
 
 
862
class InvalidHttpResponse(TransportError):
 
863
    """Invalid http response for %(path)s: %(msg)s"""
 
864
 
 
865
    def __init__(self, path, msg, orig_error=None):
 
866
        self.path = path
 
867
        TransportError.__init__(self, msg, orig_error=orig_error)
 
868
 
 
869
 
 
870
class InvalidHttpRange(InvalidHttpResponse):
 
871
    """Invalid http range "%(range)s" for %(path)s: %(msg)s"""
 
872
    
 
873
    def __init__(self, path, range, msg):
 
874
        self.range = range
 
875
        InvalidHttpResponse.__init__(self, path, msg)
 
876
 
 
877
 
 
878
class InvalidHttpContentType(InvalidHttpResponse):
 
879
    """Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s"""
 
880
    
 
881
    def __init__(self, path, ctype, msg):
 
882
        self.ctype = ctype
 
883
        InvalidHttpResponse.__init__(self, path, msg)
 
884
 
 
885
 
 
886
class ConflictsInTree(BzrError):
 
887
    def __init__(self):
 
888
        BzrError.__init__(self, "Working tree has conflicts.")
 
889
 
 
890
 
 
891
class ParseConfigError(BzrError):
 
892
    def __init__(self, errors, filename):
 
893
        if filename is None:
 
894
            filename = ""
 
895
        message = "Error(s) parsing config file %s:\n%s" % \
 
896
            (filename, ('\n'.join(e.message for e in errors)))
 
897
        BzrError.__init__(self, message)
 
898
 
 
899
 
 
900
class SigningFailed(BzrError):
 
901
    def __init__(self, command_line):
 
902
        BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
 
903
                               % command_line)
 
904
 
 
905
 
 
906
class WorkingTreeNotRevision(BzrError):
 
907
    def __init__(self, tree):
 
908
        BzrError.__init__(self, "The working tree for %s has changed since"
 
909
                          " last commit, but weave merge requires that it be"
 
910
                          " unchanged." % tree.basedir)
 
911
 
 
912
 
 
913
class WritingCompleted(BzrNewError):
 
914
    """The MediumRequest '%(request)s' has already had finish_writing called upon it - accept bytes may not be called anymore."""
 
915
 
 
916
    def __init__(self, request):
 
917
        BzrNewError.__init__(self)
 
918
        self.request = request
 
919
 
 
920
 
 
921
class WritingNotComplete(BzrNewError):
 
922
    """The MediumRequest '%(request)s' has not has finish_writing called upon it - until the write phase is complete no data may be read."""
 
923
 
 
924
    def __init__(self, request):
 
925
        BzrNewError.__init__(self)
 
926
        self.request = request
 
927
 
 
928
 
 
929
class CantReprocessAndShowBase(BzrNewError):
 
930
    """Can't reprocess and show base.
 
931
Reprocessing obscures relationship of conflicting lines to base."""
 
932
 
 
933
 
 
934
class GraphCycleError(BzrNewError):
 
935
    """Cycle in graph %(graph)r"""
 
936
    def __init__(self, graph):
 
937
        BzrNewError.__init__(self)
 
938
        self.graph = graph
 
939
 
 
940
 
 
941
class NotConflicted(BzrNewError):
 
942
    """File %(filename)s is not conflicted."""
 
943
 
 
944
    def __init__(self, filename):
 
945
        BzrNewError.__init__(self)
 
946
        self.filename = filename
 
947
 
 
948
 
 
949
class MediumNotConnected(BzrNewError):
 
950
    """The medium '%(medium)s' is not connected."""
 
951
 
 
952
    def __init__(self, medium):
 
953
        BzrNewError.__init__(self)
 
954
        self.medium = medium
 
955
 
 
956
 
 
957
class MustUseDecorated(Exception):
 
958
    """A decorating function has requested its original command be used.
 
959
    
 
960
    This should never escape bzr, so does not need to be printable.
 
961
    """
 
962
 
 
963
 
 
964
class NoBundleFound(BzrNewError):
 
965
    """No bundle was found in %(filename)s"""
 
966
    def __init__(self, filename):
 
967
        BzrNewError.__init__(self)
 
968
        self.filename = filename
 
969
 
 
970
 
 
971
class BundleNotSupported(BzrNewError):
 
972
    """Unable to handle bundle version %(version)s: %(msg)s"""
 
973
    def __init__(self, version, msg):
 
974
        BzrNewError.__init__(self)
 
975
        self.version = version
 
976
        self.msg = msg
 
977
 
 
978
 
 
979
class MissingText(BzrNewError):
 
980
    """Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
 
981
 
 
982
    def __init__(self, branch, text_revision, file_id):
 
983
        BzrNewError.__init__(self)
 
984
        self.branch = branch
 
985
        self.base = branch.base
 
986
        self.text_revision = text_revision
 
987
        self.file_id = file_id
 
988
 
 
989
 
 
990
class DuplicateKey(BzrNewError):
 
991
    """Key %(key)s is already present in map"""
 
992
 
 
993
 
 
994
class MalformedTransform(BzrNewError):
 
995
    """Tree transform is malformed %(conflicts)r"""
 
996
 
 
997
 
 
998
class BzrBadParameter(BzrNewError):
 
999
    """A bad parameter : %(param)s is not usable.
 
1000
    
 
1001
    This exception should never be thrown, but it is a base class for all
 
1002
    parameter-to-function errors.
 
1003
    """
 
1004
    def __init__(self, param):
 
1005
        BzrNewError.__init__(self)
 
1006
        self.param = param
 
1007
 
 
1008
 
 
1009
class BzrBadParameterNotUnicode(BzrBadParameter):
 
1010
    """Parameter %(param)s is neither unicode nor utf8."""
 
1011
 
 
1012
 
 
1013
class ReusingTransform(BzrNewError):
 
1014
    """Attempt to reuse a transform that has already been applied."""
 
1015
 
 
1016
 
 
1017
class CantMoveRoot(BzrNewError):
 
1018
    """Moving the root directory is not supported at this time"""
 
1019
 
 
1020
 
 
1021
class BzrBadParameterNotString(BzrBadParameter):
 
1022
    """Parameter %(param)s is not a string or unicode string."""
 
1023
 
 
1024
 
 
1025
class BzrBadParameterMissing(BzrBadParameter):
 
1026
    """Parameter $(param)s is required but not present."""
 
1027
 
 
1028
 
 
1029
class BzrBadParameterUnicode(BzrBadParameter):
 
1030
    """Parameter %(param)s is unicode but only byte-strings are permitted."""
 
1031
 
 
1032
 
 
1033
class BzrBadParameterContainsNewline(BzrBadParameter):
 
1034
    """Parameter %(param)s contains a newline."""
 
1035
 
 
1036
 
 
1037
class DependencyNotPresent(BzrNewError):
 
1038
    """Unable to import library "%(library)s": %(error)s"""
 
1039
 
 
1040
    def __init__(self, library, error):
 
1041
        BzrNewError.__init__(self, library=library, error=error)
 
1042
 
 
1043
 
 
1044
class ParamikoNotPresent(DependencyNotPresent):
 
1045
    """Unable to import paramiko (required for sftp support): %(error)s"""
 
1046
 
 
1047
    def __init__(self, error):
 
1048
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
1049
 
 
1050
 
 
1051
class PointlessMerge(BzrNewError):
 
1052
    """Nothing to merge."""
 
1053
 
 
1054
 
 
1055
class UninitializableFormat(BzrNewError):
 
1056
    """Format %(format)s cannot be initialised by this version of bzr."""
 
1057
 
 
1058
    def __init__(self, format):
 
1059
        BzrNewError.__init__(self)
 
1060
        self.format = format
 
1061
 
 
1062
 
 
1063
class BadConversionTarget(BzrNewError):
 
1064
    """Cannot convert to format %(format)s.  %(problem)s"""
 
1065
 
 
1066
    def __init__(self, problem, format):
 
1067
        BzrNewError.__init__(self)
 
1068
        self.problem = problem
 
1069
        self.format = format
 
1070
 
 
1071
 
 
1072
class NoDiff(BzrNewError):
 
1073
    """Diff is not installed on this machine: %(msg)s"""
 
1074
 
 
1075
    def __init__(self, msg):
 
1076
        BzrNewError.__init__(self, msg=msg)
 
1077
 
 
1078
 
 
1079
class NoDiff3(BzrNewError):
 
1080
    """Diff3 is not installed on this machine."""
 
1081
 
 
1082
 
 
1083
class ExistingLimbo(BzrNewError):
 
1084
    """This tree contains left-over files from a failed operation.
 
1085
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
1086
    keep, and delete it when you are done.
 
1087
    """
 
1088
    def __init__(self, limbo_dir):
 
1089
       BzrNewError.__init__(self)
 
1090
       self.limbo_dir = limbo_dir
 
1091
 
 
1092
 
 
1093
class ImmortalLimbo(BzrNewError):
 
1094
    """Unable to delete transform temporary directory $(limbo_dir)s.
 
1095
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
1096
    keep, and delete it when you are done.
 
1097
    """
 
1098
    def __init__(self, limbo_dir):
 
1099
       BzrNewError.__init__(self)
 
1100
       self.limbo_dir = limbo_dir
 
1101
 
 
1102
 
 
1103
class OutOfDateTree(BzrNewError):
 
1104
    """Working tree is out of date, please run 'bzr update'."""
 
1105
 
 
1106
    def __init__(self, tree):
 
1107
        BzrNewError.__init__(self)
 
1108
        self.tree = tree
 
1109
 
 
1110
 
 
1111
class MergeModifiedFormatError(BzrNewError):
 
1112
    """Error in merge modified format"""
 
1113
 
 
1114
 
 
1115
class ConflictFormatError(BzrNewError):
 
1116
    """Format error in conflict listings"""
 
1117
 
 
1118
 
 
1119
class CorruptRepository(BzrNewError):
 
1120
    """An error has been detected in the repository %(repo_path)s.
 
1121
Please run bzr reconcile on this repository."""
 
1122
 
 
1123
    def __init__(self, repo):
 
1124
        BzrNewError.__init__(self)
 
1125
        self.repo_path = repo.bzrdir.root_transport.base
 
1126
 
 
1127
 
 
1128
class UpgradeRequired(BzrNewError):
 
1129
    """To use this feature you must upgrade your branch at %(path)s."""
 
1130
 
 
1131
    def __init__(self, path):
 
1132
        BzrNewError.__init__(self)
 
1133
        self.path = path
 
1134
 
 
1135
 
 
1136
class LocalRequiresBoundBranch(BzrNewError):
 
1137
    """Cannot perform local-only commits on unbound branches."""
 
1138
 
 
1139
 
 
1140
class MissingProgressBarFinish(BzrNewError):
 
1141
    """A nested progress bar was not 'finished' correctly."""
 
1142
 
 
1143
 
 
1144
class InvalidProgressBarType(BzrNewError):
 
1145
    """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
 
1146
Select one of: %(valid_types)s"""
 
1147
 
 
1148
    def __init__(self, bar_type, valid_types):
 
1149
        BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
1150
 
 
1151
 
 
1152
class UnsupportedOperation(BzrNewError):
 
1153
    """The method %(mname)s is not supported on objects of type %(tname)s."""
 
1154
    def __init__(self, method, method_self):
 
1155
        self.method = method
 
1156
        self.mname = method.__name__
 
1157
        self.tname = type(method_self).__name__
 
1158
 
 
1159
 
 
1160
class BinaryFile(BzrNewError):
 
1161
    """File is binary but should be text."""
 
1162
 
 
1163
 
 
1164
class IllegalPath(BzrNewError):
 
1165
    """The path %(path)s is not permitted on this platform"""
 
1166
 
 
1167
    def __init__(self, path):
 
1168
        BzrNewError.__init__(self)
 
1169
        self.path = path
 
1170
 
 
1171
 
 
1172
class TestamentMismatch(BzrNewError):
 
1173
    """Testament did not match expected value.  
 
1174
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured 
 
1175
       {%(measured)s}
 
1176
    """
 
1177
    def __init__(self, revision_id, expected, measured):
 
1178
        self.revision_id = revision_id
 
1179
        self.expected = expected
 
1180
        self.measured = measured
 
1181
 
 
1182
 
 
1183
class NotABundle(BzrNewError):
 
1184
    """Not a bzr revision-bundle: %(text)r"""
 
1185
 
 
1186
    def __init__(self, text):
 
1187
        BzrNewError.__init__(self)
 
1188
        self.text = text
 
1189
 
 
1190
 
 
1191
class BadBundle(BzrNewError): 
 
1192
    """Bad bzr revision-bundle: %(text)r"""
 
1193
 
 
1194
    def __init__(self, text):
 
1195
        BzrNewError.__init__(self)
 
1196
        self.text = text
 
1197
 
 
1198
 
 
1199
class MalformedHeader(BadBundle): 
 
1200
    """Malformed bzr revision-bundle header: %(text)r"""
 
1201
 
 
1202
    def __init__(self, text):
 
1203
        BzrNewError.__init__(self)
 
1204
        self.text = text
 
1205
 
 
1206
 
 
1207
class MalformedPatches(BadBundle): 
 
1208
    """Malformed patches in bzr revision-bundle: %(text)r"""
 
1209
 
 
1210
    def __init__(self, text):
 
1211
        BzrNewError.__init__(self)
 
1212
        self.text = text
 
1213
 
 
1214
 
 
1215
class MalformedFooter(BadBundle): 
 
1216
    """Malformed footer in bzr revision-bundle: %(text)r"""
 
1217
 
 
1218
    def __init__(self, text):
 
1219
        BzrNewError.__init__(self)
 
1220
        self.text = text
 
1221
 
 
1222
 
 
1223
class UnsupportedEOLMarker(BadBundle):
 
1224
    """End of line marker was not \\n in bzr revision-bundle"""    
 
1225
 
 
1226
    def __init__(self):
 
1227
        BzrNewError.__init__(self)
 
1228
 
 
1229
 
 
1230
class BadInventoryFormat(BzrNewError):
 
1231
    """Root class for inventory serialization errors"""
 
1232
 
 
1233
 
 
1234
class UnexpectedInventoryFormat(BadInventoryFormat):
 
1235
    """The inventory was not in the expected format:\n %(msg)s"""
 
1236
 
 
1237
    def __init__(self, msg):
 
1238
        BadInventoryFormat.__init__(self, msg=msg)
 
1239
 
 
1240
 
 
1241
class NoSmartMedium(BzrNewError):
 
1242
    """The transport '%(transport)s' cannot tunnel the smart protocol."""
 
1243
 
 
1244
    def __init__(self, transport):
 
1245
        BzrNewError.__init__(self)
 
1246
        self.transport = transport
 
1247
 
 
1248
 
 
1249
class NoSmartServer(NotBranchError):
 
1250
    """No smart server available at %(url)s"""
 
1251
 
 
1252
    def __init__(self, url):
 
1253
        self.url = url
 
1254
 
 
1255
 
 
1256
class UnknownSSH(BzrNewError):
 
1257
    """Unrecognised value for BZR_SSH environment variable: %(vendor)s"""
 
1258
 
 
1259
    def __init__(self, vendor):
 
1260
        BzrNewError.__init__(self)
 
1261
        self.vendor = vendor
 
1262
 
 
1263
 
 
1264
class GhostRevisionUnusableHere(BzrNewError):
 
1265
    """Ghost revision {%(revision_id)s} cannot be used here."""
 
1266
 
 
1267
    def __init__(self, revision_id):
 
1268
        BzrNewError.__init__(self)
 
1269
        self.revision_id = revision_id
 
1270
 
 
1271
 
 
1272
class IllegalUseOfScopeReplacer(BzrNewError):
 
1273
    """ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"""
 
1274
 
 
1275
    is_user_error = False
 
1276
 
 
1277
    def __init__(self, name, msg, extra=None):
 
1278
        BzrNewError.__init__(self)
 
1279
        self.name = name
 
1280
        self.msg = msg
 
1281
        if extra:
 
1282
            self.extra = ': ' + str(extra)
 
1283
        else:
 
1284
            self.extra = ''
 
1285
 
 
1286
 
 
1287
class InvalidImportLine(BzrNewError):
 
1288
    """Not a valid import statement: %(msg)\n%(text)s"""
 
1289
 
 
1290
    is_user_error = False
 
1291
 
 
1292
    def __init__(self, text, msg):
 
1293
        BzrNewError.__init__(self)
 
1294
        self.text = text
 
1295
        self.msg = msg
 
1296
 
 
1297
 
 
1298
class ImportNameCollision(BzrNewError):
 
1299
    """Tried to import an object to the same name as an existing object. %(name)s"""
 
1300
 
 
1301
    is_user_error = False
 
1302
 
 
1303
    def __init__(self, name):
 
1304
        BzrNewError.__init__(self)
 
1305
        self.name = name