~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to fai/pylon/errors.py

  • Committer: Robert Collins
  • Date: 2005-09-13 15:11:39 UTC
  • mto: (147.2.6) (364.1.3 bzrtools)
  • mto: This revision was merged to the branch mainline in revision 324.
  • Revision ID: robertc@robertcollins.net-20050913151139-9ac920fc9d7bda31
TODOification

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2004 Aaron Bentley
 
2
# <aaron.bentley@utoronto.ca>
 
3
#
 
4
#    This program is free software; you can redistribute it and/or modify
 
5
#    it under the terms of the GNU General Public License as published by
 
6
#    the Free Software Foundation; either version 2 of the License, or
 
7
#    (at your option) any later version.
 
8
#
 
9
#    This program is distributed in the hope that it will be useful,
 
10
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
12
#    GNU General Public License for more details.
 
13
#
 
14
#    You should have received a copy of the GNU General Public License
 
15
#    along with this program; if not, write to the Free Software
 
16
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
17
 
 
18
__docformat__ = "restructuredtext"
 
19
__doc__ = "Exception classes"
 
20
import pybaz.errors
 
21
 
 
22
def exception_str(exception):
 
23
    answer = ""
 
24
    if len(str(exception)) > 0:
 
25
        answer +="%s" % str(exception)
 
26
    elif hasattr(exception, "__class__"):
 
27
        answer += exception.__class__.__name__+"\n"
 
28
    if answer == "":
 
29
        answer = "Unknown exception"
 
30
    return answer
 
31
 
 
32
 
 
33
class CommandFailed(Exception):
 
34
    """Abstract base class.  Raise when a subcommand fails."""
 
35
    pass
 
36
 
 
37
 
 
38
class CommandFailedWrapper(CommandFailed):
 
39
   """
 
40
   Raise to cite another exception as a cause of command failure
 
41
   """
 
42
   def __init__(self, e):
 
43
      """
 
44
      Initialize with the wrapped type.
 
45
 
 
46
      :param e: The exception that caused the command to fail
 
47
      """
 
48
      self.e=e
 
49
 
 
50
   def __str__(self):
 
51
      return exception_str(self.e)
 
52
 
 
53
 
 
54
class NoVersionLogs(CommandFailed):
 
55
    """Raise when commit fails because the tree has no logs for the version"""
 
56
    def __init__(self, version):
 
57
        """
 
58
        Initialize with the version that has no logs in the tree.
 
59
 
 
60
        :param version: The version that has no logs in the tree
 
61
        :type version: `arch.Version`
 
62
        """
 
63
        self.version=version
 
64
 
 
65
    def __str__(self):
 
66
        return "No logs in tree for version \""+str(self.version)+"\"."
 
67
 
 
68
 
 
69
class OutOfDate(CommandFailed):
 
70
    """Raise when commit fails because the tree is not up to date"""
 
71
    def __str__(self):
 
72
        return "Tree is not up-to-date"
 
73
 
 
74
 
 
75
class EmptyCommit(CommandFailed):
 
76
    """Raise when commit fails because the tree contains no changes."""
 
77
    def __str__(self):
 
78
        return "Aborting empty commit."
 
79
 
 
80
 
 
81
class NoLogMessage(CommandFailed):
 
82
    """Raise when commit fails because there is no log message."""
 
83
    def __str__(self):
 
84
        return "No log message available."
 
85
 
 
86
 
 
87
class NoLogSummary(CommandFailed):
 
88
    """Raise when commit fails because there is no log message."""
 
89
    def __str__(self):
 
90
        return "Log summary is missing or blank."
 
91
 
 
92
class CommitToMirror(CommandFailed):
 
93
    """Raise when commit fails because it attempts to write to a mirror."""
 
94
    def __init__(self, archive):
 
95
        self.archive=archive
 
96
 
 
97
    def __str__(self):
 
98
        return "Attempt to commit to mirror \""+str(self.archive)+"\"."
 
99
 
 
100
 
 
101
class CommitFailed(CommandFailed):
 
102
    """Raise when commit fails"""
 
103
    def __str__(self):
 
104
        return "Unable to commit"
 
105
 
 
106
 
 
107
class MissingID(CommandFailed):
 
108
    """
 
109
    Raise to indicate a missing ID error.
 
110
    """
 
