~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Martin Pool
  • Date: 2010-09-14 06:46:18 UTC
  • mto: This revision was merged to the branch mainline in revision 5426.
  • Revision ID: mbp@sourcefrog.net-20100914064618-1b05bktzv3513mx0
Add ConfirmationUserInterfacePolicy that lets specific confirmations be configured off.

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-2010 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
680
680
 
681
681
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
682
682
 
683
 
    internal_error = True
 
683
    internal_error = False
684
684
 
685
685
    def __init__(self, path, base, extra=None):
686
686
        BzrError.__init__(self)
702
702
# TODO: Probably this behavior of should be a common superclass
703
703
class NotBranchError(PathError):
704
704
 
705
 
    _fmt = 'Not a branch: "%(path)s".'
 
705
    _fmt = 'Not a branch: "%(path)s"%(detail)s.'
706
706
 
707
 
    def __init__(self, path):
 
707
    def __init__(self, path, detail=None, bzrdir=None):
708
708
       import bzrlib.urlutils as urlutils
709
 
       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 _format(self):
 
717
        # XXX: Ideally self.detail would be a property, but Exceptions in
 
718
        # Python 2.4 have to be old-style classes so properties don't work.
 
719
        # Instead we override _format.
 
720
        if self.detail is None:
 
721
            if self.bzrdir is not None:
 
722
                try:
 
723
                    self.bzrdir.open_repository()
 
724
                except NoRepositoryPresent:
 
725
                    self.detail = ''
 
726
                else:
 
727
                    self.detail = ': location is a repository'
 
728
            else:
 
729
                self.detail = ''
 
730
        return PathError._format(self)
710
731
 
711
732
 
712
733
class NoSubmitBranch(PathError):
761
782
 
762
783
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
763
784
 
 
785
    # use PathNotChild instead
 
786
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
764
787
    def __init__(self, branch, path):
765
788
        BzrError.__init__(self)
766
789
        self.branch = branch
793
816
 
794
817
 
795
818
class IncompatibleRepositories(BzrError):
 
819
    """Report an error that two repositories are not compatible.
 
820
 
 
821
    Note that the source and target repositories are permitted to be strings:
 
822
    this exception is thrown from the smart server and may refer to a
 
823
    repository the client hasn't opened.
 
824
    """
796
825
 
797
826
    _fmt = "%(target)s\n" \
798
827
            "is not compatible with\n" \
920
949
    # original exception is available as e.original_error
921
950
    #
922
951
    # New code should prefer to raise specific subclasses
923
 
    def __init__(self, message):
924
 
        # Python 2.5 uses a slot for StandardError.message,
925
 
        # so use a different variable name.  We now work around this in
926
 
        # BzrError.__str__, but this member name is kept for compatability.
927
 
        self.msg = message
 
952
    def __init__(self, msg):
 
953
        self.msg = msg
928
954
 
929
955
 
930
956
class LockActive(LockError):
1014
1040
class LockContention(LockError):
1015
1041
 
1016
1042
    _fmt = 'Could not acquire lock "%(lock)s": %(msg)s'
1017
 
    # TODO: show full url for lock, combining the transport and relative
1018
 
    # bits?
1019
1043
 
1020
1044
    internal_error = False
1021
1045
 
1152
1176
 
1153
1177
class InvalidRevisionSpec(BzrError):
1154
1178
 
1155
 
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
1156
 
            " %(branch)s%(extra)s")
 
1179
    _fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
 
1180
            " %(branch_url)s%(extra)s")
1157
1181
 
1158
1182
    def __init__(self, spec, branch, extra=None):
1159
1183
        BzrError.__init__(self, branch=branch, spec=spec)
 
1184
        self.branch_url = getattr(branch, 'user_url', str(branch))
1160
1185
        if extra:
1161
1186
            self.extra = '\n' + str(extra)
1162
1187
        else:
1241
1266
class AmbiguousBase(BzrError):
1242
1267
 
1243
1268
    def __init__(self, bases):
1244
 
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1245
 
                DeprecationWarning)
 
1269
        symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
 
1270
            "as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1246
