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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Exceptions for bzr, and reporting of them.
72
72
arguments can be given. The first is for generic "user" errors which
73
73
are not intended to be caught and so do not need a specific subclass.
74
74
The second case is for use with subclasses that provide a _fmt format
75
string to print the arguments.
75
string to print the arguments.
77
Keyword arguments are taken as parameters to the error, which can
78
be inserted into the format string template. It's recommended
79
that subclasses override the __init__ method to require specific
77
Keyword arguments are taken as parameters to the error, which can
78
be inserted into the format string template. It's recommended
79
that subclasses override the __init__ method to require specific
82
82
:param msg: If given, this is the literal complete text for the error,
486
486
# XXX: Should be unified with TransportError; they seem to represent the
488
488
# RBC 20060929: I think that unifiying with TransportError would be a mistake
489
# - this is finer than a TransportError - and more useful as such. It
489
# - this is finer than a TransportError - and more useful as such. It
490
490
# differentiates between 'transport has failed' and 'operation on a transport
492
492
class PathError(BzrError):
494
494
_fmt = "Generic path error: %(path)r%(extra)s)"
496
496
def __init__(self, path, extra=None):
690
700
# TODO: This is given a URL; we try to unescape it but doing that from inside
691
701
# the exception object is a bit undesirable.
692
# TODO: Probably this behavior of should be a common superclass
702
# TODO: Probably this behavior of should be a common superclass
693
703
class NotBranchError(PathError):
695
_fmt = 'Not a branch: "%(path)s".'
705
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
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
714
PathError.__init__(self, path=path)
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:
723
self.bzrdir.open_repository()
724
except NoRepositoryPresent:
727
self.detail = ': location is a repository'
730
return PathError._format(self)
702
733
class NoSubmitBranch(PathError):
1142
1177
class InvalidRevisionSpec(BzrError):
1144
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1145
" %(branch)s%(extra)s")
1179
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1180
" %(branch_url)s%(extra)s")
1147
1182
def __init__(self, spec, branch, extra=None):
1148
1183
BzrError.__init__(self, branch=branch, spec=spec)
1184
self.branch_url = getattr(branch, 'user_url', str(branch))
1150
1186
self.extra = '\n' + str(extra)
1226
1263
not_ancestor_id=not_ancestor_id)
1229
class InstallFailed(BzrError):
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
1238
1266
class AmbiguousBase(BzrError):
1240
1268
def __init__(self, bases):
1241
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1269
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1270
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1243
1271
msg = ("The correct base is unclear, because %s are all equally close"
1244
1272
% ", ".join(bases))
1245
1273
BzrError.__init__(self, msg)
2166
2229
_fmt = "To use this feature you must upgrade your repository at %(path)s."
2232
class RichRootUpgradeRequired(UpgradeRequired):
2234
_fmt = ("To use this feature you must upgrade your branch at %(path)s to"
2235
" a format which supports rich roots.")
2169
2238
class LocalRequiresBoundBranch(BzrError):
2171
2240
_fmt = "Cannot perform local-only commits on unbound branches."
2174
class InvalidProgressBarType(BzrError):
2176
_fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
2177
" is not a supported type Select one of: %(valid_types)s")
2179
def __init__(self, bar_type, valid_types):
2180
BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
2183
2243
class UnsupportedOperation(BzrError):
2185
2245
_fmt = ("The method %(mname)s is not supported on"
2245
2305
self.text = text
2248
class MalformedHeader(BadBundle):
2308
class MalformedHeader(BadBundle):
2250
2310
_fmt = "Malformed bzr revision-bundle header: %(text)r"
2253
class MalformedPatches(BadBundle):
2313
class MalformedPatches(BadBundle):
2255
2315
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
2258
class MalformedFooter(BadBundle):
2318
class MalformedFooter(BadBundle):
2260
2320
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
2263
2323
class UnsupportedEOLMarker(BadBundle):
2265
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2325
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2267
2327
def __init__(self):
2268
# XXX: BadBundle's constructor assumes there's explanatory text,
2328
# XXX: BadBundle's constructor assumes there's explanatory text,
2269
2329
# but for this there is not
2270
2330
BzrError.__init__(self)
2273
2333
class IncompatibleBundleFormat(BzrError):
2275
2335
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
2277
2337
def __init__(self, bundle_format, other):
2769
2837
class UncommittedChanges(BzrError):
2771
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2839
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2840
' (See bzr status).%(more)s')
2773
def __init__(self, tree):
2842
def __init__(self, tree, more=None):
2774
2847
import bzrlib.urlutils as urlutils
2775
display_url = urlutils.unescape_for_display(
2776
tree.bzrdir.root_transport.base, 'ascii')
2777
BzrError.__init__(self, tree=tree, display_url=display_url)
2848
user_url = getattr(tree, "user_url", None)
2849
if user_url is None:
2850
display_url = str(tree)
2852
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2853
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2856
class ShelvedChanges(UncommittedChanges):
2858
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2859
' (See bzr shelve --list).%(more)s')
2780
2862
class MissingTemplateVariable(BzrError):
2817
2899
class CommandAvailableInPlugin(StandardError):
2819
2901
internal_error = False
2821
2903
def __init__(self, cmd_name, plugin_metadata, provider):
2823
2905
self.plugin_metadata = plugin_metadata
2824
2906
self.cmd_name = cmd_name
2825
2907
self.provider = provider
2827
2909
def __str__(self):
2829
_fmt = ('"%s" is not a standard bzr command. \n'
2911
_fmt = ('"%s" is not a standard bzr command. \n'
2830
2912
'However, the following official plugin provides this command: %s\n'
2831
2913
'You can install it by going to: %s'
2832
% (self.cmd_name, self.plugin_metadata['name'],
2914
% (self.cmd_name, self.plugin_metadata['name'],
2833
2915
self.plugin_metadata['url']))
2838
2920
class NoPluginAvailable(BzrError):
2842
class NotATerminal(BzrError):
2844
_fmt = 'Unable to ask for a password without real terminal.'
2847
2924
class UnableEncodePath(BzrError):
2891
2968
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2893
2970
def __init__(self, host, port, orig_error):
2971
# nb: in python2.4 socket.error doesn't have a useful repr
2894
2972
BzrError.__init__(self, host=host, port=port,
2895
orig_error=orig_error[1])
2973
orig_error=repr(orig_error.args))
2898
2976
class UnknownRules(BzrError):
2906
2984
class HookFailed(BzrError):
2907
2985
"""Raised when a pre_change_branch_tip hook function fails anything other
2908
2986
than TipChangeRejected.
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.
2911
2992
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2912
2993
"%(traceback_text)s%(exc_value)s")
2914
def __init__(self, hook_stage, hook_name, exc_info):
2995
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
2997
symbol_versioning.warn("BzrError HookFailed has been deprecated "
2998
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2915
2999
import traceback
2916
3000
self.hook_stage = hook_stage
2917
3001
self.hook_name = hook_name
2966
3058
def __init__(self, format, url):
2967
3059
BzrError.__init__(self, format=format, url=url)
3062
class NoSuchView(BzrError):
3063
"""A view does not exist.
3066
_fmt = u"No such view: %(view_name)s."
3068
def __init__(self, view_name):
3069
self.view_name = view_name
3072
class ViewsNotSupported(BzrError):
3073
"""Views are not supported by a tree format.
3076
_fmt = ("Views are not supported by %(tree)s;"
3077
" use 'bzr upgrade' to change your tree to a later format.")
3079
def __init__(self, tree):
3083
class FileOutsideView(BzrError):
3085
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
3088
def __init__(self, file_name, view_files):
3089
self.file_name = file_name
3090
self.view_str = ", ".join(view_files)
3093
class UnresumableWriteGroup(BzrError):
3095
_fmt = ("Repository %(repository)s cannot resume write group "
3096
"%(write_groups)r: %(reason)s")
3098
internal_error = True
3100
def __init__(self, repository, write_groups, reason):
3101
self.repository = repository
3102
self.write_groups = write_groups
3103
self.reason = reason
3106
class UnsuspendableWriteGroup(BzrError):
3108
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3110
internal_error = True
3112
def __init__(self, repository):
3113
self.repository = repository
3116
class LossyPushToSameVCS(BzrError):
3118
_fmt = ("Lossy push not possible between %(source_branch)r and "
3119
"%(target_branch)r that are in the same VCS.")
3121
internal_error = True
3123
def __init__(self, source_branch, target_branch):
3124
self.source_branch = source_branch
3125
self.target_branch = target_branch
3128
class NoRoundtrippingSupport(BzrError):
3130
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3131
"%(target_branch)r.")
3133
internal_error = True
3135
def __init__(self, source_branch, target_branch):
3136
self.source_branch = source_branch
3137
self.target_branch = target_branch
3140
class FileTimestampUnavailable(BzrError):
3142
_fmt = "The filestamp for %(path)s is not available."
3144
internal_error = True
3146
def __init__(self, path):
3150
class NoColocatedBranchSupport(BzrError):
3152
_fmt = ("%(bzrdir)r does not support co-located branches.")
3154
def __init__(self, bzrdir):
3155
self.bzrdir = bzrdir
3158
class NoWhoami(BzrError):
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>"')
3165
class InvalidPattern(BzrError):
3167
_fmt = ('Invalid pattern(s) found. %(msg)s')
3169
def __init__(self, msg):
3173
class RecursiveBind(BzrError):
3175
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3176
'Please use `bzr unbind` to fix.')
3178
def __init__(self, branch_url):
3179
self.branch_url = branch_url