~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

Bring the groupcompress plugin into the brisbane-core branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Exceptions for bzr, and reporting of them.
18
18
"""
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
 
 
649
639
class UnstackableRepositoryFormat(BzrError):
650
640
 
651
641
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
680
670
 
681
671
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
682
672
 
683
 
    internal_error = False
 
673
    internal_error = True
684
674
 
685
675
    def __init__(self, path, base, extra=None):
686
676
        BzrError.__init__(self)
702
692
# TODO: Probably this behavior of should be a common superclass
703
693
class NotBranchError(PathError):
704
694
 
705
 
    _fmt = 'Not a branch: "%(path)s"%(detail)s.'
 
695
    _fmt = 'Not a branch: "%(path)s".'
706
696
 
707
 
    def __init__(self, path, detail=None, bzrdir=None):
 
697
    def __init__(self, path):
708
698
       import bzrlib.urlutils as urlutils
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)
 
699
       self.path = urlutils.unescape_for_display(path, 'ascii')
731
700
 
732
701
 
733
702
class NoSubmitBranch(PathError):
782
751
 
783
752
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
784
753
 
785
 
    # use PathNotChild instead
786
 
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
787
754
    def __init__(self, branch, path):
788
755
        BzrError.__init__(self)
789
756
        self.branch = branch
816
783
 
817
784
 
818
785
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
 
    """
825
786
 
826
787
    _fmt = "%(target)s\n" \
827
788
            "is not compatible with\n" \
949
910
    # original exception is available as e.original_error
950
911
    #
951
912
    # New code should prefer to raise specific subclasses
952
 
    def __init__(self, msg):
953
 
        self.msg = msg
 
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
954
918
 
955
919
 
956
920
class LockActive(LockError):
1039
1003
 
1040
1004
class LockContention(LockError):
1041
1005
 
1042
 
    _fmt = 'Could not acquire lock "%(lock)s": %(msg)s'
 
1006
    _fmt = 'Could not acquire lock "%(lock)s"'
 
1007
    # TODO: show full url for lock, combining the transport and relative
 
1008
    # bits?
1043
1009
 
1044
1010
    internal_error = False
1045
1011
 
1046
 
    def __init__(self, lock, msg=''):
 
1012
    def __init__(self, lock):
1047
1013
        self.lock = lock
1048
 
        self.msg = msg
1049
1014
 
1050
1015
 
1051
1016
class LockBroken(LockError):
1176
1141
 
1177
1142
class InvalidRevisionSpec(BzrError):
1178
1143
 
1179
 
    _fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1180
 
            " %(branch_url)s%(extra)s")
 
1144
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
1145
            " %(branch)s%(extra)s")
1181
1146
 
1182
1147
    def __init__(self, spec, branch, extra=None):
1183
1148
        BzrError.__init__(self, branch=branch, spec=spec)
1184
 
        self.branch_url = getattr(branch, 'user_url', str(branch))
1185
1149
        if extra:
1186
1150
            self.extra = '\n' + str(extra)
1187
1151
        else:
1208
1172
class DivergedBranches(BzrError):
1209
1173
 
1210
1174
    _fmt = ("These branches have diverged."
1211
 
            " Use the missing command to see how.\n"
1212
 
            "Use the merge command to reconcile them.")
 
1175
            " Use the merge command to reconcile them.")
1213
1176
 
1214
1177
    def __init__(self, branch1, branch2):
1215
1178
        self.branch1 = branch1
1263
1226
            not_ancestor_id=not_ancestor_id)
1264
1227
 
1265
1228
 
 
1229
class InstallFailed(BzrError):
 
1230
 
 
1231
    def __init__(self, revisions):
 
1232
        revision_str = ", ".join(str(r) for r in revisions)
 
1233
        msg = "Could not install revisions:\n%s" % revision_str
 
1234
        BzrError.__init__(self, msg)
 
1235
        self.revisions = revisions
 
1236
 
 
1237
 
1266
1238
class AmbiguousBase(BzrError):
1267
1239
 
1268
1240
    def __init__(self, bases):
1269
 
        symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1270
 
            "as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
 
1241
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
1242
                DeprecationWarning)
1271
1243
        msg = ("The correct base is unclear, because %s are all equally close"
1272
1244
                % ", ".join(bases))
1273
1245
        BzrError.__init__(self, msg)
1295
1267
class BoundBranchOutOfDate(BzrError):
1296
1268
 
1297
1269
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
1298
 
            " %(master)s.%(extra_help)s")
 
1270
            " %(master)s.")
1299
1271
 
1300
1272
    def __init__(self, branch, master):
1301
1273
        BzrError.__init__(self)
1302
1274
        self.branch = branch
1303
1275
        self.master = master
1304
 
        self.extra_help = ''
1305
1276
 
1306
1277
 
1307
1278
class CommitToDoubleBoundBranch(BzrError):
1378
1349
 
1379
1350
class WeaveParentMismatch(WeaveError):
1380
1351
 
1381
 
    _fmt = "Parents are mismatched between two revisions. %(msg)s"
 
