~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-09-17 21:19:56 UTC
  • mfrom: (1997.1.6 bind-does-not-push-or-pull)
  • Revision ID: pqm@pqm.ubuntu.com-20060917211956-6e30d07da410fd1a
(Robert Collins) Change the Branch bind method to just bind rather than binding and pushing (fixes #43744 and #39542)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
# Copyright (C) 2005, 2006 Canonical
2
 
 
 
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
 
 
7
#
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
 
 
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Exceptions for bzr, and reporting of them.
18
18
 
 
19
There are 3 different classes of error:
 
20
 
 
21
 * KeyboardInterrupt, and OSError with EPIPE - the program terminates 
 
22
   with an appropriate short message
 
23
 
 
24
 * User errors, indicating a problem caused by the user such as a bad URL.
 
25
   These are printed in a short form.
 
26
 
 
27
 * Internal unexpected errors, including most Python builtin errors
 
28
   and some raised from inside bzr.  These are printed with a full 
 
29
   traceback and an invitation to report the bug.
 
30
 
19
31
Exceptions are caught at a high level to report errors to the user, and
20
32
might also be caught inside the program.  Therefore it needs to be
21
33
possible to convert them to a meaningful string, and also for them to be
44
56
Therefore:
45
57
 
46
58
 * create a new exception class for any class of error that can be
47
 
   usefully distinguished.
48
 
 
49
 
 * the printable form of an exception is generated by the base class
50
 
   __str__ method
51
 
 
52
 
Exception strings should start with a capital letter and not have a final
53
 
fullstop.
 
59
   usefully distinguished.  If no callers are likely to want to catch
 
60
   one but not another, don't worry about them.
 
61
 
 
62
 * the __str__ method should generate something useful; BzrError provides
 
63
   a good default implementation
 
64
 
 
65
Exception strings should start with a capital letter and should not have a
 
66
final fullstop.
54
67
"""
55
68
 
56
69
from warnings import warn
81
94
 
82
95
 
83
96
class BzrError(StandardError):
 
97
    
 
98
    is_user_error = True
 
99
    
84
100
    def __str__(self):
85
101
        # XXX: Should we show the exception class in 
86
102
        # exceptions that don't provide their own message?  
110
126
 
111
127
    def __str__(self):
112
128
        try:
113
 
            return self.__doc__ % self.__dict__
114
 
        except (NameError, ValueError, KeyError), e:
115
 
            return 'Unprintable exception %s: %s' \
116
 
                % (self.__class__.__name__, str(e))
 
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."""
117
143
 
118
144
 
119
145
class BzrCheckError(BzrNewError):
120
146
    """Internal check failed: %(message)s"""
121
147
 
 
148
    is_user_error = False
 
149
 
122
150
    def __init__(self, message):
123
151
        BzrNewError.__init__(self)
124
152
        self.message = message
126
154
 
127
155
class InvalidEntryName(BzrNewError):
128
156
    """Invalid entry name: %(name)s"""
 
157
 
 
158
    is_user_error = False
 
159
 
129
160
    def __init__(self, name):
130
161
        BzrNewError.__init__(self)
131
162
        self.name = name
140
171
 
141
172
class InvalidRevisionId(BzrNewError):
142
173
    """Invalid revision-id {%(revision_id)s} in %(branch)s"""
 
174
 
143
175
    def __init__(self, revision_id, branch):
144
176
        # branch can be any string or object with __str__ defined
145
177
        BzrNewError.__init__(self)
147
179
        self.branch = branch
148
180
 
149
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
 
150
191
class NoWorkingTree(BzrNewError):
151
192
    """No WorkingTree exists for %(base)s."""
152
193
    
155
196
        self.base = base
156
197
 
157
198
 
 
199
class NotBuilding(BzrNewError):
 
200
    """Not currently building a tree."""
 
201
 
 
202
 
158
203
class NotLocalUrl(BzrNewError):
159
204
    """%(url)s is not a local path."""
160
205
    
163
208
        self.url = url
164
209
 
165
210
 
166
 
class BzrCommandError(BzrError):
167
 
    # Error from malformed user command
168
 
    # This is being misused as a generic exception
169
 
    # please subclass. RBC 20051030
 
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.
170
218
    #
171
219
    # I think it's a waste of effort to differentiate between errors that
172
220
    # are not intended to be caught anyway.  UI code need not subclass
173
221
    # BzrCommandError, and non-UI code should not throw a subclass of
174
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
 
175
231
    def __str__(self):
176
 
        return self.args[0]
 
232
        return self.msg
177
233
 
178
234
 
179
235
class BzrOptionError(BzrCommandError):
180
 
    """Some missing or otherwise incorrect option was supplied."""
 
236
    """Error in command line options"""
181
237
 
182
238
    
183
 
class StrictCommitFailed(Exception):
184
 
    """Commit refused because there are unknowns in the tree."""
 
239
class StrictCommitFailed(BzrNewError):
 
240
    """Commit refused because there are unknown files in the tree"""
185
241
 
186
242
 
187
243
# XXX: Should be unified with TransportError; they seem to represent the
231
287
        self.args.extend(args)
232
288
 
233
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 ShortReadvError(PathError):
 
298
    """readv() read %(actual)s bytes rather than %(length)s bytes at %(offset)s for %(path)s%(extra)s"""
 
299
 
 
300
    is_user_error = False
 
301
 
 
302
    def __init__(self, path, offset, length, actual, extra=None):
 
303
        PathError.__init__(self, path, extra=extra)
 
304
        self.offset = offset
 
305
        self.length = length
 
306
        self.actual = actual
 
307
 
 
308
 
234
309
class PathNotChild(BzrNewError):
235
310
    """Path %(path)r is not a child of path %(base)r%(extra)s"""
 
311
 
 
312
    is_user_error = False
 
313
 
236
314
    def __init__(self, path, base, extra=None):
237
315
        BzrNewError.__init__(self)
238
316
        self.path = path
243
321
            self.extra = ''
244
322
 
245
323
 
 
324
class InvalidNormalization(PathError):
 
325
    """Path %(path)r is not unicode normalized"""
 
326
 
 
327
 
246
328
# TODO: This is given a URL; we try to unescape it but doing that from inside
247
329
# the exception object is a bit undesirable.
248
330
# TODO: Probably this behavior of should be a common superclass 
263
345
(use bzr checkout if you wish to build a working tree): %(path)s"""
264
346
 
265
347
 
 
348
class AtomicFileAlreadyClosed(PathError):
 
349
    """'%(function)s' called on an AtomicFile after it was closed: %(path)s"""
 
350
 
 
351
    def __init__(self, path, function):
 
352
        PathError.__init__(self, path=path, extra=None)
 
353
        self.function = function
 
354
 
 
355
 
 
356
class InaccessibleParent(PathError):
 
357
    """Parent not accessible given base %(base)s and relative path %(path)s"""
 
358
 
 
359
    def __init__(self, path, base):
 
360
        PathError.__init__(self, path)
 
361
        self.base = base
 
362
 
 
363
 
266
364
class NoRepositoryPresent(BzrNewError):
267
365
    """No repository present: %(path)r"""
268
366
    def __init__(self, bzrdir):
280
378
        self.path = path
281
379
 
282
380
 
283
 
class UnsupportedFormatError(BzrError):
284
 
    """Specified path is a bzr branch that we recognize but cannot read."""
285
 
    def __str__(self):
286
 
        return 'unsupported branch format: %s' % self.args[0]
287
 
 
288
 
 
289
 
class UnknownFormatError(BzrError):
290
 
    """Specified path is a bzr branch whose format we do not recognize."""
291
 
    def __str__(self):
292
 
        return 'unknown branch format: %s' % self.args[0]
 
381
class UnsupportedFormatError(BzrNewError):
 
382
    """Unsupported branch format: %(format)s"""
 
383
 
 
384
 
 
385
class UnknownFormatError(BzrNewError):
 
386
    """Unknown branch format: %(format)r"""
293
387
 
294
388
 
295
389
class IncompatibleFormat(BzrNewError):
333
427
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
334
428
 
335
429
 
336
 
class BadFileKindError(BzrError):
337
 
    """Specified file is of a kind that cannot be added.
338
 
 
339
 
    (For example a symlink or device file.)"""
340
 
 
341
 
 
342
 
class ForbiddenFileError(BzrError):
343
 
    """Cannot operate on a file because it is a control file."""
 
430
class BadFileKindError(BzrNewError):
 
431
    """Cannot operate on %(filename)s of unsupported kind %(kind)s"""
 
432
 
 
433
 
 
434
class ForbiddenControlFileError(BzrNewError):
 
435
    """Cannot operate on %(filename)s because it is a control file"""
344
436
 
345
437
 
346
438
class LockError(BzrNewError):
378
470
 
379
471
class ObjectNotLocked(LockError):
380
472
    """%(obj)r is not locked"""
 
473
 
 
474
    is_user_error = False
 
475
 
381
476
    # this can indicate that any particular object is not locked; see also
382
477
    # LockNotHeld which means that a particular *lock* object is not held by
383
478
    # the caller -- perhaps they should be unified.
440
535
        self.format = format
441
536
 
442
537
 
443
 
 
444
538
class StrictCommitFailed(Exception):
445
539
    """Commit refused because there are unknowns in the tree."""
446
540
 
447
541
 
448
 
class NoSuchRevision(BzrError):
 
542
class NoSuchRevision(BzrNewError):
 
543
    """Branch %(branch)s has no revision %(revision)s"""
 
544
 
 
545
    is_user_error = False
 
546
 
449
547
    def __init__(self, branch, revision):
450
 
        self.branch = branch
451
 
        self.revision = revision
452
 
        msg = "Branch %s has no revision %s" % (branch, revision)
453
 
        BzrError.__init__(self, msg)
 
548
        BzrNewError.__init__(self, branch=branch, revision=revision)
 
549
 
 
550
 
 
551
class NoSuchRevisionSpec(BzrNewError):
 
552
    """No namespace registered for string: %(spec)r"""
 
553
 
 
554
    def __init__(self, spec):
 
555
        BzrNewError.__init__(self, spec=spec)
 
556
 
 
557
 
 
558
class InvalidRevisionSpec(BzrNewError):
 
559
    """Requested revision: '%(spec)s' does not exist in branch:
 
560
%(branch)s%(extra)s"""
 
561
 
 
562
    def __init__(self, spec, branch, extra=None):
 
563
        BzrNewError.__init__(self, branch=branch, spec=spec)
 
564
        if extra:
 
565
            self.extra = '\n' + str(extra)
 
566
        else:
 
567
            self.extra = ''
454
568
 
455
569
 
456
570
class HistoryMissing(BzrError):
461
575
                          % (branch, object_type, object_id))
462
576
 
463
577
 
464
 
class DivergedBranches(BzrError):
 
578
class DivergedBranches(BzrNewError):
 
579
    "These branches have diverged.  Use the merge command to reconcile them."""
 
580
 
 
581
    is_user_error = True
465
582
 
466
583
    def __init__(self, branch1, branch2):
467
 
        BzrError.__init__(self, "These branches have diverged.  Try merge.")
468
584
        self.branch1 = branch1
469
585
        self.branch2 = branch2
470
586
 
471
587
 
472
 
class UnrelatedBranches(BzrCommandError):
473
 
    def __init__(self):
474
 
        msg = "Branches have no common ancestor, and no base revision"\
475
 
            " specified."
476
 
        BzrCommandError.__init__(self, msg)
477
 
 
478
 
 
479
 
class NoCommonAncestor(BzrError):
 
588
class UnrelatedBranches(BzrNewError):
 
589
    "Branches have no common ancestor, and no merge base revision was specified."
 
590
 
 
591
    is_user_error = True
 
592
 
 
593
 
 
594
class NoCommonAncestor(BzrNewError):
 
595
    "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
596
 
480
597
    def __init__(self, revision_a, revision_b):
481
 
        msg = "Revisions have no common ancestor: %s %s." \
482
 
            % (revision_a, revision_b) 
483
 
        BzrError.__init__(self, msg)
 
598
        self.revision_a = revision_a
 
599
        self.revision_b = revision_b
484
600
 
485
601
 
486
602
class NoCommonRoot(BzrError):
517
633
        self.bases = bases
518
634
 
519
635
 
520
 
class NoCommits(BzrError):
 
636
class NoCommits(BzrNewError):
 
637
    """Branch %(branch)s has no commits."""
 
638
 
521
639
    def __init__(self, branch):
522
 
        msg = "Branch %s has no commits." % branch
523
 
        BzrError.__init__(self, msg)
 
640
        BzrNewError.__init__(self, branch=branch)
524
641
 
525
642
 
526
643
class UnlistableStore(BzrError):
679
796
        self.format = format
680
797
 
681
798
 
682
 
class TransportError(BzrError):
683
 
    """All errors thrown by Transport implementations should derive
684
 
    from this class.
685
 
    """
 
799
class TransportError(BzrNewError):
 
800
    """Transport error: %(msg)s %(orig_error)s"""
 
801
 
686
802
    def __init__(self, msg=None, orig_error=None):
687
803
        if msg is None and orig_error is not None:
688
804
            msg = str(orig_error)
689
 
        BzrError.__init__(self, msg)
 
805
        if orig_error is None:
 
806
            orig_error = ''
 
807
        if msg is None:
 
808
            msg =  ''
690
809
        self.msg = msg
691
810
        self.orig_error = orig_error
 
811
        BzrNewError.__init__(self)
 
812
 
 
813
 
 
814
class SmartProtocolError(TransportError):
 
815
    """Generic bzr smart protocol error: %(details)s"""
 
816
 
 
817
    def __init__(self, details):
 
818
        self.details = details
692
819
 
693
820
 
694
821
# A set of semi-meaningful errors which can be thrown
695
822
class TransportNotPossible(TransportError):
696
 
    """This is for transports where a specific function is explicitly not
697
 
    possible. Such as pushing files to an HTTP server.
698
 
    """
699
 
    pass
 
823
    """Transport operation not possible: %(msg)s %(orig_error)%"""
700
824
 
701
825
 
702
826
class ConnectionError(TransportError):
703
 
    """A connection problem prevents file retrieval.
704
 
    This does not indicate whether the file exists or not; it indicates that a
705
 
    precondition for requesting the file was not met.
706
 
    """
707
 
    def __init__(self, msg=None, orig_error=None):
708
 
        TransportError.__init__(self, msg=msg, orig_error=orig_error)
 
827
    """Connection error: %(msg)s %(orig_error)s"""
709
828
 
710
829
 
711
830
class ConnectionReset(TransportError):
712
 
    """The connection has been closed."""
713
 
    pass
 
831
    """Connection closed: %(msg)s %(orig_error)s"""
 
832
 
 
833
 
 
834
class InvalidRange(TransportError):
 
835
    """Invalid range access in %(path)s at %(offset)s."""
 
836
    
 
837
    def __init__(self, path, offset):
 
838
        TransportError.__init__(self, ("Invalid range access in %s at %d"
 
839
                                       % (path, offset)))
 
840
        self.path = path
 
841
        self.offset = offset
 
842
 
 
843
 
 
844
class InvalidHttpResponse(TransportError):
 
845
    """Invalid http response for %(path)s: %(msg)s"""
 
846
 
 
847
    def __init__(self, path, msg, orig_error=None):
 
848
        self.path = path
 
849
        TransportError.__init__(self, msg, orig_error=orig_error)
 
850
 
 
851
 
 
852
class InvalidHttpRange(InvalidHttpResponse):
 
853
    """Invalid http range "%(range)s" for %(path)s: %(msg)s"""
 
854
    
 
855
    def __init__(self, path, range, msg):
 
856
        self.range = range
 
857
        InvalidHttpResponse.__init__(self, path, msg)
 
858
 
 
859
 
 
860
class InvalidHttpContentType(InvalidHttpResponse):
 
861
    """Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s"""
 
862
    
 
863
    def __init__(self, path, ctype, msg):
 
864
        self.ctype = ctype
 
865
        InvalidHttpResponse.__init__(self, path, msg)
714
866
 
715
867
 
716
868
class ConflictsInTree(BzrError):
854
1006
        DependencyNotPresent.__init__(self, 'paramiko', error)
855
1007
 
856
1008
 
 
1009
class PointlessMerge(BzrNewError):
 
1010
    """Nothing to merge."""
 
1011
 
 
1012
 
857
1013
class UninitializableFormat(BzrNewError):
858
1014
    """Format %(format)s cannot be initialised by this version of bzr."""
859
1015
 
862
1018
        self.format = format
863
1019
 
864
1020
 
 
1021
class BadConversionTarget(BzrNewError):
 
1022
    """Cannot convert to format %(format)s.  %(problem)s"""
 
1023
 
 
1024
    def __init__(self, problem, format):
 
1025
        BzrNewError.__init__(self)
 
1026
        self.problem = problem
 
1027
        self.format = format
 
1028
 
 
1029
 
 
1030
class NoDiff(BzrNewError):
 
1031
    """Diff is not installed on this machine: %(msg)s"""
 
1032
 
 
1033
    def __init__(self, msg):
 
1034
        BzrNewError.__init__(self, msg=msg)
 
1035
 
 
1036
 
865
1037
class NoDiff3(BzrNewError):
866
1038
    """Diff3 is not installed on this machine."""
867
1039
 
927
1099
    """A nested progress bar was not 'finished' correctly."""
928
1100
 
929
1101
 
 
1102
class InvalidProgressBarType(BzrNewError):
 
1103
    """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
 
1104
Select one of: %(valid_types)s"""
 
1105
 
 
1106
    def __init__(self, bar_type, valid_types):
 
1107
        BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
1108
 
 
1109
 
930
1110
class UnsupportedOperation(BzrNewError):
931
1111
    """The method %(mname)s is not supported on objects of type %(tname)s."""
932
1112
    def __init__(self, method, method_self):
962
1142
    """Not a bzr revision-bundle: %(text)r"""
963
1143
 
964
1144
    def __init__(self, text):
965
 
        self.text = text
966
 
 
967
 
 
968
 
class BadBundle(Exception): pass
969
 
 
970
 
 
971
 
class MalformedHeader(BadBundle): pass
972
 
 
973
 
 
974
 
class MalformedPatches(BadBundle): pass
975
 
 
976
 
 
977
 
class MalformedFooter(BadBundle): pass
 
1145
        BzrNewError.__init__(self)
 
1146
        self.text = text
 
1147
 
 
1148
 
 
1149
class BadBundle(BzrNewError): 
 
1150
    """Bad bzr revision-bundle: %(text)r"""
 
1151
 
 
1152
    def __init__(self, text):
 
1153
        BzrNewError.__init__(self)
 
1154
        self.text = text
 
1155
 
 
1156
 
 
1157
class MalformedHeader(BadBundle): 
 
1158
    """Malformed bzr revision-bundle header: %(text)r"""
 
1159
 
 
1160
    def __init__(self, text):
 
1161
        BzrNewError.__init__(self)
 
1162
        self.text = text
 
1163
 
 
1164
 
 
1165
class MalformedPatches(BadBundle): 
 
1166
    """Malformed patches in bzr revision-bundle: %(text)r"""
 
1167
 
 
1168
    def __init__(self, text):
 
1169
        BzrNewError.__init__(self)
 
1170
        self.text = text
 
1171
 
 
1172
 
 
1173
class MalformedFooter(BadBundle): 
 
1174
    """Malformed footer in bzr revision-bundle: %(text)r"""
 
1175
 
 
1176
    def __init__(self, text):
 
1177
        BzrNewError.__init__(self)
 
1178
        self.text = text
 
1179
 
 
1180
 
 
1181
class UnsupportedEOLMarker(BadBundle):
 
1182
    """End of line marker was not \\n in bzr revision-bundle"""    
 
1183
 
 
1184
    def __init__(self):
 
1185
        BzrNewError.__init__(self)
 
1186
 
 
1187
 
 
1188
class BadInventoryFormat(BzrNewError):
 
1189
    """Root class for inventory serialization errors"""
 
1190
 
 
1191
 
 
1192
class UnexpectedInventoryFormat(BadInventoryFormat):
 
1193
    """The inventory was not in the expected format:\n %(msg)s"""
 
1194
 
 
1195
    def __init__(self, msg):
 
1196
        BadInventoryFormat.__init__(self, msg=msg)
 
1197
 
 
1198
 
 
1199
class NoSmartServer(NotBranchError):
 
1200
    """No smart server available at %(url)s"""
 
1201
 
 
1202
    def __init__(self, url):
 
1203
        self.url = url
 
1204
 
 
1205
 
 
1206
class UnknownSSH(BzrNewError):
 
1207
    """Unrecognised value for BZR_SSH environment variable: %(vendor)s"""
 
1208
 
 
1209
    def __init__(self, vendor):
 
1210
        BzrNewError.__init__(self)
 
1211
        self.vendor = vendor
 
1212
 
 
1213
 
 
1214
class GhostRevisionUnusableHere(BzrNewError):
 
1215
    """Ghost revision {%(revision_id)s} cannot be used here."""
 
1216
 
 
1217
    def __init__(self, revision_id):
 
1218
        BzrNewError.__init__(self)
 
1219
        self.revision_id = revision_id
 
1220
 
 
1221
 
 
1222
class IllegalUseOfScopeReplacer(BzrNewError):
 
1223
    """ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"""
 
1224
 
 
1225
    is_user_error = False
 
1226
 
 
1227
    def __init__(self, name, msg, extra=None):
 
1228
        BzrNewError.__init__(self)
 
1229
        self.name = name
 
1230
        self.msg = msg
 
1231
        if extra:
 
1232
            self.extra = ': ' + str(extra)
 
1233
        else:
 
1234
            self.extra = ''
 
1235
 
 
1236
 
 
1237
class InvalidImportLine(BzrNewError):
 
1238
    """Not a valid import statement: %(msg)\n%(text)s"""
 
1239
 
 
1240
    is_user_error = False
 
1241
 
 
1242
    def __init__(self, text, msg):
 
1243
        BzrNewError.__init__(self)
 
1244
        self.text = text
 
1245
        self.msg = msg
 
1246
 
 
1247
 
 
1248
class ImportNameCollision(BzrNewError):
 
1249
    """Tried to import an object to the same name as an existing object. %(name)s"""
 
1250
 
 
1251
    is_user_error = False
 
1252
 
 
1253
    def __init__(self, name):
 
1254
        BzrNewError.__init__(self)
 
1255
        self.name = name