/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 breezy/errors.py

  • Committer: Jelmer Vernooij
  • Date: 2017-06-10 16:40:42 UTC
  • mfrom: (6653.6.7 rename-controldir)
  • mto: This revision was merged to the branch mainline in revision 6690.
  • Revision ID: jelmer@jelmer.uk-20170610164042-zrxqgy2htyduvke2
MergeĀ rename-controldirĀ branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005-2013, 2016 Canonical Ltd
 
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
"""Exceptions for bzr, and reporting of them.
 
18
"""
 
19
 
 
20
from __future__ import absolute_import
 
21
 
 
22
from .sixish import (
 
23
    PY3,
 
24
    )
 
25
 
 
26
# TODO: is there any value in providing the .args field used by standard
 
27
# python exceptions?   A list of values with no names seems less useful
 
28
# to me.
 
29
 
 
30
# TODO: Perhaps convert the exception to a string at the moment it's
 
31
# constructed to make sure it will succeed.  But that says nothing about
 
32
# exceptions that are never raised.
 
33
 
 
34
# TODO: selftest assertRaises should probably also check that every error
 
35
# raised can be formatted as a string successfully, and without giving
 
36
# 'unprintable'.
 
37
 
 
38
 
 
39
# return codes from the brz program
 
40
EXIT_OK = 0
 
41
EXIT_ERROR = 3
 
42
EXIT_INTERNAL_ERROR = 4
 
43
 
 
44
 
 
45
class BzrError(Exception):
 
46
    """
 
47
    Base class for errors raised by breezy.
 
48
 
 
49
    :cvar internal_error: if True this was probably caused by a brz bug and
 
50
        should be displayed with a traceback; if False (or absent) this was
 
51
        probably a user or environment error and they don't need the gory
 
52
        details.  (That can be overridden by -Derror on the command line.)
 
53
 
 
54
    :cvar _fmt: Format string to display the error; this is expanded
 
55
        by the instance's dict.
 
56
    """
 
57
 
 
58
    internal_error = False
 
59
 
 
60
    def __init__(self, msg=None, **kwds):
 
61
        """Construct a new BzrError.
 
62
 
 
63
        There are two alternative forms for constructing these objects.
 
64
        Either a preformatted string may be passed, or a set of named
 
65
        arguments can be given.  The first is for generic "user" errors which
 
66
        are not intended to be caught and so do not need a specific subclass.
 
67
        The second case is for use with subclasses that provide a _fmt format
 
68
        string to print the arguments.
 
69
 
 
70
        Keyword arguments are taken as parameters to the error, which can
 
71
        be inserted into the format string template.  It's recommended
 
72
        that subclasses override the __init__ method to require specific
 
73
        parameters.
 
74
 
 
75
        :param msg: If given, this is the literal complete text for the error,
 
76
           not subject to expansion. 'msg' is used instead of 'message' because
 
77
           python evolved and, in 2.6, forbids the use of 'message'.
 
78
        """
 
79
        Exception.__init__(self)
 
80
        if msg is not None:
 
81
            # I was going to deprecate this, but it actually turns out to be
 
82
            # quite handy - mbp 20061103.
 
83
            self._preformatted_string = msg
 
84
        else:
 
85
            self._preformatted_string = None
 
86
            for key, value in kwds.items():
 
87
                setattr(self, key, value)
 
88
 
 
89
    def _format(self):
 
90
        s = getattr(self, '_preformatted_string', None)
 
91
        if s is not None:
 
92
            # contains a preformatted message
 
93
            return s
 
94
        err = None
 
95
        try:
 
96
            fmt = self._get_format_string()
 
97
            if fmt:
 
98
                d = dict(self.__dict__)
 
99
                s = fmt % d
 
100
                # __str__() should always return a 'str' object
 
101
                # never a 'unicode' object.
 
102
                return s
 
103
        except Exception as e:
 
104
            err = e
 
105
        return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
106
            % (self.__class__.__name__,
 
107
               self.__dict__,
 
108
               getattr(self, '_fmt', None),
 
109
               err)
 
110
 
 
111
    if PY3:
 
112
        __str__ = _format
 
113
    else:
 
114
        def __str__(self):
 
115
            return self._format().encode('utf-8')
 
116
 
 
117
        __unicode__ = _format
 
118
 
 
119
    def __repr__(self):
 
120
        return '%s(%s)' % (self.__class__.__name__, str(self))
 
121
 
 
122
    def _get_format_string(self):
 
123
        """Return format string for this exception or None"""
 
124
        fmt = getattr(self, '_fmt', None)
 
125
        if fmt is not None:
 
126
            from breezy.i18n import gettext
 
127
            return gettext(fmt) # _fmt strings should be ascii
 
128
 
 
129
    def __eq__(self, other):
 
130
        if self.__class__ is not other.__class__:
 
131
            return NotImplemented
 
132
        return self.__dict__ == other.__dict__
 
133
 
 
134
    def __hash__(self):
 
135
        return id(self)
 
136
 
 
137
 
 
138
class InternalBzrError(BzrError):
 
139
    """Base class for errors that are internal in nature.
 
140
 
 
141
    This is a convenience class for errors that are internal. The
 
142
    internal_error attribute can still be altered in subclasses, if needed.
 
143
    Using this class is simply an easy way to get internal errors.
 
144
    """
 
145
 
 
146
    internal_error = True
 
147
 
 
148
 
 
149
class AlreadyBuilding(BzrError):
 
150
 
 
151
    _fmt = "The tree builder is already building a tree."
 
152
 
 
153
 
 
154
class BranchError(BzrError):
 
155
    """Base class for concrete 'errors about a branch'."""
 
156
 
 
157
    def __init__(self, branch):
 
158
        BzrError.__init__(self, branch=branch)
 
159
 
 
160
 
 
161
class BzrCheckError(InternalBzrError):
 
162
 
 
163
    _fmt = "Internal check failed: %(msg)s"
 
164
 
 
165
    def __init__(self, msg):
 
166
        BzrError.__init__(self)
 
167
        self.msg = msg
 
168
 
 
169
 
 
170
class DirstateCorrupt(BzrError):
 
171
 
 
172
    _fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
 
173
 
 
174
    def __init__(self, state, msg):
 
175
        BzrError.__init__(self)
 
176
        self.state = state
 
177
        self.msg = msg
 
178
 
 
179
 
 
180
class DisabledMethod(InternalBzrError):
 
181
 
 
182
    _fmt = "The smart server method '%(class_name)s' is disabled."
 
183
 
 
184
    def __init__(self, class_name):
 
185
        BzrError.__init__(self)
 
186
        self.class_name = class_name
 
187
 
 
188
 
 
189
class IncompatibleAPI(BzrError):
 
190
 
 
191
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
 
192
        'It supports versions "%(minimum)s" to "%(current)s".'
 
193
 
 
194
    def __init__(self, api, wanted, minimum, current):
 
195
        self.api = api
 
196
        self.wanted = wanted
 
197
        self.minimum = minimum
 
198
        self.current = current
 
199
 
 
200
 
 
201
class InProcessTransport(BzrError):
 
202
 
 
203
    _fmt = "The transport '%(transport)s' is only accessible within this " \
 
204
        "process."
 
205
 
 
206
    def __init__(self, transport):
 
207
        self.transport = transport
 
208
 
 
209
 
 
210
class InvalidEntryName(InternalBzrError):
 
211
 
 
212
    _fmt = "Invalid entry name: %(name)s"
 
213
 
 
214
    def __init__(self, name):
 
215
        BzrError.__init__(self)
 
216
        self.name = name
 
217
 
 
218
 
 
219
class InvalidRevisionNumber(BzrError):
 
220
 
 
221
    _fmt = "Invalid revision number %(revno)s"
 
222
 
 
223
    def __init__(self, revno):
 
224
        BzrError.__init__(self)
 
225
        self.revno = revno
 
226
 
 
227
 
 
228
class InvalidRevisionId(BzrError):
 
229
 
 
230
    _fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
 
231
 
 
232
    def __init__(self, revision_id, branch):
 
233
        # branch can be any string or object with __str__ defined
 
234
        BzrError.__init__(self)
 
235
        self.revision_id = revision_id
 
236
        self.branch = branch
 
237
 
 
238
 
 
239
class ReservedId(BzrError):
 
240
 
 
241
    _fmt = "Reserved revision-id {%(revision_id)s}"
 
242
 
 
243
    def __init__(self, revision_id):
 
244
        self.revision_id = revision_id
 
245
 
 
246
 
 
247
class RootMissing(InternalBzrError):
 
248
 
 
249
    _fmt = ("The root entry of a tree must be the first entry supplied to "
 
250
        "the commit builder.")
 
251
 
 
252
 
 
253
class NoPublicBranch(BzrError):
 
254
 
 
255
    _fmt = 'There is no public branch set for "%(branch_url)s".'
 
256
 
 
257
    def __init__(self, branch):
 
258
        from . import urlutils
 
259
        public_location = urlutils.unescape_for_display(branch.base, 'ascii')
 
260
        BzrError.__init__(self, branch_url=public_location)
 
261
 
 
262
 
 
263
class NoHelpTopic(BzrError):
 
264
 
 
265
    _fmt = ("No help could be found for '%(topic)s'. "
 
266
        "Please use 'brz help topics' to obtain a list of topics.")
 
267
 
 
268
    def __init__(self, topic):
 
269
        self.topic = topic
 
270
 
 
271
 
 
272
class NoSuchId(BzrError):
 
273
 
 
274
    _fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
 
275
 
 
276
    def __init__(self, tree, file_id):
 
277
        BzrError.__init__(self)
 
278
        self.file_id = file_id
 
279
        self.tree = tree
 
280
 
 
281
 
 
282
class NoSuchIdInRepository(NoSuchId):
 
283
 
 
284
    _fmt = ('The file id "%(file_id)s" is not present in the repository'
 
285
            ' %(repository)r')
 
286
 
 
287
    def __init__(self, repository, file_id):
 
288
        BzrError.__init__(self, repository=repository, file_id=file_id)
 
289
 
 
290
 
 
291
class NotStacked(BranchError):
 
292
 
 
293
    _fmt = "The branch '%(branch)s' is not stacked."
 
294
 
 
295
 
 
296
class InventoryModified(InternalBzrError):
 
297
 
 
298
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
299
            " so a clean inventory cannot be read without data loss.")
 
300
 
 
301
    def __init__(self, tree):
 
302
        self.tree = tree
 
303
 
 
304
 
 
305
class NoWorkingTree(BzrError):
 
306
 
 
307
    _fmt = 'No WorkingTree exists for "%(base)s".'
 
308
 
 
309
    def __init__(self, base):
 
310
        BzrError.__init__(self)
 
311
        self.base = base
 
312
 
 
313
 
 
314
class NotBuilding(BzrError):
 
315
 
 
316
    _fmt = "Not currently building a tree."
 
317
 
 
318
 
 
319
class NotLocalUrl(BzrError):
 
320
 
 
321
    _fmt = "%(url)s is not a local path."
 
322
 
 
323
    def __init__(self, url):
 
324
        self.url = url
 
325
 
 
326
 
 
327
class WorkingTreeAlreadyPopulated(InternalBzrError):
 
328
 
 
329
    _fmt = 'Working tree already populated in "%(base)s"'
 
330
 
 
331
    def __init__(self, base):
 
332
        self.base = base
 
333
 
 
334
 
 
335
class BzrCommandError(BzrError):
 
336
    """Error from user command"""
 
337
 
 
338
    # Error from malformed user command; please avoid raising this as a
 
339
    # generic exception not caused by user input.
 
340
    #
 
341
    # I think it's a waste of effort to differentiate between errors that
 
342
    # are not intended to be caught anyway.  UI code need not subclass
 
343
    # BzrCommandError, and non-UI code should not throw a subclass of
 
344
    # BzrCommandError.  ADHB 20051211
 
345
 
 
346
 
 
347
class NotWriteLocked(BzrError):
 
348
 
 
349
    _fmt = """%(not_locked)r is not write locked but needs to be."""
 
350
 
 
351
    def __init__(self, not_locked):
 
352
        self.not_locked = not_locked
 
353
 
 
354
 
 
355
class BzrOptionError(BzrCommandError):
 
356
 
 
357
    _fmt = "Error in command line options"
 
358
 
 
359
 
 
360
class BadIndexFormatSignature(BzrError):
 
361
 
 
362
    _fmt = "%(value)s is not an index of type %(_type)s."
 
363
 
 
364
    def __init__(self, value, _type):
 
365
        BzrError.__init__(self)
 
366
        self.value = value
 
367
        self._type = _type
 
368
 
 
369
 
 
370
class BadIndexData(BzrError):
 
371
 
 
372
    _fmt = "Error in data for index %(value)s."
 
373
 
 
374
    def __init__(self, value):
 
375
        BzrError.__init__(self)
 
376
        self.value = value
 
377
 
 
378
 
 
379
class BadIndexDuplicateKey(BzrError):
 
380
 
 
381
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
382
 
 
383
    def __init__(self, key, index):
 
384
        BzrError.__init__(self)
 
385
        self.key = key
 
386
        self.index = index
 
387
 
 
388
 
 
389
class BadIndexKey(BzrError):
 
390
 
 
391
    _fmt = "The key '%(key)s' is not a valid key."
 
392
 
 
393
    def __init__(self, key):
 
394
        BzrError.__init__(self)
 
395
        self.key = key
 
396
 
 
397
 
 
398
class BadIndexOptions(BzrError):
 
399
 
 
400
    _fmt = "Could not parse options for index %(value)s."
 
401
 
 
402
    def __init__(self, value):
 
403
        BzrError.__init__(self)
 
404
        self.value = value
 
405
 
 
406
 
 
407
class BadIndexValue(BzrError):
 
408
 
 
409
    _fmt = "The value '%(value)s' is not a valid value."
 
410
 
 
411
    def __init__(self, value):
 
412
        BzrError.__init__(self)
 
413
        self.value = value
 
414
 
 
415
 
 
416
class BadOptionValue(BzrError):
 
417
 
 
418
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
419
 
 
420
    def __init__(self, name, value):
 
421
        BzrError.__init__(self, name=name, value=value)
 
422
 
 
423
 
 
424
class StrictCommitFailed(BzrError):
 
425
 
 
426
    _fmt = "Commit refused because there are unknown files in the tree"
 
