~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: INADA Naoki
  • Date: 2011-05-05 09:15:34 UTC
  • mto: (5830.3.3 i18n-msgfmt)
  • mto: This revision was merged to the branch mainline in revision 5873.
  • Revision ID: songofacandy@gmail.com-20110505091534-7sv835xpofwrmpt4
Add update-pot command to Makefile and tools/bzrgettext script that
extracts help text from bzr commands.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
636
636
        self.url = url
637
637
 
638
638
 
 
639
class UnstackableLocationError(BzrError):
 
640
 
 
641
    _fmt = "The branch '%(branch_url)s' cannot be stacked on '%(target_url)s'."
 
642
 
 
643
    def __init__(self, branch_url, target_url):
 
644
        BzrError.__init__(self)
 
645
        self.branch_url = branch_url
 
646
        self.target_url = target_url
 
647
 
 
648
 
639
649
class UnstackableRepositoryFormat(BzrError):
640
650
 
641
651
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
670
680
 
671
681
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
672
682
 
673
 
    internal_error = True
 
683
    internal_error = False
674
684
 
675
685
    def __init__(self, path, base, extra=None):
676
686
        BzrError.__init__(self)
692
702
# TODO: Probably this behavior of should be a common superclass
693
703
class NotBranchError(PathError):
694
704
 
695
 
    _fmt = 'Not a branch: "%(path)s".'
 
705
    _fmt = 'Not a branch: "%(path)s"%(detail)s.'
696
706
 
697
 
    def __init__(self, path):
 
707
    def __init__(self, path, detail=None, bzrdir=None):
698
708
       import bzrlib.urlutils as urlutils
699
 
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
709
       path = urlutils.unescape_for_display(path, 'ascii')
 
710
       if detail is not None:
 
711
           detail = ': ' + detail
 
712
       self.detail = detail
 
713
       self.bzrdir = bzrdir
 
714
       PathError.__init__(self, path=path)
 
715
 
 
716
    def __repr__(self):
 
717
        return '<%s %r>' % (self.__class__.__name__, self.__dict__)
 
718
 
 
719
    def _format(self):
 
720
        # XXX: Ideally self.detail would be a property, but Exceptions in
 
721
        # Python 2.4 have to be old-style classes so properties don't work.
 
722
        # Instead we override _format.
 
723
        if self.detail is None:
 
724
            if self.bzrdir is not None:
 
725
                try:
 
726
                    self.bzrdir.open_repository()
 
727
                except NoRepositoryPresent:
 
728
                    self.detail = ''
 
729
                except Exception:
 
730
                    # Just ignore unexpected errors.  Raising arbitrary errors
 
731
                    # during str(err) can provoke strange bugs.  Concretely
 
732
                    # Launchpad's codehosting managed to raise NotBranchError
 
733
                    # here, and then get stuck in an infinite loop/recursion
 
734
                    # trying to str() that error.  All this error really cares
 
735
                    # about that there's no working repository there, and if
 
736
                    # open_repository() fails, there probably isn't.
 
737
                    self.detail = ''
 
738
                else:
 
739
                    self.detail = ': location is a repository'
 
740
            else:
 
741
                self.detail = ''
 
742
        return PathError._format(self)
700
743
 
701
744
 
702
745
class NoSubmitBranch(PathError):
751
794
 
752
795
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
753
796
 
 
797
    # use PathNotChild instead
 
798
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
754
799
    def __init__(self, branch, path):
755
800
        BzrError.__init__(self)
756
801
        self.branch = branch
783
828
 
784
829
 
785
830
class IncompatibleRepositories(BzrError):
 
831
    """Report an error that two repositories are not compatible.
 
832
 
 
833
    Note that the source and target repositories are permitted to be strings:
 
834
    this exception is thrown from the smart server and may refer to a
 
835
    repository the client hasn't opened.
 
836
    """
786
837
 