111
    def __init__(self, err):
 
112
        """
 
113
        Initialize with base error.
 
114
 
 
115
        :param err: The original error that was thrown
 
116
        :type err: `arch.util.ExecProblem`
 
117
        """
 
118
        self.err = err
 
119
 
 
120
    def __str__(self):
 
121
        return str(self.err.proc.error).rstrip("\n")
 
122
 
 
123
 
 
124
class LintFailure(CommandFailed):
 
125
    """
 
126
    Raise to indicate that some files are 'unrecognized'.
 
127
    """
 
128
    def __init__(self, err):
 
129
        """
 
130
        Initialize with lint text.
 
131
 
 
132
        :param err: The original error that was thrown
 
133
        :type err: `str`
 
134
        """
 
135
        self.err = err
 
136
 
 
137
    def __str__(self):
 
138
        return str(self.err).rstrip("\n")
 
139
 
 
140
 
 
141
class UncommittedChanges(CommandFailed):
 
142
    """Raise when merge fails because the tree has uncommitted changes."""
 
143
    def __init__(self, tree):
 
144
        """
 
145
        Initialize with the tree that has uncommitted changes.
 
146
 
 
147
        :param tree: The tree that has uncommitted changes
 
148
        :type tree: `arch.WorkingTree`
 
149
        """
 
150
        self.tree=tree
 
151
 
 
152
    def __str__(self):
 
153
        return "Project tree \"%s\" has has uncommitted changes." % self.tree
 
154
 
 
155
 
 
156
class DirectoryExists(CommandFailed):
 
157
    """Raise when get fails because the tree has no logs for the version"""
 
158
    def __init__(self, directory):
 
159
        """
 
160
        Initialize with the directory that exists.
 
161
 
 
162
        :param directory: The directory that exists 
 
163
        :type directory: str
 
164
        """
 
165
        self.directory=directory
 
166
 
 
167
    def __str__(self):
 
168
        return "Can't create directory.  \""+str(self.directory)+\
 
169
            "\" already exists."
 
170
 
 
171
class NoSuchAlias(CommandFailed):
 
172
    """Raise when command fails because there is no such alias"""
 
173
    def __init__(self, alias):
 
174
        """
 
175
        Initialize with the alias that's missing.
 
176
 
 
177
        :param alias: The fictional alias
 
178
        :type alias: str
 
179
        """
 
180
        self.alias=alias
 
181
 
 
182
    def __str__(self):
 
183
        return "No such alias: "+self.alias    
 
184
 
 
185
 
 
186
class MergeProblem(Exception):
 
187
    """An error occured during merging"""
 
188
    def __init__(self):
 
189
        message = "An error occured during merging"
 
190
        Exception.__init__(self, message)
 
191
 
 
192
class CantDetermineArchive(Exception):
 
193
    """Raise when no archive can be determined"""
 
194
    def __init__(self, spec, explanation):
 
195
        if spec is not None:
 
196
            spectext = "from \"%s\"" % spec
 
197
        else:
 
198
            spectext = "with no archive specification"
 
199
        message = "Unable to determine archive %s:\n%s" % \
 
200
            (spectext, explanation)
 
201
        Exception.__init__(self, message)
 
202
 
 
203
class CantDetermineVersion(Exception):
 
204
    """Raise when no version can be determined"""
 
205
    def __init__(self, spec, explain=""):
 
206
        """
 
207
        Initialize with the spec and optional explanation.
 
208
 
 
209
        :param spec: The version specifier that was used
 
210
        :type spec: string
 
211
        :param explain: An explanation of why the revision specifier didn't work
 
212
        :type explain: string
 
213
        """
 
214
        if spec != None:
 
215
            self.spec=spec
 
216
        else:
 
217
            self.spec=""
 
218
        self.explain=explain
 
219
    def __str__(self):
 
220
        return "Unable to determine version from \""+str(self.spec)+"\".\n"+\
 
221
            self.explain
 
222
 
 
223
 
 
224
class CantDetermineRevision(Exception):
 
225
    """Raise when no revision can be determined"""
 
226
    def __init__(self, spec, explain=""):
 
227
        """
 
228
        Initialize with the spec and optional explanation.
 
229
 
 
230
        :param spec: The revision specifier that was used
 
231
        :type spec: string
 
232
        :param explain: An explanation of why the revision specifier didn't work
 
233
        :type explain: string
 
234
        """
 