427
 
 
428
 
 
429
# XXX: Should be unified with TransportError; they seem to represent the
 
430
# same thing
 
431
# RBC 20060929: I think that unifiying with TransportError would be a mistake
 
432
# - this is finer than a TransportError - and more useful as such. It
 
433
# differentiates between 'transport has failed' and 'operation on a transport
 
434
# has failed.'
 
435
class PathError(BzrError):
 
436
 
 
437
    _fmt = "Generic path error: %(path)r%(extra)s)"
 
438
 
 
439
    def __init__(self, path, extra=None):
 
440
        BzrError.__init__(self)
 
441
        self.path = path
 
442
        if extra:
 
443
            self.extra = ': ' + str(extra)
 
444
        else:
 
445
            self.extra = ''
 
446
 
 
447
 
 
448
class NoSuchFile(PathError):
 
449
 
 
450
    _fmt = "No such file: %(path)r%(extra)s"
 
451
 
 
452
 
 
453
class FileExists(PathError):
 
454
 
 
455
    _fmt = "File exists: %(path)r%(extra)s"
 
456
 
 
457
 
 
458
class RenameFailedFilesExist(BzrError):
 
459
    """Used when renaming and both source and dest exist."""
 
460
 
 
461
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
 
462
            " (Use --after to tell brz about a rename that has already"
 
463
            " happened)%(extra)s")
 
464
 
 
465
    def __init__(self, source, dest, extra=None):
 
466
        BzrError.__init__(self)
 
467
        self.source = str(source)
 
468
        self.dest = str(dest)
 
469
        if extra:
 
470
            self.extra = ' ' + str(extra)
 
471
        else:
 
472
            self.extra = ''
 
473
 
 
474
 
 
475
class NotADirectory(PathError):
 
476
 
 
477
    _fmt = '"%(path)s" is not a directory %(extra)s'
 
478
 
 
479
 
 
480
class NotInWorkingDirectory(PathError):
 
481
 
 
482
    _fmt = '"%(path)s" is not in the working directory %(extra)s'
 
483
 
 
484
 
 
485
class DirectoryNotEmpty(PathError):
 
486
 
 
487
    _fmt = 'Directory not empty: "%(path)s"%(extra)s'
 
488
 
 
489
 
 
490
class HardLinkNotSupported(PathError):
 
491
 
 
492
    _fmt = 'Hard-linking "%(path)s" is not supported'
 
493
 
 
494
 
 
495
class ReadingCompleted(InternalBzrError):
 
496
 
 
497
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
 
498
            "called upon it - the request has been completed and no more "
 
499
            "data may be read.")
 
500
 
 
501
    def __init__(self, request):
 
502
        self.request = request
 
503
 
 
504
 
 
505
class ResourceBusy(PathError):
 
506
 
 
507
    _fmt = 'Device or resource busy: "%(path)s"%(extra)s'
 
508
 
 
509
 
 
510
class PermissionDenied(PathError):
 
511
 
 
512
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
 
513
 
 
514
 
 
515
class InvalidURL(PathError):
 
516
 
 
517
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
 
518
 
 
519
 
 
520
class InvalidURLJoin(PathError):
 
521
 
 
522
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
523
 
 
524
    def __init__(self, reason, base, join_args):
 
525
        self.reason = reason
 
526
        self.base = base
 
527
        self.join_args = join_args
 
528
        PathError.__init__(self, base, reason)
 
529
 
 
530
 
 
531
class InvalidRebaseURLs(PathError):
 
532
 
 
533
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
534
 
 
535
    def __init__(self, from_, to):
 
536
        self.from_ = from_
 
537
        self.to = to
 
538
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
539
 
 
540
 
 
541
class UnavailableRepresentation(InternalBzrError):
 
542
 
 
543
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
544
        "is encoded as '%(native)s'.")
 
545
 
 
546
    def __init__(self, key, wanted, native):
 
547
        InternalBzrError.__init__(self)
 
548
        self.wanted = wanted
 
549
        self.native = native
 
550
        self.key = key
 
551
 
 
552
 
 
553
class UnknownHook(BzrError):
 
554
 
 
555
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of breezy."
 
556
 
 
557
    def __init__(self, hook_type, hook_name):
 
558
        BzrError.__init__(self)
 
559
        self.type = hook_type
 
560
        self.hook = hook_name
 
561
 
 
562
 
 
563
class UnsupportedProtocol(PathError):
 
564
 
 
565
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
566
 
 
567
    def __init__(self, url, extra=""):
 
568
        PathError.__init__(self, url, extra=extra)
 
569
 
 
570
 
 
571
class UnstackableBranchFormat(BzrError):
 
572
 
 
573
    _fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
 
574
        "You will need to upgrade the branch to permit branch stacking.")
 
575
 
 
576
    def __init__(self, format, url):
 
577
        BzrError.__init__(self)
 
578
        self.format = format
 
579
        self.url = url
 
580
 
 
581
 
 
582
class UnstackableLocationError(BzrError):
 
583
 
 
584
    _fmt = "The branch '%(branch_url)s' cannot be stacked on '%(target_url)s'."
 
585
 
 
586
    def __init__(self, branch_url, target_url):
 
587
        BzrError.__init__(self)
 
588
        self.branch_url = branch_url
 
589
        self.target_url = target_url
 
590
 
 
591
 
 
592
class UnstackableRepositoryFormat(BzrError):
 
593
 
 
594
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
595
        "You will need to upgrade the repository to permit branch stacking.")
 
596
 
 
597
    def __init__(self, format, url):
 
598
        BzrError.__init__(self)
 
599
        self.format = format
 
600
        self.url = url
 
601
 
 
602
 
 
603
class ReadError(PathError):
 
604
 
 
605
    _fmt = """Error reading from %(path)r."""
 
606
 
 
607
 
 
608
class ShortReadvError(PathError):
 
609
 
 
610
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
611
            ' at %(offset)s for "%(path)s"%(extra)s')
 
612
 
 
613
    internal_error = True
 
614
 
 
615
    def __init__(self, path, offset, length, actual, extra=None):
 
616
        PathError.__init__(self, path, extra=extra)
 
617
        self.offset = offset
 
618
        self.length = length
 
619
        self.actual = actual
 
620
 
 
621
 
 
622
class PathNotChild(PathError):
 
623
 
 
624
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
 
625
 
 
626
    internal_error = False
 
627
 
 
628
    def __init__(self, path, base, extra=None):
 
629
        BzrError.__init__(self)
 
630
        self.path = path
 
631
        self.base = base
 
632
        if extra:
 
633
            self.extra = ': ' + str(extra)
 
634
        else:
 
635
            self.extra = ''
 
636
 
 
637
 
 
638
class InvalidNormalization(PathError):
 
639
 
 
640
    _fmt = 'Path "%(path)s" is not unicode normalized'
 
641
 
 
642
 
 
643
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
644
# the exception object is a bit undesirable.
 
645
# TODO: Probably this behavior of should be a common superclass
 
646
class NotBranchError(PathError):
 
647
 
 
648
    _fmt = 'Not a branch: "%(path)s"%(detail)s.'
 
649
 
 
650
    def __init__(self, path, detail=None, controldir=None):
 
651
       from . import urlutils
 
652
       path = urlutils.unescape_for_display(path, 'ascii')
 
653
       if detail is not None:
 
654
           detail = ': ' + detail
 
655
       self.detail = detail
 
656
       self.controldir = controldir
 
657
       PathError.__init__(self, path=path)
 
658
 
 
659
    def __repr__(self):
 
660
        return '<%s %r>' % (self.__class__.__name__, self.__dict__)
 
661
 
 
662
    def _get_format_string(self):
 
663
        # GZ 2017-06-08: Not the best place to lazy fill detail in.
 
664
        if self.detail is None:
 
665
           self.detail = self._get_detail()
 
666
        return super(NotBranchError, self)._get_format_string()
 
667
 
 
668
    def _get_detail(self):
 
669
        if self.controldir is not None:
 
670
            try:
 
671
                self.controldir.open_repository()
 
672
            except NoRepositoryPresent:
 
673
                return ''
 
674
            except Exception as e:
 
675
                # Just ignore unexpected errors.  Raising arbitrary errors
 
676
                # during str(err) can provoke strange bugs.  Concretely
 
677
                # Launchpad's codehosting managed to raise NotBranchError
 
678
                # here, and then get stuck in an infinite loop/recursion
 
679
                # trying to str() that error.  All this error really cares
 
680
                # about that there's no working repository there, and if
 
681
                # open_repository() fails, there probably isn't.
 
682
                return ': ' + e.__class__.__name__
 
683
            else:
 
684
                return ': location is a repository'
 
685
        return ''
 
686
 
 
687
 
 
688
class NoSubmitBranch(PathError):
 
689
 
 
690
    _fmt = 'No submit branch available for branch "%(path)s"'
 
691
 
 
692
    def __init__(self, branch):
 
693
       from . import urlutils
 
694
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
695
 
 
696
 
 
697
class AlreadyControlDirError(PathError):
 
698
 
 
699
    _fmt = 'A control directory already exists: "%(path)s".'
 
700
 
 
701
 
 
702
class AlreadyBranchError(PathError):
 
703
 
 
704
    _fmt = 'Already a branch: "%(path)s".'
 
705
 
 
706
 
 
707
class InvalidBranchName(PathError):
 
708
 
 
709
    _fmt = "Invalid branch name: %(name)s"
 
710
 
 
711
    def __init__(self, name):
 
712
        BzrError.__init__(self)
 
713
        self.name = name
 
714
 
 
715
 
 
716
class ParentBranchExists(AlreadyBranchError):
 
717
 
 
718
    _fmt = 'Parent branch already exists: "%(path)s".'
 
719
 
 
720
 
 
721
class BranchExistsWithoutWorkingTree(PathError):
 
722
 
 
723
    _fmt = 'Directory contains a branch, but no working tree \
 
724
(use brz checkout if you wish to build a working tree): "%(path)s"'
 
725
 
 
726
 
 
727
class AtomicFileAlreadyClosed(PathError):
 
728
 
 
729
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
730
            ' "%(path)s"')
 
731
 
 
732
    def __init__(self, path, function):
 
733
        PathError.__init__(self, path=path, extra=None)
 
734
        self.function = function
 
735
 
 
736
 
 
737
class InaccessibleParent(PathError):
 
738
 
 
739
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
740
            ' relative path "%(path)s"')
 
741
 
 
742
    def __init__(self, path, base):
 
743
        PathError.__init__(self, path)
 
744
        self.base = base
 
745
 
 
746
 
 
747
class NoRepositoryPresent(BzrError):
 
748
 
 
749
    _fmt = 'No repository present: "%(path)s"'
 
750
    def __init__(self, controldir):
 
751
        BzrError.__init__(self)
 
752
        self.path = controldir.transport.clone('..').base
 
753
 
 
754
 
 
755
class UnsupportedFormatError(BzrError):
 
756
 
 
757
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
 
758
 
 
759
 
 
760
class UnknownFormatError(BzrError):
 
761
 
 
762
    _fmt = "Unknown %(kind)s format: %(format)r"
 
763
 
 
764
    def __init__(self, format, kind='branch'):
 
765
        self.kind = kind
 
766
        self.format = format
 
767
 
 
768
 
 
769
class IncompatibleFormat(BzrError):
 
770
 
 
771
    _fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
 
772
 
 
773
    def __init__(self, format, controldir_format):
 
774
        BzrError.__init__(self)
 
775
        self.format = format
 
776
        self.controldir = controldir_format
 
777
 
 
778
 
 
779
class ParseFormatError(BzrError):
 
780
 
 
781
    _fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
 
782
 
 
783
    def __init__(self, format, lineno, line, text):
 
784
        BzrError.__init__(self)
 
785
        self.format = format
 
786
        self.lineno = lineno
 
787
        self.line = line
 
788
        self.text = text
 
789
 
 
790
 
 
791
class IncompatibleRepositories(BzrError):
 
792
    """Report an error that two repositories are not compatible.
 
793
 
 
794
    Note that the source and target repositories are permitted to be strings:
 
795
    this exception is thrown from the smart server and may refer to a
 
796
    repository the client hasn't opened.
 
797
    """
 
798
 
 
799
    _fmt = "%(target)s\n" \
 
800
            "is not compatible with\n" \
 
801
            "%(source)s\n" \
 
802
            "%(details)s"
 
803
 
 
804
    def __init__(self, source, target, details=None):
 
805
        if details is None:
 
806
            details = "(no details)"
 
807
        BzrError.__init__(self, target=target, source=source, details=details)
 
808
 
 
809
 
 
810
class IncompatibleRevision(BzrError):
 
811
 
 
812
    _fmt = "Revision is not compatible with %(repo_format)s"
 
813
 
 
814
    def __init__(self, repo_format):
 
815
        BzrError.__init__(self)
 
816
        self.repo_format = repo_format
 
817
 
 
818
 
 
819
class AlreadyVersionedError(BzrError):
 
820
    """Used when a path is expected not to be versioned, but it is."""
 
821
 
 
822
    _fmt = "%(context_info)s%(path)s is already versioned."
 
823
 
 
824
    def __init__(self, path, context_info=None):
 
825
        """Construct a new AlreadyVersionedError.
 
826
 
 
827
        :param path: This is the path which is versioned,
 
828
            which should be in a user friendly form.
 
829
        :param context_info: If given, this is information about the context,
 
830
            which could explain why this is expected to not be versioned.
 
831
        """
 
832
        BzrError.__init__(self)
 
833
        self.path = path
 
834
        if context_info is None:
 
835
            self.context_info = ''
 
836
        else:
 
837
            self.context_info = context_info + ". "
 
838
 
 
839
 
 
840
class NotVersionedError(BzrError):
 
841
    """Used when a path is expected to be versioned, but it is not."""
 
842
 
 
843
    _fmt = "%(context_info)s%(path)s is not versioned."
 
844
 
 
845
    def __init__(self, path, context_info=None):
 
846
        """Construct a new NotVersionedError.
 
847
 
 
848
        :param path: This is the path which is not versioned,
 
849
            which should be in a user friendly form.
 
850
        :param context_info: If given, this is information about the context,
 
851
            which could explain why this is expected to be versioned.
 
852
        """
 
853
        BzrError.__init__(self)
 
854
        self.path = path
 
855
        if context_info is None:
 
856
            self.context_info = ''
 
857
        else:
 