787
838
    _fmt = "%(target)s\n" \
788
839
            "is not compatible with\n" \
910
961
    # original exception is available as e.original_error
911
962
    #
912
963
    # New code should prefer to raise specific subclasses
913
 
    def __init__(self, message):
914
 
        # Python 2.5 uses a slot for StandardError.message,
915
 
        # so use a different variable name.  We now work around this in
916
 
        # BzrError.__str__, but this member name is kept for compatability.
917
 
        self.msg = message
 
964
    def __init__(self, msg):
 
965
        self.msg = msg
918
966
 
919
967
 
920
968
class LockActive(LockError):
1004
1052
class LockContention(LockError):
1005
1053
 
1006
1054
    _fmt = 'Could not acquire lock "%(lock)s": %(msg)s'
1007
 
    # TODO: show full url for lock, combining the transport and relative
1008
 
    # bits?
1009
1055
 
1010
1056
    internal_error = False
1011
1057
 
1038
1084
        self.target = target
1039
1085
 
1040
1086
 
 
1087
class LockCorrupt(LockError):
 
1088
 
 
1089
    _fmt = ("Lock is apparently held, but corrupted: %(corruption_info)s\n"
 
1090
            "Use 'bzr break-lock' to clear it")
 
1091
 
 
1092
    internal_error = False
 
1093
 
 
1094
    def __init__(self, corruption_info, file_data=None):
 
1095
        self.corruption_info = corruption_info
 
1096
        self.file_data = file_data
 
1097
 
 
1098
 
1041
1099
class LockNotHeld(LockError):
1042
1100
 
1043
1101
    _fmt = "Lock not held: %(lock)s"
1082
1140
        BzrError.__init__(self, files=files, files_str=files_str)
1083
1141
 
1084
1142
 
 
1143
class ExcludesUnsupported(BzrError):
 
1144
 
 
1145
    _fmt = ('Excluding paths during commit is not supported by '
 
1146
            'repository at %(repository)r.')
 
1147
 
 
1148
    def __init__(self, repository):
 
1149
        BzrError.__init__(self, repository=repository)
 
1150
 
 
1151
 
1085
1152
class BadCommitMessageEncoding(BzrError):
1086
1153
 
1087
1154
    _fmt = 'The specified commit message contains characters unsupported by '\
1142
1209
 
1143
1210
class InvalidRevisionSpec(BzrError):
1144
1211
 
1145
 
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
1146
 
            " %(branch)s%(extra)s")
 
1212
    _fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
 
1213
            " %(branch_url)s%(extra)s")
1147
1214
 
1148
1215
    def __init__(self, spec, branch, extra=None):
1149
1216
        BzrError.__init__(self, branch=branch, spec=spec)
 
1217
        self.branch_url = getattr(branch, 'user_url', str(branch))
1150
1218
        if extra:
1151
1219
            self.extra = '\n' + str(extra)
1152
1220
        else:
1173
1241
class DivergedBranches(BzrError):
1174
1242
 
1175
1243
    _fmt = ("These branches have diverged."
1176
 
            " Use the merge command to reconcile them.")
 
1244
            " Use the missing command to see how.\n"
 
1245
            "Use the merge command to reconcile them.")
1177
1246
 
1178
1247
    def __init__(self, branch1, branch2):
1179
1248
        self.branch1 = branch1
1227
1296
            not_ancestor_id=not_ancestor_id)
1228
1297
 
1229
1298
 
1230
 
class InstallFailed(BzrError):
1231
 
 
1232
 
    def __init__(self, revisions):
1233
 
        revision_str = ", ".join(str(r) for r in revisions)
1234
 
        msg = "Could not install revisions:\n%s" % revision_str
1235
 
        BzrError.__init__(self, msg)
1236
 
        self.revisions = revisions
1237
 
 
1238
 
 
1239
1299
class AmbiguousBase(BzrError):
1240
1300
 