1271
        msg = ("The correct base is unclear, because %s are all equally close"
1247
1272
                % ", ".join(bases))
1248
1273
        BzrError.__init__(self, msg)
1270
1295
class BoundBranchOutOfDate(BzrError):
1271
1296
 
1272
1297
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
1273
 
            " %(master)s.")
 
1298
            " %(master)s.%(extra_help)s")
1274
1299
 
1275
1300
    def __init__(self, branch, master):
1276
1301
        BzrError.__init__(self)
1277
1302
        self.branch = branch
1278
1303
        self.master = master
 
1304
        self.extra_help = ''
1279
1305
 
1280
1306
 
1281
1307
class CommitToDoubleBoundBranch(BzrError):
1352
1378
 
1353
1379
class WeaveParentMismatch(WeaveError):
1354
1380
 
1355
 
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
1381
    _fmt = "Parents are mismatched between two revisions. %(msg)s"
1356
1382
 
1357
1383
 
1358
1384
class WeaveInvalidChecksum(WeaveError):
1359
1385
 
1360
 
    _fmt = "Text did not match it's checksum: %(message)s"
 
1386
    _fmt = "Text did not match it's checksum: %(msg)s"
1361
1387
 
1362
1388
 
1363
1389
class WeaveTextDiffers(WeaveError):
1411
1437
 
1412
1438
class VersionedFileInvalidChecksum(VersionedFileError):
1413
1439
 
1414
 
    _fmt = "Text did not match its checksum: %(message)s"
 
1440
    _fmt = "Text did not match its checksum: %(msg)s"
1415
1441
 
1416
1442
 
1417
1443
class KnitError(InternalBzrError):
1897
1923
    _fmt = "Moving the root directory is not supported at this time"
1898
1924
 
1899
1925
 
 
1926
class TransformRenameFailed(BzrError):
 
1927
 
 
1928
    _fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
 
1929
 
 
1930
    def __init__(self, from_path, to_path, why, errno):
 
1931
        self.from_path = from_path
 
1932
        self.to_path = to_path
 
1933
        self.why = why
 
1934
        self.errno = errno
 
1935
 
 
1936
 
1900
1937
class BzrMoveFailedError(BzrError):
1901
1938
 
1902
1939
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1947
1984
        "Use --keep to not delete them, or --force to delete them regardless.")
1948
1985
 
1949
1986
    def __init__(self, tree_delta):
 
1987
        symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
 
1988
            "BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1950
1989
        BzrError.__init__(self)
1951
1990
        self.changes_as_text = tree_delta.get_changes_as_text()
1952
1991
        #self.paths_as_string = '\n'.join(changed_files)
2006
2045
 
2007
2046
class BadConversionTarget(BzrError):
2008
2047
 
2009
 
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
2048
    _fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
 
2049
            "    %(problem)s"
2010
2050
 
2011
 
    def __init__(self, problem, format):
 
2051
    def __init__(self, problem, format, from_format=None):
2012
2052
        BzrError.__init__(self)
2013
2053
        self.problem = problem
2014
2054
        self.format = format
 
2055
        self.from_format = from_format or '(unspecified)'
2015
2056
 
2016
2057
 
2017
2058
class NoDiffFound(BzrError):
2146
2187
 
2147
2188
    def __init__(self, repo):
2148
2189
        BzrError.__init__(self)
2149
 
        self.repo_path = repo.bzrdir.root_transport.base
 
2190
        self.repo_path = repo.user_url
2150
2191
 
2151
2192
 
2152
2193
class InconsistentDelta(BzrError):
2724
2765
 
2725
2766
    def __init__(self, bzrdir):
2726
2767
        import bzrlib.urlutils as urlutils
2727
 
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
2768
        display_url = urlutils.unescape_for_display(bzrdir.user_url,
2728
2769
                                                    'ascii')
2729
2770
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2730
2771
 
2804
2845
        else:
2805
2846
            more = ' ' + more
2806
2847
        import bzrlib.urlutils as urlutils
2807
 
        display_url = urlutils.unescape_for_display(
2808
 
            tree.bzrdir.root_transport.base, 'ascii')
 
2848
        user_url = getattr(tree, "user_url", None)
 