858
            self.context_info = context_info + ". "
 
859
 
 
860
 
 
861
class PathsNotVersionedError(BzrError):
 
862
    """Used when reporting several paths which are not versioned"""
 
863
 
 
864
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
865
 
 
866
    def __init__(self, paths):
 
867
        from breezy.osutils import quotefn
 
868
        BzrError.__init__(self)
 
869
        self.paths = paths
 
870
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
871
 
 
872
 
 
873
class PathsDoNotExist(BzrError):
 
874
 
 
875
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
876
 
 
877
    # used when reporting that paths are neither versioned nor in the working
 
878
    # tree
 
879
 
 
880
    def __init__(self, paths, extra=None):
 
881
        # circular import
 
882
        from breezy.osutils import quotefn
 
883
        BzrError.__init__(self)
 
884
        self.paths = paths
 
885
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
886
        if extra:
 
887
            self.extra = ': ' + str(extra)
 
888
        else:
 
889
            self.extra = ''
 
890
 
 
891
 
 
892
class BadFileKindError(BzrError):
 
893
 
 
894
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
895
 
 
896
    def __init__(self, filename, kind):
 
897
        BzrError.__init__(self, filename=filename, kind=kind)
 
898
 
 
899
 
 
900
class BadFilenameEncoding(BzrError):
 
901
 
 
902
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
903
            ' encoding %(fs_encoding)s')
 
904
 
 
905
    def __init__(self, filename, fs_encoding):
 
906
        BzrError.__init__(self)
 
907
        self.filename = filename
 
908
        self.fs_encoding = fs_encoding
 
909
 
 
910
 
 
911
class ForbiddenControlFileError(BzrError):
 
912
 
 
913
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
914
 
 
915
 
 
916
class LockError(InternalBzrError):
 
917
 
 
918
    _fmt = "Lock error: %(msg)s"
 
919
 
 
920
    # All exceptions from the lock/unlock functions should be from
 
921
    # this exception class.  They will be translated as necessary. The
 
922
    # original exception is available as e.original_error
 
923
    #
 
924
    # New code should prefer to raise specific subclasses
 
925
    def __init__(self, msg):
 
926
        self.msg = msg
 
927
 
 
928
 
 
929
class LockActive(LockError):
 
930
 
 
931
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
932
 
 
933
    internal_error = False
 
934
 
 
935
    def __init__(self, lock_description):
 
936
        self.lock_description = lock_description
 
937
 
 
938
 
 
939
class CommitNotPossible(LockError):
 
940
 
 
941
    _fmt = "A commit was attempted but we do not have a write lock open."
 
942
 
 
943
    def __init__(self):
 
944
        pass
 
945
 
 
946
 
 
947
class AlreadyCommitted(LockError):
 
948
 
 
949
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
950
 
 
951
    def __init__(self):
 
952
        pass
 
953
 
 
954
 
 
955
class ReadOnlyError(LockError):
 
956
 
 
957
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
958
 
 
959
    # TODO: There should also be an error indicating that you need a write
 
960
    # lock and don't have any lock at all... mbp 20070226
 
961
 
 
962
    def __init__(self, obj):
 
963
        self.obj = obj
 
964
 
 
965
 
 
966
class LockFailed(LockError):
 
967
 
 
968
    internal_error = False
 
969
 
 
970
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
971
 
 
972
    def __init__(self, lock, why):
 
973
        LockError.__init__(self, '')
 
974
        self.lock = lock
 
975
        self.why = why
 
976
 
 
977
 
 
978
class OutSideTransaction(BzrError):
 
979
 
 
980
    _fmt = ("A transaction related operation was attempted after"
 
981
            " the transaction finished.")
 
982
 
 
983
 
 
984
class ObjectNotLocked(LockError):
 
985
 
 
986
    _fmt = "%(obj)r is not locked"
 
987
 
 
988
    # this can indicate that any particular object is not locked; see also
 
989
    # LockNotHeld which means that a particular *lock* object is not held by
 
990
    # the caller -- perhaps they should be unified.
 
991
    def __init__(self, obj):
 
992
        self.obj = obj
 
993
 
 
994
 
 
995
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
996
 
 
997
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
998
 
 
999
    def __init__(self, obj):
 
1000
        self.obj = obj
 
1001
 
 
1002
 
 
1003
class UnlockableTransport(LockError):
 
1004
 
 
1005
    internal_error = False
 
1006
 
 
1007
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
1008
 
 
1009
    def __init__(self, transport):
 
1010
        self.transport = transport
 
1011
 
 
1012
 
 
1013
class LockContention(LockError):
 
1014
 
 
1015
    _fmt = 'Could not acquire lock "%(lock)s": %(msg)s'
 
1016
 
 
1017
    internal_error = False
 
1018
 
 
1019
    def __init__(self, lock, msg=''):
 
1020
        self.lock = lock
 
1021
        self.msg = msg
 
1022
 
 
1023
 
 
1024
class LockBroken(LockError):
 
1025
 
 
1026
    _fmt = ("Lock was broken while still open: %(lock)s"
 
1027
            " - check storage consistency!")
 
1028
 
 
1029
    internal_error = False
 
1030
 
 
1031
    def __init__(self, lock):
 
1032
        self.lock = lock
 
1033
 
 
1034
 
 
1035
class LockBreakMismatch(LockError):
 
1036
 
 
1037
    _fmt = ("Lock was released and re-acquired before being broken:"
 
1038
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
1039
 
 
1040
    internal_error = False
 
1041
 
 
1042
    def __init__(self, lock, holder, target):
 
1043
        self.lock = lock
 
1044
        self.holder = holder
 
1045
        self.target = target
 
1046
 
 
1047
 
 
1048
class LockCorrupt(LockError):
 
1049
 
 
1050
    _fmt = ("Lock is apparently held, but corrupted: %(corruption_info)s\n"
 
1051
            "Use 'brz break-lock' to clear it")
 
1052
 
 
1053
    internal_error = False
 
1054
 
 
1055
    def __init__(self, corruption_info, file_data=None):
 
1056
        self.corruption_info = corruption_info
 
1057
        self.file_data = file_data
 
1058
 
 
1059
 
 
1060
class LockNotHeld(LockError):
 
1061
 
 
1062
    _fmt = "Lock not held: %(lock)s"
 
1063
 
 
1064
    internal_error = False
 
1065
 
 
1066
    def __init__(self, lock):
 
1067
        self.lock = lock
 
1068
 
 
1069
 
 
1070
class TokenLockingNotSupported(LockError):
 
1071
 
 
1072
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
1073
 
 
1074
    def __init__(self, obj):
 
1075
        self.obj = obj
 
1076
 
 
1077
 
 
1078
class TokenMismatch(LockBroken):
 
1079
 
 
1080
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
1081
 
 
1082
    internal_error = True
 
1083
 
 
1084
    def __init__(self, given_token, lock_token):
 
1085
        self.given_token = given_token
 
1086
        self.lock_token = lock_token
 
1087
 
 
1088
 
 
1089
class PointlessCommit(BzrError):
 
1090
 
 
1091
    _fmt = "No changes to commit"
 
1092
 
 
1093
 
 
1094
class CannotCommitSelectedFileMerge(BzrError):
 
1095
 
 
1096
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
1097
        ' files %(files_str)s'
 
1098
 
 
1099
    def __init__(self, files):
 
1100
        files_str = ', '.join(files)
 
1101
        BzrError.__init__(self, files=files, files_str=files_str)
 
1102
 
 
1103
 
 
1104
class ExcludesUnsupported(BzrError):
 
1105
 
 
1106
    _fmt = ('Excluding paths during commit is not supported by '
 
1107
            'repository at %(repository)r.')
 
1108
 
 
1109
    def __init__(self, repository):
 
1110
        BzrError.__init__(self, repository=repository)
 
1111
 
 
1112
 
 
1113
class BadCommitMessageEncoding(BzrError):
 
1114
 
 
1115
    _fmt = 'The specified commit message contains characters unsupported by '\
 
1116
        'the current encoding.'
 
1117
 
 
1118
 
 
1119
class UpgradeReadonly(BzrError):
 
1120
 
 
1121
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
1122
 
 
1123
 
 
1124
class UpToDateFormat(BzrError):
 
1125
 
 
1126
    _fmt = "The branch format %(format)s is already at the most recent format."
 
1127
 
 
1128
    def __init__(self, format):
 
1129
        BzrError.__init__(self)
 
1130
        self.format = format
 
1131
 
 
1132
 
 
1133
class StrictCommitFailed(Exception):
 
1134
 
 
1135
    _fmt = "Commit refused because there are unknowns in the tree."
 
1136
 
 
1137
 
 
1138
class NoSuchRevision(InternalBzrError):
 
1139
 
 
1140
    _fmt = "%(branch)s has no revision %(revision)s"
 
1141
 
 
1142
    def __init__(self, branch, revision):
 
1143
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
 
1144
        BzrError.__init__(self, branch=branch, revision=revision)
 
1145
 
 
1146
 
 
1147
class RangeInChangeOption(BzrError):
 
1148
 
 
1149
    _fmt = "Option --change does not accept revision ranges"
 
1150
 
 
1151
 
 
1152
class NoSuchRevisionSpec(BzrError):
 
1153
 
 
1154
    _fmt = "No namespace registered for string: %(spec)r"
 
1155
 
 
1156
    def __init__(self, spec):
 
1157
        BzrError.__init__(self, spec=spec)
 
1158
 
 
1159
 
 
1160
class NoSuchRevisionInTree(NoSuchRevision):
 
1161
    """When using Tree.revision_tree, and the revision is not accessible."""
 
1162
 
 
1163
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
 
1164
 
 
1165
    def __init__(self, tree, revision_id):
 
1166
        BzrError.__init__(self)
 
1167
        self.tree = tree
 
1168
        self.revision_id = revision_id
 
1169
 
 
1170
 
 
1171
class InvalidRevisionSpec(BzrError):
 
1172
 
 
1173
    _fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
 
1174
            " %(branch_url)s%(extra)s")
 
1175
 
 
1176
    def __init__(self, spec, branch, extra=None):
 
1177
        BzrError.__init__(self, branch=branch, spec=spec)
 
1178
        self.branch_url = getattr(branch, 'user_url', str(branch))
 
1179
        if extra:
 
1180
            self.extra = '\n' + str(extra)
 
1181
        else:
 
1182
            self.extra = ''
 
1183
 
 
1184
 
 
1185
class AppendRevisionsOnlyViolation(BzrError):
 
1186
 
 
1187
    _fmt = ('Operation denied because it would change the main history,'
 
1188
           ' which is not permitted by the append_revisions_only setting on'
 
1189
           ' branch "%(location)s".')
 
1190
 
 
1191
    def __init__(self, location):
 
1192
       import breezy.urlutils as urlutils
 
1193
       location = urlutils.unescape_for_display(location, 'ascii')
 
1194
       BzrError.__init__(self, location=location)
 
1195
 
 
1196
 
 
1197
class DivergedBranches(BzrError):
 
1198
 
 
1199
    _fmt = ("These branches have diverged."
 
1200
            " Use the missing command to see how.\n"
 
1201
            "Use the merge command to reconcile them.")
 
1202
 
 
1203
    def __init__(self, branch1, branch2):
 
1204
        self.branch1 = branch1
 
1205
        self.branch2 = branch2
 
1206
 
 
1207
 
 
1208
class NotLefthandHistory(InternalBzrError):
 
1209
 
 
1210
    _fmt = "Supplied history does not follow left-hand parents"
 
1211
 
 
1212
    def __init__(self, history):
 
1213
        BzrError.__init__(self, history=history)
 
1214
 
 
1215
 
 
1216
class UnrelatedBranches(BzrError):
 
1217
 
 
1218
    _fmt = ("Branches have no common ancestor, and"
 
1219
            " no merge base revision was specified.")
 
1220
 
 
1221
 
 
1222
class CannotReverseCherrypick(BzrError):
 
1223
 
 
1224
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
1225
            ' or diff3.')
 
1226
 
 
1227
 
 
1228
class NoCommonAncestor(BzrError):
 
1229
 
 
1230
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
1231
 
 
1232
    def __init__(self, revision_a, revision_b):
 
1233
        self.revision_a = revision_a
 
1234
        self.revision_b = revision_b
 
1235
 
 
1236
 
 
1237
class NoCommonRoot(BzrError):
 
1238
 
 
1239
    _fmt = ("Revisions are not derived from the same root: "
 
1240
           "%(revision_a)s %(revision_b)s.")
 
1241
 
 
1242
    def __init__(self, revision_a, revision_b):
 
1243
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
1244
 
 
1245
 
 
1246
class NotAncestor(BzrError):
 
1247
 
 
1248
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
1249
 
 
1250
    def __init__(self, rev_id, not_ancestor_id):
 
1251
        BzrError.__init__(self, rev_id=rev_id,
 
1252
            not_ancestor_id=not_ancestor_id)
 
1253
 
 
1254
 
 
1255
class NoCommits(BranchError):
 
1256
 
 
1257
    _fmt = "Branch %(branch)s has no commits."
 
1258
 
 
1259
 
 
1260
class UnlistableStore(BzrError):
 
1261
 
 
1262
    def __init__(self, store):
 
1263
        BzrError.__init__(self, "Store %s is not listable" % store)
 
1264
 
 
1265
 
 
1266
 
 
1267
class UnlistableBranch(BzrError):
 
1268
 
 
1269
    def __init__(self, br):
 
1270
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
1271
 
 
1272
 
 
1273
class BoundBranchOutOfDate(BzrError):
 
1274
 
 
1275
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
1276
            " %(master)s.%(extra_help)s")
 
1277
 
 
1278
    def __init__(self, branch, master):
 
1279
        BzrError.__init__(self)
 
1280
        self.branch = branch
 
1281
        self.master = master
 
1282
        self.extra_help = ''
 
1283
 
 
1284
 
 
1285
class CommitToDoubleBoundBranch(BzrError):
 
1286
 
 
1287
    _fmt = ("Cannot commit to branch %(branch)s."
 
1288
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
1289
 
 
1290
    def __init__(self, branch, master, remote):
 
1291
        BzrError.__init__(self)
 
1292
        self.branch = branch
 
1293
        self.master = master
 
1294
        self.remote = remote
 
1295
 
 
1296
 
 
1297
class OverwriteBoundBranch(BzrError):
 
1298
 
 
1299
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
1300
 
 
1301
    def __init__(self, branch):
 
1302
        BzrError.__init__(self)
 
1303
        self.branch = branch
 
1304
 
 
1305
 
 
1306
class BoundBranchConnectionFailure(BzrError):
 
1307
 
 
1308
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
1309
            " => %(target)s: %(error)s")
 