1352
    _fmt = "Parents are mismatched between two revisions. %(message)s"
1382
1353
 
1383
1354
 
1384
1355
class WeaveInvalidChecksum(WeaveError):
1385
1356
 
1386
 
    _fmt = "Text did not match it's checksum: %(msg)s"
 
1357
    _fmt = "Text did not match it's checksum: %(message)s"
1387
1358
 
1388
1359
 
1389
1360
class WeaveTextDiffers(WeaveError):
1437
1408
 
1438
1409
class VersionedFileInvalidChecksum(VersionedFileError):
1439
1410
 
1440
 
    _fmt = "Text did not match its checksum: %(msg)s"
 
1411
    _fmt = "Text did not match its checksum: %(message)s"
1441
1412
 
1442
1413
 
1443
1414
class KnitError(InternalBzrError):
1923
1894
    _fmt = "Moving the root directory is not supported at this time"
1924
1895
 
1925
1896
 
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
 
 
1937
1897
class BzrMoveFailedError(BzrError):
1938
1898
 
1939
1899
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1984
1944
        "Use --keep to not delete them, or --force to delete them regardless.")
1985
1945
 
1986
1946
    def __init__(self, tree_delta):
1987
 
        symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
1988
 
            "BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1989
1947
        BzrError.__init__(self)
1990
1948
        self.changes_as_text = tree_delta.get_changes_as_text()
1991
1949
        #self.paths_as_string = '\n'.join(changed_files)
2045
2003
 
2046
2004
class BadConversionTarget(BzrError):
2047
2005
 
2048
 
    _fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
2049
 
            "    %(problem)s"
 
2006
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
2050
2007
 
2051
 
    def __init__(self, problem, format, from_format=None):
 
2008
    def __init__(self, problem, format):
2052
2009
        BzrError.__init__(self)
2053
2010
        self.problem = problem
2054
2011
        self.format = format
2055
 
        self.from_format = from_format or '(unspecified)'
2056
2012
 
2057
2013
 
2058
2014
class NoDiffFound(BzrError):
2134
2090
 
2135
2091
class OutOfDateTree(BzrError):
2136
2092
 
2137
 
    _fmt = "Working tree is out of date, please run 'bzr update'.%(more)s"
 
2093
    _fmt = "Working tree is out of date, please run 'bzr update'."
2138
2094
 
2139
 
    def __init__(self, tree, more=None):
2140
 
        if more is None:
2141
 
            more = ''
2142
 
        else:
2143
 
            more = ' ' + more
 
2095
    def __init__(self, tree):
2144
2096
        BzrError.__init__(self)
2145
2097
        self.tree = tree
2146
 
        self.more = more
2147
2098
 
2148
2099
 
2149
2100
class PublicBranchOutOfDate(BzrError):
2187
2138
 
2188
2139
    def __init__(self, repo):
2189
2140
        BzrError.__init__(self)
2190
 
        self.repo_path = repo.user_url
 
2141
        self.repo_path = repo.bzrdir.root_transport.base
2191
2142
 
2192
2143
 
2193
2144
class InconsistentDelta(BzrError):
2203
2154
        self.reason = reason
2204
2155
 
2205
2156
 
2206
 
class InconsistentDeltaDelta(InconsistentDelta):
2207
 
    """Used when we get a delta that is not valid."""
2208
 
 
2209
 
    _fmt = ("An inconsistent delta was supplied: %(delta)r"
2210
 
            "\nreason: %(reason)s")
2211
 
 
2212
 
    def __init__(self, delta, reason):
2213
 
        BzrError.__init__(self)
2214
 
        self.delta = delta
2215
 
        self.reason = reason
2216
 
 
2217
 
 
2218
2157
class UpgradeRequired(BzrError):
2219
2158
 
2220
2159
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
2229
2168
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
2230
2169
 
2231
2170
 
2232
 
class RichRootUpgradeRequired(UpgradeRequired):
2233
 
 
2234
 
    _fmt = ("To use this feature you must upgrade your branch at %(path)s to"
2235
 
           " a format which supports rich roots.")
2236
 
 
2237
 
 
2238
2171
class LocalRequiresBoundBranch(BzrError):
2239
2172
 
2240
2173
    _fmt = "Cannot perform local-only commits on unbound branches."
2241
2174
 
2242
2175
 
 
2176
class InvalidProgressBarType(BzrError):
 
2177
 
 
2178
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
2179
            " is not a supported type Select one of: %(valid_types)s")
 
2180
 
 
2181
    def __init__(self, bar_type, valid_types):
 
2182
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
2183
 
 
2184
 
2243
2185
class UnsupportedOperation(BzrError):
2244
2186
 