1241
1301
    def __init__(self, bases):
1242
 
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1243
 
                DeprecationWarning)
 
1302
        symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
 
1303
            "as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1244
1304
        msg = ("The correct base is unclear, because %s are all equally close"
1245
1305
                % ", ".join(bases))
1246
1306
        BzrError.__init__(self, msg)
1268
1328
class BoundBranchOutOfDate(BzrError):
1269
1329
 
1270
1330
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
1271
 
            " %(master)s.")
 
1331
            " %(master)s.%(extra_help)s")
1272
1332
 
1273
1333
    def __init__(self, branch, master):
1274
1334
        BzrError.__init__(self)
1275
1335
        self.branch = branch
1276
1336
        self.master = master
 
1337
        self.extra_help = ''
1277
1338
 
1278
1339
 
1279
1340
class CommitToDoubleBoundBranch(BzrError):
1350
1411
 
1351
1412
class WeaveParentMismatch(WeaveError):
1352
1413
 
1353
 
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
1414
    _fmt = "Parents are mismatched between two revisions. %(msg)s"
1354
1415
 
1355
1416
 
1356
1417
class WeaveInvalidChecksum(WeaveError):
1357
1418
 
1358
 
    _fmt = "Text did not match it's checksum: %(message)s"
 
1419
    _fmt = "Text did not match its checksum: %(msg)s"
1359
1420
 
1360
1421
 
1361
1422
class WeaveTextDiffers(WeaveError):
1409
1470
 
1410
1471
class VersionedFileInvalidChecksum(VersionedFileError):
1411
1472
 
1412
 
    _fmt = "Text did not match its checksum: %(message)s"
 
1473
    _fmt = "Text did not match its checksum: %(msg)s"
1413
1474
 
1414
1475
 
1415
1476
class KnitError(InternalBzrError):
1895
1956
    _fmt = "Moving the root directory is not supported at this time"
1896
1957
 
1897
1958
 
 
1959
class TransformRenameFailed(BzrError):
 
1960
 
 
1961
    _fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
 
1962
 
 
1963
    def __init__(self, from_path, to_path, why, errno):
 
1964
        self.from_path = from_path
 
1965
        self.to_path = to_path
 
1966
        self.why = why
 
1967
        self.errno = errno
 
1968
 
 
1969
 
1898
1970
class BzrMoveFailedError(BzrError):
1899
1971
 
1900
 
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
1972
    _fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
 
1973
        "%(_has_extra)s%(extra)s")
1901
1974
 
1902
1975
    def __init__(self, from_path='', to_path='', extra=None):
1903
1976
        from bzrlib.osutils import splitpath
1904
1977
        BzrError.__init__(self)
1905
1978
        if extra:
1906
 
            self.extra = ': ' + str(extra)
 
1979
            self.extra, self._has_extra = extra, ': '
1907
1980
        else:
1908
 
            self.extra = ''
 
1981
            self.extra = self._has_extra = ''
1909
1982
 
1910
1983
        has_from = len(from_path) > 0
1911
1984
        has_to = len(to_path) > 0
1932
2005
 
1933
2006
class BzrRenameFailedError(BzrMoveFailedError):
1934
2007
 
1935
 
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
2008
    _fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
 
2009
        "%(_has_extra)s%(extra)s")
1936
2010
 
1937
2011
    def __init__(self, from_path, to_path, extra=None):
1938
2012
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1939
2013
 
 
2014
 
1940
2015
class BzrRemoveChangedFilesError(BzrError):
1941
2016
    """Used when user is trying to remove changed files."""
1942
2017
 
1945
2020
        "Use --keep to not delete them, or --force to delete them regardless.")
1946
2021
 
1947
2022
    def __init__(self, tree_delta):
 
2023
        symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
 
2024
            "BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1948
2025
        BzrError.__init__(self)
1949
2026
        self.changes_as_text = tree_delta.get_changes_as_text()