2849
        if user_url is None:
 
2850
            display_url = str(tree)
 
2851
        else:
 
2852
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
2809
2853
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2810
2854
 
2811
2855
 
 
2856
class ShelvedChanges(UncommittedChanges):
 
2857
 
 
2858
    _fmt = ('Working tree "%(display_url)s" has shelved changes'
 
2859
            ' (See bzr shelve --list).%(more)s')
 
2860
 
 
2861
 
2812
2862
class MissingTemplateVariable(BzrError):
2813
2863
 
2814
2864
    _fmt = 'Variable {%(name)s} is not available.'
2918
2968
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2919
2969
 
2920
2970
    def __init__(self, host, port, orig_error):
 
2971
        # nb: in python2.4 socket.error doesn't have a useful repr
2921
2972
        BzrError.__init__(self, host=host, port=port,
2922
 
            orig_error=orig_error[1])
 
2973
            orig_error=repr(orig_error.args))
2923
2974
 
2924
2975
 
2925
2976
class UnknownRules(BzrError):
2933
2984
class HookFailed(BzrError):
2934
2985
    """Raised when a pre_change_branch_tip hook function fails anything other
2935
2986
    than TipChangeRejected.
 
2987
 
 
2988
    Note that this exception is no longer raised, and the import is only left
 
2989
    to be nice to code which might catch it in a plugin.
2936
2990
    """
2937
2991
 
2938
2992
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2939
2993
            "%(traceback_text)s%(exc_value)s")
2940
2994
 
2941
 
    def __init__(self, hook_stage, hook_name, exc_info):
 
2995
    def __init__(self, hook_stage, hook_name, exc_info, warn=True):
 
2996
        if warn:
 
2997
            symbol_versioning.warn("BzrError HookFailed has been deprecated "
 
2998
                "as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2942
2999
        import traceback
2943
3000
        self.hook_stage = hook_stage
2944
3001
        self.hook_name = hook_name
3066
3123
    def __init__(self, source_branch, target_branch):
3067
3124
        self.source_branch = source_branch
3068
3125
        self.target_branch = target_branch
 
3126
 
 
3127
 
 
3128
class NoRoundtrippingSupport(BzrError):
 
3129
 
 
3130
    _fmt = ("Roundtripping is not supported between %(source_branch)r and "
 
3131
            "%(target_branch)r.")
 
3132
 
 
3133
    internal_error = True
 
3134
 
 
3135
    def __init__(self, source_branch, target_branch):
 
3136
        self.source_branch = source_branch
 
3137
        self.target_branch = target_branch
 
3138
 
 
3139
 
 
3140
class FileTimestampUnavailable(BzrError):
 
3141
 
 
3142
    _fmt = "The filestamp for %(path)s is not available."
 
3143
 
 
3144
    internal_error = True
 
3145
 
 
3146
    def __init__(self, path):
 
3147
        self.path = path
 
3148
 
 
3149
 
 
3150
class NoColocatedBranchSupport(BzrError):
 
3151
 
 
3152
    _fmt = ("%(bzrdir)r does not support co-located branches.")
 
3153
 
 
3154
    def __init__(self, bzrdir):
 
3155
        self.bzrdir = bzrdir
 
3156
 
 
3157
 
 
3158
class NoWhoami(BzrError):
 
3159
 
 
3160
    _fmt = ('Unable to determine your name.\n'
 
3161
        "Please, set your name with the 'whoami' command.\n"
 
3162
        'E.g. bzr whoami "Your Name <name@example.com>"')
 
3163
 
 
3164
 
 
3165
class InvalidPattern(BzrError):
 
3166
 
 
3167
    _fmt = ('Invalid pattern(s) found. %(msg)s')
 
3168
 
 
3169
    def __init__(self, msg):
 
3170
        self.msg = msg
 
3171
 
 
3172
 
 
3173
class RecursiveBind(BzrError):
 
3174
 
 
3175
    _fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
 
3176
        'Please use `bzr unbind` to fix.')
 
3177
 
 
3178
    def __init__(self, branch_url):
 
3179
        self.branch_url = branch_url
 
3180