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):
1226
1265
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
1268
class AmbiguousBase(BzrError):
1240
1270
def __init__(self, bases):
1241
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1271
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1272
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1243
1273
msg = ("The correct base is unclear, because %s are all equally close"
1244
1274
% ", ".join(bases))
1245
1275
BzrError.__init__(self, msg)
2002
2034
class BadConversionTarget(BzrError):
2004
_fmt = "Cannot convert to format %(format)s. %(problem)s"
2036
_fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
2006
def __init__(self, problem, format):
2039
def __init__(self, problem, format, from_format=None):
2007
2040
BzrError.__init__(self)
2008
2041
self.problem = problem
2009
2042
self.format = format
2043
self.from_format = from_format or '(unspecified)'
2012
2046
class NoDiffFound(BzrError):
2166
2217
_fmt = "To use this feature you must upgrade your repository at %(path)s."
2220
class RichRootUpgradeRequired(UpgradeRequired):
2222
_fmt = ("To use this feature you must upgrade your branch at %(path)s to"
2223
" a format which supports rich roots.")
2169
2226
class LocalRequiresBoundBranch(BzrError):
2171
2228
_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
2231
class UnsupportedOperation(BzrError):
2185
2233
_fmt = ("The method %(mname)s is not supported on"
2245
2293
self.text = text
2248
class MalformedHeader(BadBundle):
2296
class MalformedHeader(BadBundle):
2250
2298
_fmt = "Malformed bzr revision-bundle header: %(text)r"
2253
class MalformedPatches(BadBundle):
2301
class MalformedPatches(BadBundle):
2255
2303
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
2258
class MalformedFooter(BadBundle):
2306
class MalformedFooter(BadBundle):
2260
2308
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
2263
2311
class UnsupportedEOLMarker(BadBundle):
2265
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2313
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2267
2315
def __init__(self):
2268
# XXX: BadBundle's constructor assumes there's explanatory text,
2316
# XXX: BadBundle's constructor assumes there's explanatory text,
2269
2317
# but for this there is not
2270
2318
BzrError.__init__(self)
2273
2321
class IncompatibleBundleFormat(BzrError):
2275
2323
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
2277
2325
def __init__(self, bundle_format, other):
2757
2825
class UncommittedChanges(BzrError):
2759
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2827
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2828
' (See bzr status).%(more)s')
2761
def __init__(self, tree):
2830
def __init__(self, tree, more=None):
2762
2835
import bzrlib.urlutils as urlutils
2763
2836
display_url = urlutils.unescape_for_display(
2764
2837
tree.bzrdir.root_transport.base, 'ascii')
2765
BzrError.__init__(self, tree=tree, display_url=display_url)
2838
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2768
2841
class MissingTemplateVariable(BzrError):
2805
2878
class CommandAvailableInPlugin(StandardError):
2807
2880
internal_error = False
2809
2882
def __init__(self, cmd_name, plugin_metadata, provider):
2811
2884
self.plugin_metadata = plugin_metadata
2812
2885
self.cmd_name = cmd_name
2813
2886
self.provider = provider
2815
2888
def __str__(self):
2817
_fmt = ('"%s" is not a standard bzr command. \n'
2890
_fmt = ('"%s" is not a standard bzr command. \n'
2818
2891
'However, the following official plugin provides this command: %s\n'
2819
2892
'You can install it by going to: %s'
2820
% (self.cmd_name, self.plugin_metadata['name'],
2893
% (self.cmd_name, self.plugin_metadata['name'],
2821
2894
self.plugin_metadata['url']))
2826
2899
class NoPluginAvailable(BzrError):
2830
class NotATerminal(BzrError):
2832
_fmt = 'Unable to ask for a password without real terminal.'
2835
2903
class UnableEncodePath(BzrError):
2879
2947
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2881
2949
def __init__(self, host, port, orig_error):
2950
# nb: in python2.4 socket.error doesn't have a useful repr
2882
2951
BzrError.__init__(self, host=host, port=port,
2883
orig_error=orig_error[1])
2952
orig_error=repr(orig_error.args))
2886
2955
class UnknownRules(BzrError):
2894
2963
class HookFailed(BzrError):
2895
2964
"""Raised when a pre_change_branch_tip hook function fails anything other
2896
2965
than TipChangeRejected.
2967
Note that this exception is no longer raised, and the import is only left
2968
to be nice to code which might catch it in a plugin.
2899
2971
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2900
2972
"%(traceback_text)s%(exc_value)s")
2902
def __init__(self, hook_stage, hook_name, exc_info):
2974
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
2976
symbol_versioning.warn("BzrError HookFailed has been deprecated "
2977
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2903
2978
import traceback
2904
2979
self.hook_stage = hook_stage
2905
2980
self.hook_name = hook_name
2934
3009
BzrError.__init__(self, shelf_id=shelf_id)
3012
class InvalidShelfId(BzrError):
3014
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
3016
def __init__(self, invalid_id):
3017
BzrError.__init__(self, invalid_id=invalid_id)
3020
class JailBreak(BzrError):
3022
_fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
3024
def __init__(self, url):
3025
BzrError.__init__(self, url=url)
2937
3028
class UserAbort(BzrError):
2939
3030
_fmt = 'The user aborted the operation.'
3033
class MustHaveWorkingTree(BzrError):
3035
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
3037
def __init__(self, format, url):
3038
BzrError.__init__(self, format=format, url=url)
3041
class NoSuchView(BzrError):
3042
"""A view does not exist.
3045
_fmt = u"No such view: %(view_name)s."
3047
def __init__(self, view_name):
3048
self.view_name = view_name
3051
class ViewsNotSupported(BzrError):
3052
"""Views are not supported by a tree format.
3055
_fmt = ("Views are not supported by %(tree)s;"
3056
" use 'bzr upgrade' to change your tree to a later format.")
3058
def __init__(self, tree):
3062
class FileOutsideView(BzrError):
3064
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
3067
def __init__(self, file_name, view_files):
3068
self.file_name = file_name
3069
self.view_str = ", ".join(view_files)
3072
class UnresumableWriteGroup(BzrError):
3074
_fmt = ("Repository %(repository)s cannot resume write group "
3075
"%(write_groups)r: %(reason)s")
3077
internal_error = True
3079
def __init__(self, repository, write_groups, reason):
3080
self.repository = repository
3081
self.write_groups = write_groups
3082
self.reason = reason
3085
class UnsuspendableWriteGroup(BzrError):
3087
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3089
internal_error = True
3091
def __init__(self, repository):
3092
self.repository = repository
3095
class LossyPushToSameVCS(BzrError):
3097
_fmt = ("Lossy push not possible between %(source_branch)r and "
3098
"%(target_branch)r that are in the same VCS.")
3100
internal_error = True
3102
def __init__(self, source_branch, target_branch):
3103
self.source_branch = source_branch
3104
self.target_branch = target_branch
3107
class NoRoundtrippingSupport(BzrError):
3109
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3110
"%(target_branch)r.")
3112
internal_error = True
3114
def __init__(self, source_branch, target_branch):
3115
self.source_branch = source_branch
3116
self.target_branch = target_branch
3119
class FileTimestampUnavailable(BzrError):
3121
_fmt = "The filestamp for %(path)s is not available."
3123
internal_error = True
3125
def __init__(self, path):