1310
 
 
1311
    def __init__(self, branch, target, error):
 
1312
        BzrError.__init__(self)
 
1313
        self.branch = branch
 
1314
        self.target = target
 
1315
        self.error = error
 
1316
 
 
1317
 
 
1318
class WeaveError(BzrError):
 
1319
 
 
1320
    _fmt = "Error in processing weave: %(msg)s"
 
1321
 
 
1322
    def __init__(self, msg=None):
 
1323
        BzrError.__init__(self)
 
1324
        self.msg = msg
 
1325
 
 
1326
 
 
1327
class WeaveRevisionAlreadyPresent(WeaveError):
 
1328
 
 
1329
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
1330
 
 
1331
    def __init__(self, revision_id, weave):
 
1332
 
 
1333
        WeaveError.__init__(self)
 
1334
        self.revision_id = revision_id
 
1335
        self.weave = weave
 
1336
 
 
1337
 
 
1338
class WeaveRevisionNotPresent(WeaveError):
 
1339
 
 
1340
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
1341
 
 
1342
    def __init__(self, revision_id, weave):
 
1343
        WeaveError.__init__(self)
 
1344
        self.revision_id = revision_id
 
1345
        self.weave = weave
 
1346
 
 
1347
 
 
1348
class WeaveFormatError(WeaveError):
 
1349
 
 
1350
    _fmt = "Weave invariant violated: %(what)s"
 
1351
 
 
1352
    def __init__(self, what):
 
1353
        WeaveError.__init__(self)
 
1354
        self.what = what
 
1355
 
 
1356
 
 
1357
class WeaveParentMismatch(WeaveError):
 
1358
 
 
1359
    _fmt = "Parents are mismatched between two revisions. %(msg)s"
 
1360
 
 
1361
 
 
1362
class WeaveInvalidChecksum(WeaveError):
 
1363
 
 
1364
    _fmt = "Text did not match its checksum: %(msg)s"
 
1365
 
 
1366
 
 
1367
class WeaveTextDiffers(WeaveError):
 
1368
 
 
1369
    _fmt = ("Weaves differ on text content. Revision:"
 
1370
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
1371
 
 
1372
    def __init__(self, revision_id, weave_a, weave_b):
 
1373
        WeaveError.__init__(self)
 
1374
        self.revision_id = revision_id
 
1375
        self.weave_a = weave_a
 
1376
        self.weave_b = weave_b
 
1377
 
 
1378
 
 
1379
class WeaveTextDiffers(WeaveError):
 
1380
 
 
1381
    _fmt = ("Weaves differ on text content. Revision:"
 
1382
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
1383
 
 
1384
    def __init__(self, revision_id, weave_a, weave_b):
 
1385
        WeaveError.__init__(self)
 
1386
        self.revision_id = revision_id
 
1387
        self.weave_a = weave_a
 
1388
        self.weave_b = weave_b
 
1389
 
 
1390
 
 
1391
class VersionedFileError(BzrError):
 
1392
 
 
1393
    _fmt = "Versioned file error"
 
1394
 
 
1395
 
 
1396
class RevisionNotPresent(VersionedFileError):
 
1397
 
 
1398
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
 
1399
 
 
1400
    def __init__(self, revision_id, file_id):
 
1401
        VersionedFileError.__init__(self)
 
1402
        self.revision_id = revision_id
 
1403
        self.file_id = file_id
 
1404
 
 
1405
 
 
1406
class RevisionAlreadyPresent(VersionedFileError):
 
1407
 
 
1408
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
 
1409
 
 
1410
    def __init__(self, revision_id, file_id):
 
1411
        VersionedFileError.__init__(self)
 
1412
        self.revision_id = revision_id
 
1413
        self.file_id = file_id
 
1414
 
 
1415
 
 
1416
class VersionedFileInvalidChecksum(VersionedFileError):
 
1417
 
 
1418
    _fmt = "Text did not match its checksum: %(msg)s"
 
1419
 
 
1420
 
 
1421
class KnitError(InternalBzrError):
 
1422
 
 
1423
    _fmt = "Knit error"
 
1424
 
 
1425
 
 
1426
class KnitCorrupt(KnitError):
 
1427
 
 
1428
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
1429
 
 
1430
    def __init__(self, filename, how):
 
1431
        KnitError.__init__(self)
 
1432
        self.filename = filename
 
1433
        self.how = how
 
1434
 
 
1435
 
 
1436
class SHA1KnitCorrupt(KnitCorrupt):
 
1437
 
 
1438
    _fmt = ("Knit %(filename)s corrupt: sha-1 of reconstructed text does not "
 
1439
        "match expected sha-1. key %(key)s expected sha %(expected)s actual "
 
1440
        "sha %(actual)s")
 
1441
 
 
1442
    def __init__(self, filename, actual, expected, key, content):
 
1443
        KnitError.__init__(self)
 
1444
        self.filename = filename
 
1445
        self.actual = actual
 
1446
        self.expected = expected
 
1447
        self.key = key
 
1448
        self.content = content
 
1449
 
 
1450
 
 
1451
class KnitDataStreamIncompatible(KnitError):
 
1452
    # Not raised anymore, as we can convert data streams.  In future we may
 
1453
    # need it again for more exotic cases, so we're keeping it around for now.
 
1454
 
 
1455
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
1456
 
 
1457
    def __init__(self, stream_format, target_format):
 
1458
        self.stream_format = stream_format
 
1459
        self.target_format = target_format
 
1460
 
 
1461
 
 
1462
class KnitDataStreamUnknown(KnitError):
 
1463
    # Indicates a data stream we don't know how to handle.
 
1464
 
 
1465
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
1466
 
 
1467
    def __init__(self, stream_format):
 
1468
        self.stream_format = stream_format
 
1469
 
 
1470
 
 
1471
class KnitHeaderError(KnitError):
 
1472
 
 
1473
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
1474
 
 
1475
    def __init__(self, badline, filename):
 
1476
        KnitError.__init__(self)
 
1477
        self.badline = badline
 
1478
        self.filename = filename
 
1479
 
 
1480
class KnitIndexUnknownMethod(KnitError):
 
1481
    """Raised when we don't understand the storage method.
 
1482
 
 
1483
    Currently only 'fulltext' and 'line-delta' are supported.
 
1484
    """
 
1485
 
 
1486
    _fmt = ("Knit index %(filename)s does not have a known method"
 
1487
            " in options: %(options)r")
 
1488
 
 
1489
    def __init__(self, filename, options):
 
1490
        KnitError.__init__(self)
 
1491
        self.filename = filename
 
1492
        self.options = options
 
1493
 
 
1494
 
 
1495
class RetryWithNewPacks(BzrError):
 
1496
    """Raised when we realize that the packs on disk have changed.
 
1497
 
 
1498
    This is meant as more of a signaling exception, to trap between where a
 
1499
    local error occurred and the code that can actually handle the error and
 
1500
    code that can retry appropriately.
 
1501
    """
 
1502
 
 
1503
    internal_error = True
 
1504
 
 
1505
    _fmt = ("Pack files have changed, reload and retry. context: %(context)s"
 
1506
            " %(orig_error)s")
 
1507
 
 
1508
    def __init__(self, context, reload_occurred, exc_info):
 
1509
        """create a new RetryWithNewPacks error.
 
1510
 
 
1511
        :param reload_occurred: Set to True if we know that the packs have
 
1512
            already been reloaded, and we are failing because of an in-memory
 
1513
            cache miss. If set to True then we will ignore if a reload says
 
1514
            nothing has changed, because we assume it has already reloaded. If
 
1515
            False, then a reload with nothing changed will force an error.
 
1516
        :param exc_info: The original exception traceback, so if there is a
 
1517
            problem we can raise the original error (value from sys.exc_info())
 
1518
        """
 
1519
        BzrError.__init__(self)
 
1520
        self.context = context
 
1521
        self.reload_occurred = reload_occurred
 
1522
        self.exc_info = exc_info
 
1523
        self.orig_error = exc_info[1]
 
1524
        # TODO: The global error handler should probably treat this by
 
1525
        #       raising/printing the original exception with a bit about
 
1526
        #       RetryWithNewPacks also not being caught
 
1527
 
 
1528
 
 
1529
class RetryAutopack(RetryWithNewPacks):
 
1530
    """Raised when we are autopacking and we find a missing file.
 
1531
 
 
1532
    Meant as a signaling exception, to tell the autopack code it should try
 
1533
    again.
 
1534
    """
 
1535
 
 
1536
    internal_error = True
 
1537
 
 
1538
    _fmt = ("Pack files have changed, reload and try autopack again."
 
1539
            " context: %(context)s %(orig_error)s")
 
1540
 
 
1541
 
 
1542
class NoSuchExportFormat(BzrError):
 
1543
 
 
1544
    _fmt = "Export format %(format)r not supported"
 
1545
 
 
1546
    def __init__(self, format):
 
1547
        BzrError.__init__(self)
 
1548
        self.format = format
 
1549
 
 
1550
 
 
1551
class TransportError(BzrError):
 
1552
 
 
1553
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
1554
 
 
1555
    def __init__(self, msg=None, orig_error=None):
 
1556
        if msg is None and orig_error is not None:
 
1557
            msg = str(orig_error)
 
1558
        if orig_error is None:
 
1559
            orig_error = ''
 
1560
        if msg is None:
 
1561
            msg =  ''
 
1562
        self.msg = msg
 
1563
        self.orig_error = orig_error
 
1564
        BzrError.__init__(self)
 
1565
 
 
1566
 
 
1567
class TooManyConcurrentRequests(InternalBzrError):
 
1568
 
 
1569
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
1570
            " Be sure to finish_writing and finish_reading on the"
 
1571
            " currently open request.")
 
1572
 
 
1573
    def __init__(self, medium):
 
1574
        self.medium = medium
 
1575
 
 
1576
 
 
1577
class SmartProtocolError(TransportError):
 
1578
 
 
1579
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
1580
 
 
1581
    def __init__(self, details):
 
1582
        self.details = details
 
1583
 
 
1584
 
 
1585
class UnexpectedProtocolVersionMarker(TransportError):
 
1586
 
 
1587
    _fmt = "Received bad protocol version marker: %(marker)r"
 
1588
 
 
1589
    def __init__(self, marker):
 
1590
        self.marker = marker
 
1591
 
 
1592
 
 
1593
class UnknownSmartMethod(InternalBzrError):
 
1594
 
 
1595
    _fmt = "The server does not recognise the '%(verb)s' request."
 
1596
 
 
1597
    def __init__(self, verb):
 
1598
        self.verb = verb
 
1599
 
 
1600
 
 
1601
class SmartMessageHandlerError(InternalBzrError):
 
1602
 
 
1603
    _fmt = ("The message handler raised an exception:\n"
 
1604
            "%(traceback_text)s")
 
1605
 
 
1606
    def __init__(self, exc_info):
 
1607
        import traceback
 
1608
        # GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
 
1609
        self.exc_type, self.exc_value, self.exc_tb = exc_info
 
1610
        self.exc_info = exc_info
 
1611
        traceback_strings = traceback.format_exception(
 
1612
                self.exc_type, self.exc_value, self.exc_tb)
 
1613
        self.traceback_text = ''.join(traceback_strings)
 
1614
 
 
1615
 
 
1616
# A set of semi-meaningful errors which can be thrown
 
1617
class TransportNotPossible(TransportError):
 
1618
 
 
1619
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
1620
 
 
1621
 
 
1622
class ConnectionError(TransportError):
 
1623
 
 
1624
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
1625
 
 
1626
 
 
1627
class SocketConnectionError(ConnectionError):
 
1628
 
 
1629
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
1630
 
 
1631
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
1632
        if msg is None:
 
1633
            msg = 'Failed to connect to'
 
1634
        if orig_error is None:
 
1635
            orig_error = ''
 
1636
        else:
 
1637
            orig_error = '; ' + str(orig_error)
 
1638
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
1639
        self.host = host
 
1640
        if port is None:
 
1641
            self.port = ''
 
1642
        else:
 
1643
            self.port = ':%s' % port
 
1644
 
 
1645
 
 
1646
# XXX: This is also used for unexpected end of file, which is different at the
 
1647
# TCP level from "connection reset".
 
1648
class ConnectionReset(TransportError):
 
1649
 
 
1650
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
1651
 
 
1652
 
 
1653
class ConnectionTimeout(ConnectionError):
 
1654
 
 
1655
    _fmt = "Connection Timeout: %(msg)s%(orig_error)s"
 
1656
 
 
1657
 
 
1658
class InvalidRange(TransportError):
 
1659
 
 
1660
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
1661
 
 
1662
    def __init__(self, path, offset, msg=None):
 
1663
        TransportError.__init__(self, msg)
 
1664
        self.path = path
 
1665
        self.offset = offset
 
1666
 
 
1667
 
 
1668
class InvalidHttpResponse(TransportError):
 
1669
 
 
1670
    _fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
 
1671
 
 
1672
    def __init__(self, path, msg, orig_error=None):
 
1673
        self.path = path
 
1674
        if orig_error is None:
 
1675
            orig_error = ''
 
1676
        else:
 
1677
            # This is reached for obscure and unusual errors so we want to
 
1678
            # preserve as much info as possible to ease debug.
 
1679
            orig_error = ': %r' % (orig_error,)
 
1680
        TransportError.__init__(self, msg, orig_error=orig_error)
 
1681
 
 
1682
 
 
1683
class InvalidHttpRange(InvalidHttpResponse):
 
1684
 
 
1685
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
1686
 
 
1687
    def __init__(self, path, range, msg):
 
1688
        self.range = range
 
1689
        InvalidHttpResponse.__init__(self, path, msg)
 
1690
 
 
1691
 
 
1692
class HttpBoundaryMissing(InvalidHttpResponse):
 
1693
    """A multipart response ends with no boundary marker.
 
1694
 
 
1695
    This is a special case caused by buggy proxies, described in
 
1696
    <https://bugs.launchpad.net/bzr/+bug/198646>.
 
1697
    """
 
1698
 
 
1699
    _fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
 
1700
 
 
1701
    def __init__(self, path, msg):
 
1702
        InvalidHttpResponse.__init__(self, path, msg)
 
1703
 
 
1704
 
 
1705
class InvalidHttpContentType(InvalidHttpResponse):
 
1706
 
 
1707
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
1708
 
 
1709
    def __init__(self, path, ctype, msg):
 
1710
        self.ctype = ctype
 
1711
        InvalidHttpResponse.__init__(self, path, msg)
 
1712
 
 
1713
 
 
1714
class RedirectRequested(TransportError):
 
1715
 
 
1716
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
1717
 
 
1718
    def __init__(self, source, target, is_permanent=False):
 
1719
        self.source = source
 
1720
        self.target = target
 
1721
        if is_permanent:
 
1722
            self.permanently = ' permanently'
 
1723
        else:
 
1724
            self.permanently = ''
 
1725
        TransportError.__init__(self)
 
1726
 
 
1727
 
 
1728
class TooManyRedirections(TransportError):
 
1729
 
 
1730
    _fmt = "Too many redirections"
 
1731
 
 
1732
 
 
1733
class ConflictsInTree(BzrError):
 
1734
 
 
1735
    _fmt = "Working tree has conflicts."
 
1736
 
 
1737
 
 
1738
class ConfigContentError(BzrError):
 
1739
 
 
1740
    _fmt = "Config file %(filename)s is not UTF-8 encoded\n"
 
1741
 
 
1742
    def __init__(self, filename):
 
1743
        BzrError.__init__(self)
 
1744
        self.filename = filename
 
1745
 
 
1746
 
 
1747
class ParseConfigError(BzrError):
 
1748
 
 
1749
    _fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
 
1750
 
 
1751
    def __init__(self, errors, filename):
 
1752
        BzrError.__init__(self)
 
1753
        self.filename = filename
 
1754
        self.errors = '\n'.join(e.msg for e in errors)
 
1755
 
 
1756
 
 
1757
class ConfigOptionValueError(BzrError):
 
1758
 
 
1759
    _fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
 
1760
            'See ``brz help %(name)s``')
 