1950
2027
        #self.paths_as_string = '\n'.join(changed_files)
1958
2035
 
1959
2036
class BzrBadParameterMissing(BzrBadParameter):
1960
2037
 
1961
 
    _fmt = "Parameter $(param)s is required but not present."
 
2038
    _fmt = "Parameter %(param)s is required but not present."
1962
2039
 
1963
2040
 
1964
2041
class BzrBadParameterUnicode(BzrBadParameter):
2004
2081
 
2005
2082
class BadConversionTarget(BzrError):
2006
2083
 
2007
 
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
2084
    _fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
 
2085
            "    %(problem)s"
2008
2086
 
2009
 
    def __init__(self, problem, format):
 
2087
    def __init__(self, problem, format, from_format=None):
2010
2088
        BzrError.__init__(self)
2011
2089
        self.problem = problem
2012
2090
        self.format = format
 
2091
        self.from_format = from_format or '(unspecified)'
2013
2092
 
2014
2093
 
2015
2094
class NoDiffFound(BzrError):
2091
2170
 
2092
2171
class OutOfDateTree(BzrError):
2093
2172
 
2094
 
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
2173
    _fmt = "Working tree is out of date, please run 'bzr update'.%(more)s"
2095
2174
 
2096
 
    def __init__(self, tree):
 
2175
    def __init__(self, tree, more=None):
 
2176
        if more is None:
 
2177
            more = ''
 
2178
        else:
 
2179
            more = ' ' + more
2097
2180
        BzrError.__init__(self)
2098
2181
        self.tree = tree
 
2182
        self.more = more
2099
2183
 
2100
2184
 
2101
2185
class PublicBranchOutOfDate(BzrError):
2139
2223
 
2140
2224
    def __init__(self, repo):
2141
2225
        BzrError.__init__(self)
2142
 
        self.repo_path = repo.bzrdir.root_transport.base
 
2226
        self.repo_path = repo.user_url
2143
2227
 
2144
2228
 
2145
2229
class InconsistentDelta(BzrError):
2155
2239
        self.reason = reason
2156
2240
 
2157
2241
 
 
2242
class InconsistentDeltaDelta(InconsistentDelta):
 
2243
    """Used when we get a delta that is not valid."""
 
2244
 
 
2245
    _fmt = ("An inconsistent delta was supplied: %(delta)r"
 
2246
            "\nreason: %(reason)s")
 
2247
 
 
2248
    def __init__(self, delta, reason):
 
2249
        BzrError.__init__(self)
 
2250
        self.delta = delta
 
2251
        self.reason = reason
 
2252
 
 
2253
 
2158
2254
class UpgradeRequired(BzrError):
2159
2255
 
2160
2256
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
2169
2265
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
2170
2266
 
2171
2267
 
 
2268
class RichRootUpgradeRequired(UpgradeRequired):
 
2269
 
 
2270
    _fmt = ("To use this feature you must upgrade your branch at %(path)s to"
 
2271
           " a format which supports rich roots.")
 
2272
 
 
2273
 
2172
2274
class LocalRequiresBoundBranch(BzrError):
2173
2275
 
2174
2276
    _fmt = "Cannot perform local-only commits on unbound branches."
2175
2277
 
2176
2278
 
2177
 
class InvalidProgressBarType(BzrError):
2178
 
 
2179
 
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
2180
 
            " is not a supported type Select one of: %(valid_types)s")
2181
 
 
2182
 
    def __init__(self, bar_type, valid_types):
2183
 
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
2184
 
 
2185
 
 
2186
2279
class UnsupportedOperation(BzrError):
2187
2280
 
