~abentley/bzrtools/bzrtools.dev

« back to all changes in this revision

Viewing changes to fai/pylon/errors.py

  • Committer: Robert Collins
  • Date: 2005-09-14 11:27:20 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-20050914112720-c66a21de86eafa6e
trim fai cribbage

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