1761
 
 
1762
    def __init__(self, name, value):
 
1763
        BzrError.__init__(self, name=name, value=value)
 
1764
 
 
1765
 
 
1766
class NoEmailInUsername(BzrError):
 
1767
 
 
1768
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
1769
 
 
1770
    def __init__(self, username):
 
1771
        BzrError.__init__(self)
 
1772
        self.username = username
 
1773
 
 
1774
 
 
1775
class SigningFailed(BzrError):
 
1776
 
 
1777
    _fmt = 'Failed to GPG sign data with command "%(command_line)s"'
 
1778
 
 
1779
    def __init__(self, command_line):
 
1780
        BzrError.__init__(self, command_line=command_line)
 
1781
 
 
1782
 
 
1783
class SignatureVerificationFailed(BzrError):
 
1784
 
 
1785
    _fmt = 'Failed to verify GPG signature data with error "%(error)s"'
 
1786
 
 
1787
    def __init__(self, error):
 
1788
        BzrError.__init__(self, error=error)
 
1789
 
 
1790
 
 
1791
class DependencyNotPresent(BzrError):
 
1792
 
 
1793
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
1794
 
 
1795
    def __init__(self, library, error):
 
1796
        BzrError.__init__(self, library=library, error=error)
 
1797
 
 
1798
 
 
1799
class GpgmeNotInstalled(DependencyNotPresent):
 
1800
 
 
1801
    _fmt = 'python-gpgme is not installed, it is needed to verify signatures'
 
1802
 
 
1803
    def __init__(self, error):
 
1804
        DependencyNotPresent.__init__(self, 'gpgme', error)
 
1805
 
 
1806
 
 
1807
class WorkingTreeNotRevision(BzrError):
 
1808
 
 
1809
    _fmt = ("The working tree for %(basedir)s has changed since"
 
1810
            " the last commit, but weave merge requires that it be"
 
1811
            " unchanged")
 
1812
 
 
1813
    def __init__(self, tree):
 
1814
        BzrError.__init__(self, basedir=tree.basedir)
 
1815
 
 
1816
 
 
1817
class CantReprocessAndShowBase(BzrError):
 
1818
 
 
1819
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
1820
           "the relationship of conflicting lines to the base")
 
1821
 
 
1822
 
 
1823
class GraphCycleError(BzrError):
 
1824
 
 
1825
    _fmt = "Cycle in graph %(graph)r"
 
1826
 
 
1827
    def __init__(self, graph):
 
1828
        BzrError.__init__(self)
 
1829
        self.graph = graph
 
1830
 
 
1831
 
 
1832
class WritingCompleted(InternalBzrError):
 
1833
 
 
1834
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
1835
            "called upon it - accept bytes may not be called anymore.")
 
1836
 
 
1837
    def __init__(self, request):
 
1838
        self.request = request
 
1839
 
 
1840
 
 
1841
class WritingNotComplete(InternalBzrError):
 
1842
 
 
1843
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
1844
            "called upon it - until the write phase is complete no "
 
1845
            "data may be read.")
 
1846
 
 
1847
    def __init__(self, request):
 
1848
        self.request = request
 
1849
 
 
1850
 
 
1851
class NotConflicted(BzrError):
 
1852
 
 
1853
    _fmt = "File %(filename)s is not conflicted."
 
1854
 
 
1855
    def __init__(self, filename):
 
1856
        BzrError.__init__(self)
 
1857
        self.filename = filename
 
1858
 
 
1859
 
 
1860
class MediumNotConnected(InternalBzrError):
 
1861
 
 
1862
    _fmt = """The medium '%(medium)s' is not connected."""
 
1863
 
 
1864
    def __init__(self, medium):
 
1865
        self.medium = medium
 
1866
 
 
1867
 
 
1868
class MustUseDecorated(Exception):
 
1869
 
 
1870
    _fmt = "A decorating function has requested its original command be used."
 
1871
 
 
1872
 
 
1873
class NoBundleFound(BzrError):
 
1874
 
 
1875
    _fmt = 'No bundle was found in "%(filename)s".'
 
1876
 
 
1877
    def __init__(self, filename):
 
1878
        BzrError.__init__(self)
 
1879
        self.filename = filename
 
1880
 
 
1881
 
 
1882
class BundleNotSupported(BzrError):
 
1883
 
 
1884
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
1885
 
 
1886
    def __init__(self, version, msg):
 
1887
        BzrError.__init__(self)
 
1888
        self.version = version
 
1889
        self.msg = msg
 
1890
 
 
1891
 
 
1892
class MissingText(BzrError):
 
1893
 
 
1894
    _fmt = ("Branch %(base)s is missing revision"
 
1895
            " %(text_revision)s of %(file_id)s")
 
1896
 
 
1897
    def __init__(self, branch, text_revision, file_id):
 
1898
        BzrError.__init__(self)
 
1899
        self.branch = branch
 
1900
        self.base = branch.base
 
1901
        self.text_revision = text_revision
 
1902
        self.file_id = file_id
 
1903
 
 
1904
 
 
1905
class DuplicateFileId(BzrError):
 
1906
 
 
1907
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
1908
 
 
1909
    def __init__(self, file_id, entry):
 
1910
        BzrError.__init__(self)
 
1911
        self.file_id = file_id
 
1912
        self.entry = entry
 
1913
 
 
1914
 
 
1915
class DuplicateKey(BzrError):
 
1916
 
 
1917
    _fmt = "Key %(key)s is already present in map"
 
1918
 
 
1919
 
 
1920
class DuplicateHelpPrefix(BzrError):
 
1921
 
 
1922
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
1923
 
 
1924
    def __init__(self, prefix):
 
1925
        self.prefix = prefix
 
1926
 
 
1927
 
 
1928
class MalformedTransform(InternalBzrError):
 
1929
 
 
1930
    _fmt = "Tree transform is malformed %(conflicts)r"
 
1931
 
 
1932
 
 
1933
class NoFinalPath(BzrError):
 
1934
 
 
1935
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
1936
            "file-id: %(file_id)r\n"
 
1937
            "root trans-id: %(root_trans_id)r\n")
 
1938
 
 
1939
    def __init__(self, trans_id, transform):
 
1940
        self.trans_id = trans_id
 
1941
        self.file_id = transform.final_file_id(trans_id)
 
1942
        self.root_trans_id = transform.root
 
1943
 
 
1944
 
 
1945
class BzrBadParameter(InternalBzrError):
 
1946
 
 
1947
    _fmt = "Bad parameter: %(param)r"
 
1948
 
 
1949
    # This exception should never be thrown, but it is a base class for all
 
1950
    # parameter-to-function errors.
 
1951
 
 
1952
    def __init__(self, param):
 
1953
        BzrError.__init__(self)
 
1954
        self.param = param
 
1955
 
 
1956
 
 
1957
class BzrBadParameterNotUnicode(BzrBadParameter):
 
1958
 
 
1959
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
1960
 
 
1961
 
 
1962
class ReusingTransform(BzrError):
 
1963
 
 
1964
    _fmt = "Attempt to reuse a transform that has already been applied."
 
1965
 
 
1966
 
 
1967
class CantMoveRoot(BzrError):
 
1968
 
 
1969
    _fmt = "Moving the root directory is not supported at this time"
 
1970
 
 
1971
 
 
1972
class TransformRenameFailed(BzrError):
 
1973
 
 
1974
    _fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
 
1975
 
 
1976
    def __init__(self, from_path, to_path, why, errno):
 
1977
        self.from_path = from_path
 
1978
        self.to_path = to_path
 
1979
        self.why = why
 
1980
        self.errno = errno
 
1981
 
 
1982
 
 
1983
class BzrMoveFailedError(BzrError):
 
1984
 
 
1985
    _fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
 
1986
        "%(_has_extra)s%(extra)s")
 
1987
 
 
1988
    def __init__(self, from_path='', to_path='', extra=None):
 
1989
        from breezy.osutils import splitpath
 
1990
        BzrError.__init__(self)
 
1991
        if extra:
 
1992
            self.extra, self._has_extra = extra, ': '
 
1993
        else:
 
1994
            self.extra = self._has_extra = ''
 
1995
 
 
1996
        has_from = len(from_path) > 0
 
1997
        has_to = len(to_path) > 0
 
1998
        if has_from:
 
1999
            self.from_path = splitpath(from_path)[-1]
 
2000
        else:
 
2001
            self.from_path = ''
 
2002
 
 
2003
        if has_to:
 
2004
            self.to_path = splitpath(to_path)[-1]
 
2005
        else:
 
2006
            self.to_path = ''
 
2007
 
 
2008
        self.operator = ""
 
2009
        if has_from and has_to:
 
2010
            self.operator = " =>"
 
2011
        elif has_from:
 
2012
            self.from_path = "from " + from_path
 
2013
        elif has_to:
 
2014
            self.operator = "to"
 
2015
        else:
 
2016
            self.operator = "file"
 
2017
 
 
2018
 
 
2019
class BzrRenameFailedError(BzrMoveFailedError):
 
2020
 
 
2021
    _fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
 
2022
        "%(_has_extra)s%(extra)s")
 
2023
 
 
2024
    def __init__(self, from_path, to_path, extra=None):
 
2025
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
2026
 
 
2027
 
 
2028
class BzrBadParameterNotString(BzrBadParameter):
 
2029
 
 
2030
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
2031
 
 
2032
 
 
2033
class BzrBadParameterMissing(BzrBadParameter):
 
2034
 
 
2035
    _fmt = "Parameter %(param)s is required but not present."
 
2036
 
 
2037
 
 
2038
class BzrBadParameterUnicode(BzrBadParameter):
 
2039
 
 
2040
    _fmt = ("Parameter %(param)s is unicode but"
 
2041
            " only byte-strings are permitted.")
 
2042
 
 
2043
 
 
2044
class BzrBadParameterContainsNewline(BzrBadParameter):
 
2045
 
 
2046
    _fmt = "Parameter %(param)s contains a newline."
 
2047
 
 
2048
 
 
2049
class ParamikoNotPresent(DependencyNotPresent):
 
2050
 
 
2051
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
2052
 
 
2053
    def __init__(self, error):
 
2054
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
2055
 
 
2056
 
 
2057
class PointlessMerge(BzrError):
 
2058
 
 
2059
    _fmt = "Nothing to merge."
 
2060
 
 
2061
 
 
2062
class UninitializableFormat(BzrError):
 
2063
 
 
2064
    _fmt = "Format %(format)s cannot be initialised by this version of brz."
 
2065
 
 
2066
    def __init__(self, format):
 
2067
        BzrError.__init__(self)
 
2068
        self.format = format
 
2069
 
 
2070
 
 
2071
class BadConversionTarget(BzrError):
 
2072
 
 
2073
    _fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
 
2074
            "    %(problem)s"
 
2075
 
 
2076
    def __init__(self, problem, format, from_format=None):
 
2077
        BzrError.__init__(self)
 
2078
        self.problem = problem
 
2079
        self.format = format
 
2080
        self.from_format = from_format or '(unspecified)'
 
2081
 
 
2082
 
 
2083
class NoDiffFound(BzrError):
 
2084
 
 
2085
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
2086
 
 
2087
    def __init__(self, path):
 
2088
        BzrError.__init__(self, path)
 
2089
 
 
2090
 
 
2091
class ExecutableMissing(BzrError):
 
2092
 
 
2093
    _fmt = "%(exe_name)s could not be found on this machine"
 
2094
 
 
2095
    def __init__(self, exe_name):
 
2096
        BzrError.__init__(self, exe_name=exe_name)
 
2097
 
 
2098
 
 
2099
class NoDiff(BzrError):
 
2100
 
 
2101
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
2102
 
 
2103
    def __init__(self, msg):
 
2104
        BzrError.__init__(self, msg=msg)
 
2105
 
 
2106
 
 
2107
class NoDiff3(BzrError):
 
2108
 
 
2109
    _fmt = "Diff3 is not installed on this machine."
 
2110
 
 
2111
 
 
2112
class ExistingContent(BzrError):
 
2113
    # Added in breezy 0.92, used by VersionedFile.add_lines.
 
2114
 
 
2115
    _fmt = "The content being inserted is already present."
 
2116
 
 
2117
 
 
2118
class ExistingLimbo(BzrError):
 