235
        if spec != None:
 
236
            self.spec=spec
 
237
        else:
 
238
            self.spec=""
 
239
        self.explain=explain
 
240
    def __str__(self):
 
241
        return "Unable to determine revision from \""+str(self.spec)+"\".\n"+self.explain
 
242
 
 
243
class NoLatestRevision(CantDetermineRevision):
 
244
    """Two trees have merges in common, but merge sequence differs"""
 
245
    def __init__(self, mine, other):
 
246
        message = """Neither tree is the unambiguous latest revision
 
247
MINE candidiate: %s
 
248
OTHER candidate: %s""" % (mine, other)
 
249
        Exception.__init__(self, message)
 
250
        self.mine = mine
 
251
        self.other = other
 
252
        self.message = message
 
253
 
 
254
    __str__ = Exception.__str__
 
255
 
 
256
 
 
257
class UnrelatedTrees(CantDetermineRevision):
 
258
    """Two trees have no merges in common"""
 
259
    def __init__(self, mine, other):
 
260
        message = "No relationship could be found between these trees"
 
261
        Exception.__init__(self, message)
 
262
        self.mine = mine
 
263
        self.other = other
 
264
 
 
265
    __str__ = Exception.__str__
 
266
 
 
267
 
 
268
class CantParseAlias(Exception):
 
269
    "Raise to indicate that alias parsing failed"
 
270
    def __init__(self, text):
 
271
        self.text=text
 
272
    def __str__(self):
 
273
        return "Can't parse alias:\""+self.text+"\""
 
274
 
 
275
class ForbiddenAliasSyntax(Exception):
 
276
    "Raise to indicate that alias name uses forbidden syntax"
 
277
    def __init__(self, text):
 
278
        self.text=text
 
279
    def __str__(self):
 
280
        return "Forbidden alias syntax:\""+self.text+"\""
 
281
 
 
282
 
 
283
class BadOption(Exception):
 
284
    """Raise if a prompting option is set to a bogus value"""
 
285
    pass
 
286
 
 
287
 
 
288
class NoEditorSpecified(Exception):
 
289
    """
 
290
    Raise when an editor is requested, but none is available.
 
291
    """
 
292
    def __str__(self):
 
293
        return "No editor specified."
 
294
 
 
295
 
 
296
class GetHelp(Exception):
 
297
    """Indicate that help is required, not normal command execution"""
 
298
 
 
299
 
 
300
class TreeNotContain(Exception):
 
301
    """Indicates that tree does not contain a given path.
 
302
    """
 
303
    def __init__(self, tree, path):
 
304
        self.path = path
 
305
        self.tree = tree
 
306
 
 
307
    def __str__(self):
 
308
        return "The tree \"%s\" does not contain \"%s\"." % \
 
309
        (self.tree, self.path)
 
310
 
 
311
 
 
312
class ArchiveLookupError(Exception):
 
313
    """Raise to indicate an error that prevented the lookup from completing
 
314
    """
 
315
    def __init__(self, exception, arch_name, resource):
 
316
        self.exception = exception
 
317
        self.arch_name = arch_name
 
318
        self.resource = resource
 
319
 
 
320
    def __str__(self):
 
321
        return "Error encountered looking up \"%s\" at %s.\n%s" % \
 
322
            (self.arch_name, self.resource, exception_str(self.exception))
 
323
 
 
324
 
 
325
class SubmitError(Exception):
 
326
    """Error submitting an archive to an arch registry"""
 
327
    def __init__(self, archive, location, registry, result):
 
328
        message = """Failed to register location.
 
329
Archive: %s
 
330
Location: %s
 
331
Registry: %s
 
332
Result: %s""" % (archive, location, registry, result)
 
333
        self.archive = archive
 
334
        self.location = location
 
335
        self.registry = registry
 
336
        self.result = result
 
337
        Exception.__init__(self, message)
 
338
 
 
339
 
 
340
class NoSuchRevision(Exception):
 
341
    """Raise when a required revision does not exist."""
 
342
    def __init__(self, revision):
 
343
        self.revision=revision
 
344
 
 
345
    def __str__(self):
 
346
        return "This revision does not exist:\n"+str(self.revision)
 