2188
2281
    _fmt = ("The method %(mname)s is not supported on"
2708
2801
 
2709
2802
    def __init__(self, bzrdir):
2710
2803
        import bzrlib.urlutils as urlutils
2711
 
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
2804
        display_url = urlutils.unescape_for_display(bzrdir.user_url,
2712
2805
                                                    'ascii')
2713
2806
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2714
2807
 
2779
2872
 
2780
2873
class UncommittedChanges(BzrError):
2781
2874
 
2782
 
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
2875
    _fmt = ('Working tree "%(display_url)s" has uncommitted changes'
 
2876
            ' (See bzr status).%(more)s')
2783
2877
 
2784
 
    def __init__(self, tree):
 
2878
    def __init__(self, tree, more=None):
 
2879
        if more is None:
 
2880
            more = ''
 
2881
        else:
 
2882
            more = ' ' + more
2785
2883
        import bzrlib.urlutils as urlutils
2786
 
        display_url = urlutils.unescape_for_display(
2787
 
            tree.bzrdir.root_transport.base, 'ascii')
2788
 
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
2884
        user_url = getattr(tree, "user_url", None)
 
2885
        if user_url is None:
 
2886
            display_url = str(tree)
 
2887
        else:
 
2888
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
 
2889
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
 
2890
 
 
2891
 
 
2892
class ShelvedChanges(UncommittedChanges):
 
2893
 
 
2894
    _fmt = ('Working tree "%(display_url)s" has shelved changes'
 
2895
            ' (See bzr shelve --list).%(more)s')
2789
2896
 
2790
2897
 
2791
2898
class MissingTemplateVariable(BzrError):
2850
2957
    pass
2851
2958
 
2852
2959
 
2853
 
class NotATerminal(BzrError):
2854
 
 
2855
 
    _fmt = 'Unable to ask for a password without real terminal.'
2856
 
 
2857
 
 
2858
2960
class UnableEncodePath(BzrError):
2859
2961
 
2860
2962
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
2867
2969
        self.user_encoding = osutils.get_user_encoding()
2868
2970
 
2869
2971
 
 
2972
class NoSuchConfig(BzrError):
 
2973
 
 
2974
    _fmt = ('The "%(config_id)s" configuration does not exist.')
 
2975
 
 
2976
    def __init__(self, config_id):
 
2977
        BzrError.__init__(self, config_id=config_id)
 
2978
 
 
2979
 
 
2980
class NoSuchConfigOption(BzrError):
 
2981
 
 
2982
    _fmt = ('The "%(option_name)s" configuration option does not exist.')
 
2983
 
 
2984
    def __init__(self, option_name):
 
2985
        BzrError.__init__(self, option_name=option_name)
 
2986
 
 
2987
 
2870
2988
class NoSuchAlias(BzrError):
2871
2989
 
2872
2990
    _fmt = ('The alias "%(alias_name)s" does not exist.')
2902
3020
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2903
3021
 
2904
3022
    def __init__(self, host, port, orig_error):
 
3023
        # nb: in python2.4 socket.error doesn't have a useful repr
2905
3024
        BzrError.__init__(self, host=host, port=port,
2906
 
            orig_error=orig_error[1])
 
3025
            orig_error=repr(orig_error.args))
2907
3026
 
2908
3027
 
2909
3028
class UnknownRules(BzrError):
2917
3036
class HookFailed(BzrError):
2918
3037
    """Raised when a pre_change_branch_tip hook function fails anything other
2919
3038
    than TipChangeRejected.
 
3039
 
 
3040
    Note that this exception is no longer raised, and the import is only left
 
3041
    to be nice to code which might catch it in a plugin.
2920
3042
    """
2921
3043
 
2922
3044
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2923
3045
            "%(traceback_text)s%(exc_value)s")
2924
3046
 
2925
 
    def __init__(self, hook_stage, hook_name, exc_info):
 
3047
    def __init__(self, hook_stage, hook_name, exc_info, warn=True):
 
3048
        if warn:
 