2119
 
 
2120
    _fmt = """This tree contains left-over files from a failed operation.
 
2121
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
2122
    keep, and delete it when you are done."""
 
2123
 
 
2124
    def __init__(self, limbo_dir):
 
2125
       BzrError.__init__(self)
 
2126
       self.limbo_dir = limbo_dir
 
2127
 
 
2128
 
 
2129
class ExistingPendingDeletion(BzrError):
 
2130
 
 
2131
    _fmt = """This tree contains left-over files from a failed operation.
 
2132
    Please examine %(pending_deletion)s to see if it contains any files you
 
2133
    wish to keep, and delete it when you are done."""
 
2134
 
 
2135
    def __init__(self, pending_deletion):
 
2136
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2137
 
 
2138
 
 
2139
class ImmortalLimbo(BzrError):
 
2140
 
 
2141
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
2142
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
2143
    keep, and delete it when you are done."""
 
2144
 
 
2145
    def __init__(self, limbo_dir):
 
2146
       BzrError.__init__(self)
 
2147
       self.limbo_dir = limbo_dir
 
2148
 
 
2149
 
 
2150
class ImmortalPendingDeletion(BzrError):
 
2151
 
 
2152
    _fmt = ("Unable to delete transform temporary directory "
 
2153
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
2154
    "contains any files you wish to keep, and delete it when you are done.")
 
2155
 
 
2156
    def __init__(self, pending_deletion):
 
2157
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2158
 
 
2159
 
 
2160
class OutOfDateTree(BzrError):
 
2161
 
 
2162
    _fmt = "Working tree is out of date, please run 'brz update'.%(more)s"
 
2163
 
 
2164
    def __init__(self, tree, more=None):
 
2165
        if more is None:
 
2166
            more = ''
 
2167
        else:
 
2168
            more = ' ' + more
 
2169
        BzrError.__init__(self)
 
2170
        self.tree = tree
 
2171
        self.more = more
 
2172
 
 
2173
 
 
2174
class PublicBranchOutOfDate(BzrError):
 
2175
 
 
2176
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
2177
        '"%(revstring)s".'
 
2178
 
 
2179
    def __init__(self, public_location, revstring):
 
2180
        import breezy.urlutils as urlutils
 
2181
        public_location = urlutils.unescape_for_display(public_location,
 
2182
                                                        'ascii')
 
2183
        BzrError.__init__(self, public_location=public_location,
 
2184
                          revstring=revstring)
 
2185
 
 
2186
 
 
2187
class MergeModifiedFormatError(BzrError):
 
2188
 
 
2189
    _fmt = "Error in merge modified format"
 
2190
 
 
2191
 
 
2192
class ConflictFormatError(BzrError):
 
2193
 
 
2194
    _fmt = "Format error in conflict listings"
 
2195
 
 
2196
 
 
2197
class CorruptDirstate(BzrError):
 
2198
 
 
2199
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
2200
            "Error: %(description)s")
 
2201
 
 
2202
    def __init__(self, dirstate_path, description):
 
2203
        BzrError.__init__(self)
 
2204
        self.dirstate_path = dirstate_path
 
2205
        self.description = description
 
2206
 
 
2207
 
 
2208
class CorruptRepository(BzrError):
 
2209
 
 
2210
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
2211
            "Please run brz reconcile on this repository.")
 
2212
 
 
2213
    def __init__(self, repo):
 
2214
        BzrError.__init__(self)
 
2215
        self.repo_path = repo.user_url
 
2216
 
 
2217
 
 
2218
class InconsistentDelta(BzrError):
 
2219
    """Used when we get a delta that is not valid."""
 
2220
 
 
2221
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
2222
            " %(file_id)r\nreason: %(reason)s")
 
2223
 
 
2224
    def __init__(self, path, file_id, reason):
 
2225
        BzrError.__init__(self)
 
2226
        self.path = path
 
2227
        self.file_id = file_id
 
2228
        self.reason = reason
 
2229
 
 
2230
 
 
2231
class InconsistentDeltaDelta(InconsistentDelta):
 
2232
    """Used when we get a delta that is not valid."""
 
2233
 
 
2234
    _fmt = ("An inconsistent delta was supplied: %(delta)r"
 
2235
            "\nreason: %(reason)s")
 
2236
 
 
2237
    def __init__(self, delta, reason):
 
2238
        BzrError.__init__(self)
 
2239
        self.delta = delta
 
2240
        self.reason = reason
 
2241
 
 
2242
 
 
2243
class UpgradeRequired(BzrError):
 
2244
 
 
2245
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
2246
 
 
2247
    def __init__(self, path):
 
2248
        BzrError.__init__(self)
 
2249
        self.path = path
 
2250
 
 
2251
 
 
2252
class RepositoryUpgradeRequired(UpgradeRequired):
 
2253
 
 
2254
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
2255
 
 
2256
 
 
2257
class RichRootUpgradeRequired(UpgradeRequired):
 
2258
 
 
2259
    _fmt = ("To use this feature you must upgrade your branch at %(path)s to"
 
2260
           " a format which supports rich roots.")
 
2261
 
 
2262
 
 
2263
class LocalRequiresBoundBranch(BzrError):
 
2264
 
 
2265
    _fmt = "Cannot perform local-only commits on unbound branches."
 
2266
 
 
2267
 
 
2268
class UnsupportedOperation(BzrError):
 
2269
 
 
2270
    _fmt = ("The method %(mname)s is not supported on"
 
2271
            " objects of type %(tname)s.")
 
2272
 
 
2273
    def __init__(self, method, method_self):
 
2274
        self.method = method
 
2275
        self.mname = method.__name__
 
2276
        self.tname = type(method_self).__name__
 
2277
 
 
2278
 
 
2279
class CannotSetRevisionId(UnsupportedOperation):
 
2280
    """Raised when a commit is attempting to set a revision id but cant."""
 
2281
 
 
2282
 
 
2283
class NonAsciiRevisionId(UnsupportedOperation):
 
2284
    """Raised when a commit is attempting to set a non-ascii revision id
 
2285
       but cant.
 
2286
    """
 
2287
 
 
2288
 
 
2289
class GhostTagsNotSupported(BzrError):
 
2290
 
 
2291
    _fmt = "Ghost tags not supported by format %(format)r."
 
2292
 
 
2293
    def __init__(self, format):
 
2294
        self.format = format
 
2295
 
 
2296
 
 
2297
class BinaryFile(BzrError):
 
2298
 
 
2299
    _fmt = "File is binary but should be text."
 
2300
 
 
2301
 
 
2302
class IllegalPath(BzrError):
 
2303
 
 
2304
    _fmt = "The path %(path)s is not permitted on this platform"
 
2305
 
 
2306
    def __init__(self, path):
 
2307
        BzrError.__init__(self)
 
2308
        self.path = path
 
2309
 
 
2310
 
 
2311
class TestamentMismatch(BzrError):
 
2312
 
 
2313
    _fmt = """Testament did not match expected value.
 
2314
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
2315
       {%(measured)s}"""
 
2316
 
 
2317
    def __init__(self, revision_id, expected, measured):
 
2318
        self.revision_id = revision_id
 
2319
        self.expected = expected
 
2320
        self.measured = measured
 
2321
 
 
2322
 
 
2323
class NotABundle(BzrError):
 
2324
 
 
2325
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
2326
 
 
2327
    def __init__(self, text):
 
2328
        BzrError.__init__(self)
 
2329
        self.text = text
 
2330
 
 
2331
 
 
2332
class BadBundle(BzrError):
 
2333
 
 
2334
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
2335
 
 
2336
    def __init__(self, text):
 
2337
        BzrError.__init__(self)
 
2338
        self.text = text
 
2339
 
 
2340
 
 
2341
class MalformedHeader(BadBundle):
 
2342
 
 
2343
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
2344
 
 
2345
 
 
2346
class MalformedPatches(BadBundle):
 
2347
 
 
2348
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
2349
 
 
2350
 
 
2351
class MalformedFooter(BadBundle):
 
2352
 
 
2353
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
2354
 
 
2355
 
 
2356
class UnsupportedEOLMarker(BadBundle):
 
2357
 
 
2358
    _fmt = "End of line marker was not \\n in bzr revision-bundle"
 
2359
 
 
2360
    def __init__(self):
 
2361
        # XXX: BadBundle's constructor assumes there's explanatory text,
 
2362
        # but for this there is not
 
2363
        BzrError.__init__(self)
 
2364
 
 
2365
 
 
2366
class IncompatibleBundleFormat(BzrError):
 
2367
 
 
2368
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
2369
 
 
2370
    def __init__(self, bundle_format, other):
 
2371
        BzrError.__init__(self)
 
2372
        self.bundle_format = bundle_format
 
2373
        self.other = other
 
2374
 
 
2375
 
 
2376
class BadInventoryFormat(BzrError):
 
2377
 
 
2378
    _fmt = "Root class for inventory serialization errors"
 
2379
 
 
2380
 
 
2381
class UnexpectedInventoryFormat(BadInventoryFormat):
 
2382
 
 
2383
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
2384
 
 
2385
    def __init__(self, msg):
 
2386
        BadInventoryFormat.__init__(self, msg=msg)
 
2387
 
 
2388
 
 
2389
class RootNotRich(BzrError):
 
2390
 
 
2391
    _fmt = """This operation requires rich root data storage"""
 
2392
 
 
2393
 
 
2394
class NoSmartMedium(InternalBzrError):
 
2395
 
 
2396
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
2397
 
 
2398
    def __init__(self, transport):
 
2399
        self.transport = transport
 
2400
 
 
2401
 
 
2402
class UnknownSSH(BzrError):
 
2403
 
 
2404
    _fmt = "Unrecognised value for BRZ_SSH environment variable: %(vendor)s"
 
2405
 
 
2406
    def __init__(self, vendor):
 
2407
        BzrError.__init__(self)
 
2408
        self.vendor = vendor
 
2409
 
 
2410
 
 
2411
class SSHVendorNotFound(BzrError):
 
2412
 
 
2413
    _fmt = ("Don't know how to handle SSH connections."
 
2414
            " Please set BRZ_SSH environment variable.")
 
2415
 
 
2416
 
 
2417
class GhostRevisionsHaveNoRevno(BzrError):
 
2418
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
2419
 
 
2420
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
2421
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
2422
 
 
2423
    def __init__(self, revision_id, ghost_revision_id):
 
2424
        self.revision_id = revision_id
 
2425
        self.ghost_revision_id = ghost_revision_id
 
2426
 
 
2427
 
 
2428
class GhostRevisionUnusableHere(BzrError):
 
2429
 
 
2430
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
2431
 
 
2432
    def __init__(self, revision_id):
 
2433
        BzrError.__init__(self)
 
2434
        self.revision_id = revision_id
 
2435
 
 
2436
 
 
2437
class IllegalUseOfScopeReplacer(InternalBzrError):
 
2438
 
 
2439
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
2440
            " %(msg)s%(extra)s")
 
2441
 
 
2442
    def __init__(self, name, msg, extra=None):
 
2443
        BzrError.__init__(self)
 
2444
        self.name = name
 
2445
        self.msg = msg
 
2446
        if extra:
 
2447
            self.extra = ': ' + str(extra)
 
2448
        else:
 
2449
            self.extra = ''
 
2450
 
 
2451
 
 
2452
class InvalidImportLine(InternalBzrError):
 
2453
 
 
2454
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
2455
 
 
2456
    def __init__(self, text, msg):
 
2457
        BzrError.__init__(self)
 
2458
        self.text = text
 
2459
        self.msg = msg
 
2460
 
 
2461
 
 
2462
class ImportNameCollision(InternalBzrError):
 
2463
 
 
2464
    _fmt = ("Tried to import an object to the same name as"
 
2465
            " an existing object. %(name)s")
 
2466
 
 
2467
    def __init__(self, name):
 
2468
        BzrError.__init__(self)
 
2469
        self.name = name
 
2470
 
 
2471
 
 
2472
class NotAMergeDirective(BzrError):
 
2473
    """File starting with %(firstline)r is not a merge directive"""
 
2474
    def __init__(self, firstline):
 
2475
        BzrError.__init__(self, firstline=firstline)
 
2476
 
 
2477
 
 
2478
class NoMergeSource(BzrError):
 
2479
    """Raise if no merge source was specified for a merge directive"""
 
2480
 
 
2481
    _fmt = "A merge directive must provide either a bundle or a public"\
 
2482
        " branch location."
 
2483
 
 
2484
 
 
2485
class IllegalMergeDirectivePayload(BzrError):
 
2486
    """A merge directive contained something other than a patch or bundle"""
 
2487
 
 
2488
    _fmt = "Bad merge directive payload %(start)r"
 
2489
 
 
2490
    def __init__(self, start):
 
2491
        BzrError(self)
 
2492
        self.start = start
 
2493
 
 
2494
 
 
2495
class PatchVerificationFailed(BzrError):
 
2496
    """A patch from a merge directive could not be verified"""
 
2497
 
 
2498
    _fmt = "Preview patch does not match requested changes."
 
2499
 
 
2500
 
 
2501
class PatchMissing(BzrError):
 
2502
    """Raise a patch type was specified but no patch supplied"""
 
2503
 
 
2504
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
2505
 
 
2506
    def __init__(self, patch_type):
 
2507
        BzrError.__init__(self)
 
2508
        self.patch_type = patch_type
 
2509
 
 
2510
 
 
2511
class TargetNotBranch(BzrError):
 
2512
    """A merge directive's target branch is required, but isn't a branch"""
 
2513
 
 
2514
    _fmt = ("Your branch does not have all of the revisions required in "
 
2515
            "order to merge this merge directive and the target "
 
2516
            "location specified in the merge directive is not a branch: "
 
2517
            "%(location)s.")
 
2518
 
 
2519
    def __init__(self, location):
 
2520
        BzrError.__init__(self)
 
2521
        self.location = location
 
2522
 
 
2523
 
 
2524
class UnsupportedInventoryKind(BzrError):
 
2525
 
 
2526
    _fmt = """Unsupported entry kind %(kind)s"""
 
2527
 
 
2528
    def __init__(self, kind):
 
2529
        self.kind = kind
 
2530
 
 
2531
 
 
2532
class BadSubsumeSource(BzrError):
 
2533
 
 
2534
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
2535
 
 
2536
    def __init__(self, tree, other_tree, reason):
 
2537
        self.tree = tree
 
2538
        self.other_tree = other_tree
 
2539
        self.reason = reason
 
2540
 
 
2541
 
 
2542
class SubsumeTargetNeedsUpgrade(BzrError):
 
2543
 
 
2544
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
2545
 
 
2546
    def __init__(self, other_tree):
 
2547
        self.other_tree = other_tree
 
2548
 
 
2549
 
 
2550
class BadReferenceTarget(InternalBzrError):
 
2551
 
 
2552
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
2553
           "%(reason)s"
 
2554
 
 
2555
    def __init__(self, tree, other_tree, reason):
 
2556
        self.tree = tree
 
2557
        self.other_tree = other_tree
 
2558
        self.reason = reason
 
2559
 
 
2560
 
 
2561
class NoSuchTag(BzrError):
 
2562
 
 
2563
    _fmt = "No such tag: %(tag_name)s"
 
2564
 
 
2565
    def __init__(self, tag_name):
 
2566
        self.tag_name = tag_name
 
2567
 
 
2568
 
 
2569
class TagsNotSupported(BzrError):
 
2570
 
 
2571
    _fmt = ("Tags not supported by %(branch)s;"
 
2572
            " you may be able to use brz upgrade.")
 
2573
 
 
2574
    def __init__(self, branch):
 
2575
        self.branch = branch
 
2576
 
 
2577
 
 
2578
class TagAlreadyExists(BzrError):
 
2579
 
 
2580
    _fmt = "Tag %(tag_name)s already exists."
 
2581
 
 
2582
    def __init__(self, tag_name):
 
2583
        self.tag_name = tag_name
 
2584
 
 
2585
 
 
2586
class MalformedBugIdentifier(BzrError):
 
2587
 
 
2588
    _fmt = ('Did not understand bug identifier %(bug_id)s: %(reason)s. '
 
2589
            'See "brz help bugs" for more information on this feature.')
 
2590
 
 
2591
    def __init__(self, bug_id, reason):
 
2592
        self.bug_id = bug_id
 
2593
        self.reason = reason
 
2594
 
 
2595
 
 
2596
class InvalidBugTrackerURL(BzrError):
 
2597
 
 
2598
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
2599
            "contain {id}: %(url)s")
 
2600
 
 
2601
    def __init__(self, abbreviation, url):
 
2602
        self.abbreviation = abbreviation
 
2603
        self.url = url
 
2604
 
 
2605
 
 
2606
class UnknownBugTrackerAbbreviation(BzrError):
 
2607
 
 
2608
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
2609
            "on %(branch)s")
 
2610
 
 
2611
    def __init__(self, abbreviation, branch):
 
2612
        self.abbreviation = abbreviation
 
2613
        self.branch = branch
 
2614
 
 
2615
 
 
2616
class InvalidLineInBugsProperty(BzrError):
 
2617
 
 
2618
    _fmt = ("Invalid line in bugs property: '%(line)s'")
 
2619
 
 
2620
    def __init__(self, line):
 
2621
        self.line = line
 
2622
 
 
2623
 
 
2624
class InvalidBugStatus(BzrError):
 
2625
 
 
2626
    _fmt = ("Invalid bug status: '%(status)s'")
 
2627
 
 
2628
    def __init__(self, status):
 
2629
        self.status = status
 
2630
 
 
2631
 
 
2632
class UnexpectedSmartServerResponse(BzrError):
 
2633
 
 
2634
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
2635
 
 
2636
    def __init__(self, response_tuple):
 
2637
        self.response_tuple = response_tuple
 
2638
 
 
2639
 
 
2640
class ErrorFromSmartServer(BzrError):
 
2641
    """An error was received from a smart server.
 