347
 
 
348
 
 
349
class NoVersionRevisions(Exception):
 
350
    """The tree has no revisions for the desired version."""
 
351
    def __init__(self, tree, version):
 
352
        self.tree = tree
 
353
        self.version = version
 
354
 
 
355
    def __str__(self):
 
356
        return "No logs for %s present in tree %s" % (self.version, self.tree)
 
357
 
 
358
 
 
359
class WrongArchName(Exception):
 
360
    """Attempt to register the archive with the wrong name"""
 
361
    def __init__(self, location, right_name, wrong_name):
 
362
        self.location = location
 
363
        self.right_name = right_name
 
364
        self.wrong_name = wrong_name
 
365
    def __str__(self):
 
366
        return "Attempt to register %s with location %s, but that's really %s" \
 
367
            % (self.right_name, self.location, self.wrong_name)
 
368
 
 
369
class BlandSubject(CommandFailed):
 
370
    """The subject line of an email has no useful information"""
 
371
    def __init__(self):
 
372
        CommandFailed.__init__(self, "No meaningful subject line")
 
373
 
 
374
class NoArchParams(Exception):
 
375
    """The user's parameter directory does not exist/cannot be found"""
 
376
    def __init__(self, dir):
 
377
        self.dir = dir
 
378
        message = "Arch parameter directory does not exist\ndir: %s" % dir
 
379
        Exception.__init__(self, message)
 
380
 
 
381
 
 
382
class InvalidChangeset(Exception):
 
383
    """The user's parameter directory does not exist/cannot be found"""
 
384
    def __init__(self, dir):
 
385
        self.dir = dir
 
386
        message = "Directory is not a valid changeset.\ndir: %s" % dir
 
387
        Exception.__init__(self, message)
 
388
 
 
389
 
 
390
class NotLibrary(Exception):
 
391
    """A directory that was not library was spcified as if it was one."""
 
392
    def __init__(self, dir):
 
393
        self.dir = dir
 
394
        message = "Specified directory is not a library.\ndir: %s" % dir
 
395
        Exception.__init__(self, message)
 
396
 
 
397
 
 
398
class NoGreedy(Exception):
 
399
    """A greedy library was required, but not available."""
 
400
    def __init__(self, revision):
 
401
        self.revision = revision
 
402
        message = "No greedy libraries found adding revision.\nrevision: %s" %\
 
403
            revision
 
404
        Exception.__init__(self, message)
 
405
 
 
406
class TreeRootNone(pybaz.errors.TreeRootError):
 
407
    """None was supplied instead of a valid tree root"""
 
408
    def __init__(self):
 
409
        message = "No tree root supplied"
 
410
        Exception.__init__(self, message)
 
411
 
 
412
class IsAutoAlias(CommandFailed):
 
413
    """User attempted to redefine an auto alias"""
 
414
    def __init__(self, alias, message=None):
 
415
        self.revision = alias
 
416
        if message is None:
 
417
            message = "\"%s\" is an auto alias." % alias
 
418
        Exception.__init__(self, message)
 
419
 
 
420
class TarError(Exception):
 
421
    """An error occurred using tar"""
 
422
    def __init__(self, msg):
 
423
        Exception.__init__(self, msg)
 
424
    
 
425
 
 
426
class UnknownCompressionMethod(TarError):
 
427
    """User specified an unknown compression method"""
 
428
    def __init__(self, method):
 
429
        self.method = method
 
430
        msg = "Compression method \"%s\" is unknown." % self.method
 
431
        TarError.__init__(self, msg)
 
432
 
 
433
class NoUnambiguousParent(TarError):
 
434
    """This tarfile doesn't follow the convention of a single root dir"""
 
435
    def __init__(self, file, dir):
 
436
        self.file = file
 
437
        self.dir = dir 
 
438
        msg = "The file \"%s\" does not have \"%s\" as a parent" % (self.file, 
 
439
                                                                    self.dir)
 
440
        TarError.__init__(self, msg)
 
441
 
 
442
class UnsupportedScheme(Exception):
 
443
    def __init__(self, location):
 
444
        msg = "Unsupported scheme: %s" % location
 
445
        self.location = location
 
446
        Exception.__init__(self, msg)
 
447
 
 
448
# arch-tag: fd8812b0-2d93-4b7c-a669-24a915d86ec1