3049
            symbol_versioning.warn("BzrError HookFailed has been deprecated "
 
3050
                "as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2926
3051
        import traceback
2927
3052
        self.hook_stage = hook_stage
2928
3053
        self.hook_name = hook_name
2965
3090
        BzrError.__init__(self, invalid_id=invalid_id)
2966
3091
 
2967
3092
 
 
3093
class JailBreak(BzrError):
 
3094
 
 
3095
    _fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
 
3096
 
 
3097
    def __init__(self, url):
 
3098
        BzrError.__init__(self, url=url)
 
3099
 
 
3100
 
2968
3101
class UserAbort(BzrError):
2969
3102
 
2970
3103
    _fmt = 'The user aborted the operation.'
3030
3163
 
3031
3164
    def __init__(self, repository):
3032
3165
        self.repository = repository
 
3166
 
 
3167
 
 
3168
class LossyPushToSameVCS(BzrError):
 
3169
 
 
3170
    _fmt = ("Lossy push not possible between %(source_branch)r and "
 
3171
            "%(target_branch)r that are in the same VCS.")
 
3172
 
 
3173
    internal_error = True
 
3174
 
 
3175
    def __init__(self, source_branch, target_branch):
 
3176
        self.source_branch = source_branch
 
3177
        self.target_branch = target_branch
 
3178
 
 
3179
 
 
3180
class NoRoundtrippingSupport(BzrError):
 
3181
 
 
3182
    _fmt = ("Roundtripping is not supported between %(source_branch)r and "
 
3183
            "%(target_branch)r.")
 
3184
 
 
3185
    internal_error = True
 
3186
 
 
3187
    def __init__(self, source_branch, target_branch):
 
3188
        self.source_branch = source_branch
 
3189
        self.target_branch = target_branch
 
3190
 
 
3191
 
 
3192
class FileTimestampUnavailable(BzrError):
 
3193
 
 
3194
    _fmt = "The filestamp for %(path)s is not available."
 
3195
 
 
3196
    internal_error = True
 
3197
 
 
3198
    def __init__(self, path):
 
3199
        self.path = path
 
3200
 
 
3201
 
 
3202
class NoColocatedBranchSupport(BzrError):
 
3203
 
 
3204
    _fmt = ("%(bzrdir)r does not support co-located branches.")
 
3205
 
 
3206
    def __init__(self, bzrdir):
 
3207
        self.bzrdir = bzrdir
 
3208
 
 
3209
 
 
3210
class NoWhoami(BzrError):
 
3211
 
 
3212
    _fmt = ('Unable to determine your name.\n'
 
3213
        "Please, set your name with the 'whoami' command.\n"
 
3214
        'E.g. bzr whoami "Your Name <name@example.com>"')
 
3215
 
 
3216
 
 
3217
class InvalidPattern(BzrError):
 
3218
 
 
3219
    _fmt = ('Invalid pattern(s) found. %(msg)s')
 
3220
 
 
3221
    def __init__(self, msg):
 
3222
        self.msg = msg
 
3223
 
 
3224
 
 
3225
class RecursiveBind(BzrError):
 
3226
 
 
3227
    _fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
 
3228
        'Please use `bzr unbind` to fix.')
 
3229
 
 
3230
    def __init__(self, branch_url):
 
3231
        self.branch_url = branch_url
 
3232
 
 
3233
 
 
3234
# FIXME: I would prefer to define the config related exception classes in
 
3235
# config.py but the lazy import mechanism proscribes this -- vila 20101222
 
3236
class OptionExpansionLoop(BzrError):
 
3237
 
 
3238
    _fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
 
3239
 
 
3240
    def __init__(self, string, refs):
 
3241
        self.string = string
 
3242
        self.refs = '->'.join(refs)
 
3243
 
 
3244
 
 
3245
class ExpandingUnknownOption(BzrError):
 
3246
 
 
3247
    _fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
 
3248
 
 
3249
    def __init__(self, name, string):
 
3250
        self.name = name
 
3251
        self.string = string