2642
 
 
2643
    :seealso: UnknownErrorFromSmartServer
 
2644
    """
 
2645
 
 
2646
    _fmt = "Error received from smart server: %(error_tuple)r"
 
2647
 
 
2648
    internal_error = True
 
2649
 
 
2650
    def __init__(self, error_tuple):
 
2651
        self.error_tuple = error_tuple
 
2652
        try:
 
2653
            self.error_verb = error_tuple[0]
 
2654
        except IndexError:
 
2655
            self.error_verb = None
 
2656
        self.error_args = error_tuple[1:]
 
2657
 
 
2658
 
 
2659
class UnknownErrorFromSmartServer(BzrError):
 
2660
    """An ErrorFromSmartServer could not be translated into a typical breezy
 
2661
    error.
 
2662
 
 
2663
    This is distinct from ErrorFromSmartServer so that it is possible to
 
2664
    distinguish between the following two cases:
 
2665
 
 
2666
    - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
2667
      and so should provoke a traceback to the user.
 
2668
    - ErrorFromSmartServer was caught but its error_tuple could not be
 
2669
      translated.  This is probably because the server sent us garbage, and
 
2670
      should not provoke a traceback.
 
2671
    """
 
2672
 
 
2673
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
2674
 
 
2675
    internal_error = False
 
2676
 
 
2677
    def __init__(self, error_from_smart_server):
 
2678
        """Constructor.
 
2679
 
 
2680
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
2681
        """
 
2682
        self.error_from_smart_server = error_from_smart_server
 
2683
        self.error_tuple = error_from_smart_server.error_tuple
 
2684
 
 
2685
 
 
2686
class ContainerError(BzrError):
 
2687
    """Base class of container errors."""
 
2688
 
 
2689
 
 
2690
class UnknownContainerFormatError(ContainerError):
 
2691
 
 
2692
    _fmt = "Unrecognised container format: %(container_format)r"
 
2693
 
 
2694
    def __init__(self, container_format):
 
2695
        self.container_format = container_format
 
2696
 
 
2697
 
 
2698
class UnexpectedEndOfContainerError(ContainerError):
 
2699
 
 
2700
    _fmt = "Unexpected end of container stream"
 
2701
 
 
2702
 
 
2703
class UnknownRecordTypeError(ContainerError):
 
2704
 
 
2705
    _fmt = "Unknown record type: %(record_type)r"
 
2706
 
 
2707
    def __init__(self, record_type):
 
2708
        self.record_type = record_type
 
2709
 
 
2710
 
 
2711
class InvalidRecordError(ContainerError):
 
2712
 
 
2713
    _fmt = "Invalid record: %(reason)s"
 
2714
 
 
2715
    def __init__(self, reason):
 
2716
        self.reason = reason
 
2717
 
 
2718
 
 
2719
class ContainerHasExcessDataError(ContainerError):
 
2720
 
 
2721
    _fmt = "Container has data after end marker: %(excess)r"
 
2722
 
 
2723
    def __init__(self, excess):
 
2724
        self.excess = excess
 
2725
 
 
2726
 
 
2727
class DuplicateRecordNameError(ContainerError):
 
2728
 
 
2729
    _fmt = "Container has multiple records with the same name: %(name)s"
 
2730
 
 
2731
    def __init__(self, name):
 
2732
        self.name = name.decode("utf-8")
 
2733
 
 
2734
 
 
2735
class NoDestinationAddress(InternalBzrError):
 
2736
 
 
2737
    _fmt = "Message does not have a destination address."
 
2738
 
 
2739
 
 
2740
class RepositoryDataStreamError(BzrError):
 
2741
 
 
2742
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
2743
 
 
2744
    def __init__(self, reason):
 
2745
        self.reason = reason
 
2746
 
 
2747
 
 
2748
class SMTPError(BzrError):
 
2749
 
 
2750
    _fmt = "SMTP error: %(error)s"
 
2751
 
 
2752
    def __init__(self, error):
 
2753
        self.error = error
 
2754
 
 
2755
 
 
2756
class NoMessageSupplied(BzrError):
 
2757
 
 
2758
    _fmt = "No message supplied."
 
2759
 
 
2760
 
 
2761
class NoMailAddressSpecified(BzrError):
 
2762
 
 
2763
    _fmt = "No mail-to address (--mail-to) or output (-o) specified."
 
2764
 
 
2765
 
 
2766
class MailClientNotFound(BzrError):
 
2767
 
 
2768
    _fmt = "Unable to find mail client with the following names:"\
 
2769
        " %(mail_command_list_string)s"
 
2770
 
 
2771
    def __init__(self, mail_command_list):
 
2772
        mail_command_list_string = ', '.join(mail_command_list)
 
2773
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
2774
                          mail_command_list_string=mail_command_list_string)
 
2775
 
 
2776
class SMTPConnectionRefused(SMTPError):
 
2777
 
 
2778
    _fmt = "SMTP connection to %(host)s refused"
 
2779
 
 
2780
    def __init__(self, error, host):
 
2781
        self.error = error
 
2782
        self.host = host
 
2783
 
 
2784
 
 
2785
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
2786
 
 
2787
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
2788
 
 
2789
 
 
2790
class BzrDirError(BzrError):
 
2791
 
 
2792
    def __init__(self, controldir):
 
2793
        from . import urlutils
 
2794
        display_url = urlutils.unescape_for_display(controldir.user_url,
 
2795
                                                    'ascii')
 
2796
        BzrError.__init__(self, controldir=controldir, display_url=display_url)
 
2797
 
 
2798
 
 
2799
class UnsyncedBranches(BzrDirError):
 
2800
 
 
2801
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
2802
            " brz help sync-for-reconfigure.")
 
2803
 
 
2804
    def __init__(self, controldir, target_branch):
 
2805
        BzrError.__init__(self, controldir)
 
2806
        from . import urlutils
 
2807
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
2808
                                                        'ascii')
 
2809
 
 
2810
 
 
2811
class AlreadyBranch(BzrDirError):
 
2812
 
 
2813
    _fmt = "'%(display_url)s' is already a branch."
 
2814
 
 
2815
 
 
2816
class AlreadyTree(BzrDirError):
 
2817
 
 
2818
    _fmt = "'%(display_url)s' is already a tree."
 
2819
 
 
2820
 
 
2821
class AlreadyCheckout(BzrDirError):
 
2822
 
 
2823
    _fmt = "'%(display_url)s' is already a checkout."
 
2824
 
 
2825
 
 
2826
class AlreadyLightweightCheckout(BzrDirError):
 
2827
 
 
2828
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
2829
 
 
2830
 
 
2831
class AlreadyUsingShared(BzrDirError):
 
2832
 
 
2833
    _fmt = "'%(display_url)s' is already using a shared repository."
 
2834
 
 
2835
 
 
2836
class AlreadyStandalone(BzrDirError):
 
2837
 
 
2838
    _fmt = "'%(display_url)s' is already standalone."
 
2839
 
 
2840
 
 
2841
class AlreadyWithTrees(BzrDirError):
 
2842
 
 
2843
    _fmt = ("Shared repository '%(display_url)s' already creates "
 
2844
            "working trees.")
 
2845
 
 
2846
 
 
2847
class AlreadyWithNoTrees(BzrDirError):
 
2848
 
 
2849
    _fmt = ("Shared repository '%(display_url)s' already doesn't create "
 
2850
            "working trees.")
 
2851
 
 
2852
 
 
2853
class ReconfigurationNotSupported(BzrDirError):
 
2854
 
 
2855
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
2856
 
 
2857
 
 
2858
class NoBindLocation(BzrDirError):
 
2859
 
 
2860
    _fmt = "No location could be found to bind to at %(display_url)s."
 
2861
 
 
2862
 
 
2863
class UncommittedChanges(BzrError):
 
2864
 
 
2865
    _fmt = ('Working tree "%(display_url)s" has uncommitted changes'
 
2866
            ' (See brz status).%(more)s')
 
2867
 
 
2868
    def __init__(self, tree, more=None):
 
2869
        if more is None:
 
2870
            more = ''
 
2871
        else:
 
2872
            more = ' ' + more
 
2873
        import breezy.urlutils as urlutils
 
2874
        user_url = getattr(tree, "user_url", None)
 
2875
        if user_url is None:
 
2876
            display_url = str(tree)
 
2877
        else:
 
2878
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
 
2879
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
 
2880
 
 
2881
 
 
2882
class StoringUncommittedNotSupported(BzrError):
 
2883
 
 
2884
    _fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
 
2885
            ' changes.')
 
2886
 
 
2887
    def __init__(self, branch):
 
2888
        import breezy.urlutils as urlutils
 
2889
        user_url = getattr(branch, "user_url", None)
 
2890
        if user_url is None:
 
2891
            display_url = str(branch)
 
2892
        else:
 
2893
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
 
2894
        BzrError.__init__(self, branch=branch, display_url=display_url)
 
2895
 
 
2896
 
 
2897
class ShelvedChanges(UncommittedChanges):
 
2898
 
 
2899
    _fmt = ('Working tree "%(display_url)s" has shelved changes'
 
2900
            ' (See brz shelve --list).%(more)s')
 
2901
 
 
2902
 
 
2903
class MissingTemplateVariable(BzrError):
 
2904
 
 
2905
    _fmt = 'Variable {%(name)s} is not available.'
 
2906
 
 
2907
    def __init__(self, name):
 
2908
        self.name = name
 
2909
 
 
2910
 
 
2911
class NoTemplate(BzrError):
 
2912
 
 
2913
    _fmt = 'No template specified.'
 
2914
 
 
2915
 
 
2916
class UnableCreateSymlink(BzrError):
 
2917
 
 
2918
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
2919
 
 
2920
    def __init__(self, path=None):
 
2921
        path_str = ''
 
2922
        if path:
 
2923
            try:
 
2924
                path_str = repr(str(path))
 
2925
            except UnicodeEncodeError:
 
2926
                path_str = repr(path)
 
2927
            path_str += ' '
 
2928
        self.path_str = path_str
 
2929
 
 
2930
 
 
2931
class UnsupportedTimezoneFormat(BzrError):
 
2932
 
 
2933
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
2934
            'options are "utc", "original", "local".')
 
2935
 
 
2936
    def __init__(self, timezone):
 
2937
        self.timezone = timezone
 
2938
 
 
2939
 
 
2940
class CommandAvailableInPlugin(Exception):
 
2941
 
 
2942
    internal_error = False
 
2943
 
 
2944
    def __init__(self, cmd_name, plugin_metadata, provider):
 
2945
 
 
2946
        self.plugin_metadata = plugin_metadata
 
2947
        self.cmd_name = cmd_name
 
2948
        self.provider = provider
 
2949
 
 
2950
    def __str__(self):
 
2951
 
 
2952
        _fmt = ('"%s" is not a standard brz command. \n'
 
2953
                'However, the following official plugin provides this command: %s\n'
 
2954
                'You can install it by going to: %s'
 
2955
                % (self.cmd_name, self.plugin_metadata['name'],
 
2956
                    self.plugin_metadata['url']))
 
2957
 
 
2958
        return _fmt
 
2959
 
 
2960
 
 
2961
class NoPluginAvailable(BzrError):
 
2962
    pass
 
2963
 
 
2964
 
 
2965
class UnableEncodePath(BzrError):
 
2966
 
 
2967
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
2968
            'user encoding %(user_encoding)s')
 
2969
 
 
2970
    def __init__(self, path, kind):
 
2971
        from breezy.osutils import get_user_encoding
 
2972
        self.path = path
 
2973
        self.kind = kind
 
2974
        self.user_encoding = get_user_encoding()
 
2975
 
 
2976
 
 
2977
class NoSuchConfig(BzrError):
 
2978
 
 
2979
    _fmt = ('The "%(config_id)s" configuration does not exist.')
 
2980
 
 
2981
    def __init__(self, config_id):
 
2982
        BzrError.__init__(self, config_id=config_id)
 
2983
 
 
2984
 
 
2985
class NoSuchConfigOption(BzrError):
 
2986
 
 
2987
    _fmt = ('The "%(option_name)s" configuration option does not exist.')
 
2988
 
 
2989
    def __init__(self, option_name):
 
2990
        BzrError.__init__(self, option_name=option_name)
 
2991
 
 
2992
 
 
2993
class NoSuchAlias(BzrError):
 
2994
 
 
2995
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
2996
 
 
2997
    def __init__(self, alias_name):
 
2998
        BzrError.__init__(self, alias_name=alias_name)
 
2999
 
 
3000
 
 
3001
class DirectoryLookupFailure(BzrError):
 
3002
    """Base type for lookup errors."""
 
3003
 
 
3004
    pass
 
3005
 
 
3006
 
 
3007
class InvalidLocationAlias(DirectoryLookupFailure):
 
3008
 
 
3009
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
3010
 
 
3011
    def __init__(self, alias_name):
 
3012
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
3013
 
 
3014
 
 
3015
class UnsetLocationAlias(DirectoryLookupFailure):
 
3016
 
 
3017
    _fmt = 'No %(alias_name)s location assigned.'
 
3018
 
 
3019
    def __init__(self, alias_name):
 
3020
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
3021
 
 
3022
 
 
3023
class CannotBindAddress(BzrError):
 
3024
 
 
3025
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
3026
 
 
3027
    def __init__(self, host, port, orig_error):
 
3028
        # nb: in python2.4 socket.error doesn't have a useful repr
 
3029
        BzrError.__init__(self, host=host, port=port,
 
3030
            orig_error=repr(orig_error.args))
 
3031
 
 
3032
 
 
3033
class UnknownRules(BzrError):
 
3034
 
 
3035
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
3036
 
 
3037
    def __init__(self, unknowns):
 
3038
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
3039
 
 
3040
 
 
3041
class TipChangeRejected(BzrError):
 
3042
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
3043
    explicitly abort a change to a branch tip.
 
3044
    """
 