2245
2187
    _fmt = ("The method %(mname)s is not supported on"
2366
2308
        self.transport = transport
2367
2309
 
2368
2310
 
 
2311
class NoSmartServer(NotBranchError):
 
2312
 
 
2313
    _fmt = "No smart server available at %(url)s"
 
2314
 
 
2315
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
 
2316
    def __init__(self, url):
 
2317
        self.url = url
 
2318
 
 
2319
 
2369
2320
class UnknownSSH(BzrError):
2370
2321
 
2371
2322
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
2552
2503
 
2553
2504
class MalformedBugIdentifier(BzrError):
2554
2505
 
2555
 
    _fmt = ('Did not understand bug identifier %(bug_id)s: %(reason)s. '
2556
 
            'See "bzr help bugs" for more information on this feature.')
 
2506
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
2557
2507
 
2558
2508
    def __init__(self, bug_id, reason):
2559
2509
        self.bug_id = bug_id
2580
2530
        self.branch = branch
2581
2531
 
2582
2532
 
2583
 
class InvalidLineInBugsProperty(BzrError):
2584
 
 
2585
 
    _fmt = ("Invalid line in bugs property: '%(line)s'")
2586
 
 
2587
 
    def __init__(self, line):
2588
 
        self.line = line
2589
 
 
2590
 
 
2591
 
class InvalidBugStatus(BzrError):
2592
 
 
2593
 
    _fmt = ("Invalid bug status: '%(status)s'")
2594
 
 
2595
 
    def __init__(self, status):
2596
 
        self.status = status
2597
 
 
2598
 
 
2599
2533
class UnexpectedSmartServerResponse(BzrError):
2600
2534
 
2601
2535
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
2765
2699
 
2766
2700
    def __init__(self, bzrdir):
2767
2701
        import bzrlib.urlutils as urlutils
2768
 
        display_url = urlutils.unescape_for_display(bzrdir.user_url,
 
2702
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2769
2703
                                                    'ascii')
2770
2704
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2771
2705
 
2836
2770
 
2837
2771
class UncommittedChanges(BzrError):
2838
2772
 
2839
 
    _fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2840
 
            ' (See bzr status).%(more)s')
 
2773
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2841
2774
 
2842
 
    def __init__(self, tree, more=None):
2843
 
        if more is None:
2844
 
            more = ''
2845
 
        else:
2846
 
            more = ' ' + more
 
2775
    def __init__(self, tree):
2847
2776
        import bzrlib.urlutils as urlutils
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')
2853
 
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2854
 
 
2855
 
 
2856
 
class ShelvedChanges(UncommittedChanges):
2857
 
 
2858
 
    _fmt = ('Working tree "%(display_url)s" has shelved changes'
2859
 
            ' (See bzr shelve --list).%(more)s')
 
2777
        display_url = urlutils.unescape_for_display(
 
2778
            tree.bzrdir.root_transport.base, 'ascii')
 
2779
        BzrError.__init__(self, tree=tree, display_url=display_url)
2860
2780
 
2861
2781
 
2862
2782
class MissingTemplateVariable(BzrError):
2921
2841
    pass
2922
2842
 
2923
2843
 
 
2844
class NotATerminal(BzrError):
 
2845
 
 
2846
    _fmt = 'Unable to ask for a password without real terminal.'
 
2847
 
 
2848
 
2924
2849
class UnableEncodePath(BzrError):
2925
2850
 
2926
2851
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
2968
2893
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2969
2894
 
2970
2895
    def __init__(self, host, port, orig_error):
2971
 
        # nb: in python2.4 socket.error doesn't have a useful repr
2972
2896
        BzrError.__init__(self, host=host, port=port,
2973
 
            orig_error=repr(orig_error.args))
 
2897
            orig_error=orig_error[1])
2974
2898
 
2975
2899
 
2976
2900
class UnknownRules(BzrError):
2984
2908
class HookFailed(BzrError):
2985
2909
    """Raised when a pre_change_branch_tip hook function fails anything other
2986
2910
    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.
2990
2911
    """
2991
2912
 
2992
2913
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2993
2914
            "%(traceback_text)s%(exc_value)s")
2994
2915
 
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)
 
2916
    def __init__(self, hook_stage, hook_name, exc_info):
2999
2917
        import traceback
3000
2918
        self.hook_stage = hook_stage
3001
2919
        self.hook_name = hook_name
3038
2956
        BzrError.__init__(self, invalid_id=invalid_id)
3039
2957
 
3040
2958
 
3041
 
class JailBreak(BzrError):
3042
 
 
3043
 
    _fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
3044
 
 
3045
 
    def __init__(self, url):
3046
 
        BzrError.__init__(self, url=url)
3047
 
 
3048
 
 
3049
2959
class UserAbort(BzrError):
3050
2960
 
3051
2961
    _fmt = 'The user aborted the operation.'
3111
3021
 
3112
3022
    def __init__(self, repository):
3113
3023
        self.repository = repository
3114
 
 
3115
 
 
3116
 
class LossyPushToSameVCS(BzrError):
3117
 
 
3118
 
    _fmt = ("Lossy push not possible between %(source_branch)r and "
3119
 
            "%(target_branch)r that are in the same VCS.")
3120
 
 
3121
 
    internal_error = True
3122
 
 
3123
 
    def __init__(self, source_branch, target_branch):
3124
 
        self.source_branch = source_branch
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