3045
 
 
3046
    _fmt = u"Tip change rejected: %(msg)s"
 
3047
 
 
3048
    def __init__(self, msg):
 
3049
        self.msg = msg
 
3050
 
 
3051
 
 
3052
class ShelfCorrupt(BzrError):
 
3053
 
 
3054
    _fmt = "Shelf corrupt."
 
3055
 
 
3056
 
 
3057
class DecompressCorruption(BzrError):
 
3058
 
 
3059
    _fmt = "Corruption while decompressing repository file%(orig_error)s"
 
3060
 
 
3061
    def __init__(self, orig_error=None):
 
3062
        if orig_error is not None:
 
3063
            self.orig_error = ", %s" % (orig_error,)
 
3064
        else:
 
3065
            self.orig_error = ""
 
3066
        BzrError.__init__(self)
 
3067
 
 
3068
 
 
3069
class NoSuchShelfId(BzrError):
 
3070
 
 
3071
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
 
3072
 
 
3073
    def __init__(self, shelf_id):
 
3074
        BzrError.__init__(self, shelf_id=shelf_id)
 
3075
 
 
3076
 
 
3077
class InvalidShelfId(BzrError):
 
3078
 
 
3079
    _fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
 
3080
 
 
3081
    def __init__(self, invalid_id):
 
3082
        BzrError.__init__(self, invalid_id=invalid_id)
 
3083
 
 
3084
 
 
3085
class JailBreak(BzrError):
 
3086
 
 
3087
    _fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
 
3088
 
 
3089
    def __init__(self, url):
 
3090
        BzrError.__init__(self, url=url)
 
3091
 
 
3092
 
 
3093
class UserAbort(BzrError):
 
3094
 
 
3095
    _fmt = 'The user aborted the operation.'
 
3096
 
 
3097
 
 
3098
class MustHaveWorkingTree(BzrError):
 
3099
 
 
3100
    _fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
 
3101
 
 
3102
    def __init__(self, format, url):
 
3103
        BzrError.__init__(self, format=format, url=url)
 
3104
 
 
3105
 
 
3106
class NoSuchView(BzrError):
 
3107
    """A view does not exist.
 
3108
    """
 
3109
 
 
3110
    _fmt = u"No such view: %(view_name)s."
 
3111
 
 
3112
    def __init__(self, view_name):
 
3113
        self.view_name = view_name
 
3114
 
 
3115
 
 
3116
class ViewsNotSupported(BzrError):
 
3117
    """Views are not supported by a tree format.
 
3118
    """
 
3119
 
 
3120
    _fmt = ("Views are not supported by %(tree)s;"
 
3121
            " use 'brz upgrade' to change your tree to a later format.")
 
3122
 
 
3123
    def __init__(self, tree):
 
3124
        self.tree = tree
 
3125
 
 
3126
 
 
3127
class FileOutsideView(BzrError):
 
3128
 
 
3129
    _fmt = ('Specified file "%(file_name)s" is outside the current view: '
 
3130
            '%(view_str)s')
 
3131
 
 
3132
    def __init__(self, file_name, view_files):
 
3133
        self.file_name = file_name
 
3134
        self.view_str = ", ".join(view_files)
 
3135
 
 
3136
 
 
3137
class UnresumableWriteGroup(BzrError):
 
3138
 
 
3139
    _fmt = ("Repository %(repository)s cannot resume write group "
 
3140
            "%(write_groups)r: %(reason)s")
 
3141
 
 
3142
    internal_error = True
 
3143
 
 
3144
    def __init__(self, repository, write_groups, reason):
 
3145
        self.repository = repository
 
3146
        self.write_groups = write_groups
 
3147
        self.reason = reason
 
3148
 
 
3149
 
 
3150
class UnsuspendableWriteGroup(BzrError):
 
3151
 
 
3152
    _fmt = ("Repository %(repository)s cannot suspend a write group.")
 
3153
 
 
3154
    internal_error = True
 
3155
 
 
3156
    def __init__(self, repository):
 
3157
        self.repository = repository
 
3158
 
 
3159
 
 
3160
class LossyPushToSameVCS(BzrError):
 
3161
 
 
3162
    _fmt = ("Lossy push not possible between %(source_branch)r and "
 
3163
            "%(target_branch)r that are in the same VCS.")
 
3164
 
 
3165
    internal_error = True
 
3166
 
 
3167
    def __init__(self, source_branch, target_branch):
 
3168
        self.source_branch = source_branch
 
3169
        self.target_branch = target_branch
 
3170
 
 
3171
 
 
3172
class NoRoundtrippingSupport(BzrError):
 
3173
 
 
3174
    _fmt = ("Roundtripping is not supported between %(source_branch)r and "
 
3175
            "%(target_branch)r.")
 
3176
 
 
3177
    internal_error = True
 
3178
 
 
3179
    def __init__(self, source_branch, target_branch):
 
3180
        self.source_branch = source_branch
 
3181
        self.target_branch = target_branch
 
3182
 
 
3183
 
 
3184
class FileTimestampUnavailable(BzrError):
 
3185
 
 
3186
    _fmt = "The filestamp for %(path)s is not available."
 
3187
 
 
3188
    internal_error = True
 
3189
 
 
3190
    def __init__(self, path):
 
3191
        self.path = path
 
3192
 
 
3193
 
 
3194
class NoColocatedBranchSupport(BzrError):
 
3195
 
 
3196
    _fmt = ("%(controldir)r does not support co-located branches.")
 
3197
 
 
3198
    def __init__(self, controldir):
 
3199
        self.controldir = controldir
 
3200
 
 
3201
 
 
3202
class NoWhoami(BzrError):
 
3203
 
 
3204
    _fmt = ('Unable to determine your name.\n'
 
3205
        "Please, set your name with the 'whoami' command.\n"
 
3206
        'E.g. brz whoami "Your Name <name@example.com>"')
 
3207
 
 
3208
 
 
3209
class InvalidPattern(BzrError):
 
3210
 
 
3211
    _fmt = ('Invalid pattern(s) found. %(msg)s')
 
3212
 
 
3213
    def __init__(self, msg):
 
3214
        self.msg = msg
 
3215
 
 
3216
 
 
3217
class RecursiveBind(BzrError):
 
3218
 
 
3219
    _fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
 
3220
        'Please use `brz unbind` to fix.')
 
3221
 
 
3222
    def __init__(self, branch_url):
 
3223
        self.branch_url = branch_url
 
3224
 
 
3225
 
 
3226
# FIXME: I would prefer to define the config related exception classes in
 
3227
# config.py but the lazy import mechanism proscribes this -- vila 20101222
 
3228
class OptionExpansionLoop(BzrError):
 
3229
 
 
3230
    _fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
 
3231
 
 
3232
    def __init__(self, string, refs):
 
3233
        self.string = string
 
3234
        self.refs = '->'.join(refs)
 
3235
 
 
3236
 
 
3237
class ExpandingUnknownOption(BzrError):
 
3238
 
 
3239
    _fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
 
3240
 
 
3241
    def __init__(self, name, string):
 
3242
        self.name = name
 
3243
        self.string = string
 
3244
 
 
3245
 
 
3246
class IllegalOptionName(BzrError):
 
3247
 
 
3248
    _fmt = 'Option "%(name)s" is not allowed.'
 
3249
 
 
3250
    def __init__(self, name):
 
3251
        self.name = name
 
3252
 
 
3253
 
 
3254
class NoCompatibleInter(BzrError):
 
3255
 
 
3256
    _fmt = ('No compatible object available for operations from %(source)r '
 
3257
            'to %(target)r.')
 
3258
 
 
3259
    def __init__(self, source, target):
 
3260
        self.source = source
 
3261
        self.target = target
 
3262
 
 
3263
 
 
3264
class HpssVfsRequestNotAllowed(BzrError):
 
3265
 
 
3266
    _fmt = ("VFS requests over the smart server are not allowed. Encountered: "
 
3267
            "%(method)s, %(arguments)s.")
 
3268
 
 
3269
    def __init__(self, method, arguments):
 
3270
        self.method = method
 
3271
        self.arguments = arguments
 
3272
 
 
3273
 
 
3274
class UnsupportedKindChange(BzrError):
 
3275
 
 
3276
    _fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
 
3277
            "%(path)s not supported by format %(format)r")
 
3278
 
 
3279
    def __init__(self, path, from_kind, to_kind, format):
 
3280
        self.path = path
 
3281
        self.from_kind = from_kind
 
3282
        self.to_kind = to_kind
 
3283
        self.format = format
 
3284
 
 
3285
 
 
3286
class MissingFeature(BzrError):
 
3287
 
 
3288
    _fmt = ("Missing feature %(feature)s not provided by this "
 
3289
            "version of Bazaar or any plugin.")
 
3290
 
 
3291
    def __init__(self, feature):
 
3292
        self.feature = feature
 
3293
 
 
3294
 
 
3295
class PatchSyntax(BzrError):
 
3296
    """Base class for patch syntax errors."""
 
3297
 
 
3298
 
 
3299
class BinaryFiles(BzrError):
 
3300
 
 
3301
    _fmt = 'Binary files section encountered.'
 
3302
 
 
3303
    def __init__(self, orig_name, mod_name):
 
3304
        self.orig_name = orig_name
 
3305
        self.mod_name = mod_name
 
3306
 
 
3307
 
 
3308
class MalformedPatchHeader(PatchSyntax):
 
3309
 
 
3310
    _fmt = "Malformed patch header.  %(desc)s\n%(line)r"
 
3311
 
 
3312
    def __init__(self, desc, line):
 
3313
        self.desc = desc
 
3314
        self.line = line
 
3315
 
 
3316
 
 
3317
class MalformedHunkHeader(PatchSyntax):
 
3318
 
 
3319
    _fmt = "Malformed hunk header.  %(desc)s\n%(line)r"
 
3320
 
 
3321
    def __init__(self, desc, line):
 
3322
        self.desc = desc
 
3323
        self.line = line
 
3324
 
 
3325
 
 
3326
class MalformedLine(PatchSyntax):
 
3327
 
 
3328
    _fmt = "Malformed line.  %(desc)s\n%(line)r"
 
3329
 
 
3330
    def __init__(self, desc, line):
 
3331
        self.desc = desc
 
3332
        self.line = line
 
3333
 
 
3334
 
 
3335
class PatchConflict(BzrError):
 
3336
 
 
3337
    _fmt = ('Text contents mismatch at line %(line_no)d.  Original has '
 
3338
            '"%(orig_line)s", but patch says it should be "%(patch_line)s"')
 
3339
 
 
3340
    def __init__(self, line_no, orig_line, patch_line):
 
3341
        self.line_no = line_no
 
3342
        self.orig_line = orig_line.rstrip('\n')
 
3343
        self.patch_line = patch_line.rstrip('\n')
 
3344
 
 
3345
 
 
3346
class FeatureAlreadyRegistered(BzrError):
 
3347
 
 
3348
    _fmt = 'The feature %(feature)s has already been registered.'
 
3349
 
 
3350
    def __init__(self, feature):
 
3351
        self.feature = feature
 
3352
 
 
3353
 
 
3354
class ChangesAlreadyStored(BzrCommandError):
 
3355
 
 
3356
    _fmt = ('Cannot store uncommitted changes because this branch already'
 
3357
            ' stores uncommitted changes.')