a TaskException already wraps another exception; raising it gives a
hard-to-read multi-line message instead of showing the clean wrapped
original backtrace; for comparison, an asserton error in image.py line
253:
exception AssertionError at /home/chrysn/git/whipper/morituri/image/image.py:253: stop(): Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)
Traceback (most recent call last):
File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 497, in _startWrap
task.start(self)
File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 395, in start
BaseMultiTask.start(self, runner)
File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 330, in start
self.next()
File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 401, in next
BaseMultiTask.next(self)
File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 351, in next
self.stop()
File "/home/chrysn/git/whipper/morituri/image/image.py", line 253, in stop
assert taskk.length is not None, "Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)"
AssertionError: Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)
vs.
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/chrysn/git/whipper/morituri/rip/main.py", line 27, in main
ret = c.parse(sys.argv[1:])
File "/home/chrysn/git/whipper/morituri/rip/main.py", line 94, in parse
logcommand.LogCommand.parse(self, argv)
File "/home/chrysn/git/whipper/morituri/common/logcommand.py", line 62, in parse
command.Command.parse(self, argv)
File "/home/chrysn/git/whipper/morituri/extern/command/command.py", line 401, in parse
return self.subCommands[command].parse(args[1:])
File "/home/chrysn/git/whipper/morituri/common/logcommand.py", line 62, in parse
command.Command.parse(self, argv)
File "/home/chrysn/git/whipper/morituri/extern/command/command.py", line 401, in parse
return self.subCommands[command].parse(args[1:])
File "/home/chrysn/git/whipper/morituri/common/logcommand.py", line 62, in parse
command.Command.parse(self, argv)
File "/home/chrysn/git/whipper/morituri/extern/command/command.py", line 363, in parse
ret = self.do(args)
File "/home/chrysn/git/whipper/morituri/rip/image.py", line 184, in do
cueImage.setup(runner)
File "/home/chrysn/git/whipper/morituri/image/image.py", line 75, in setup
runner.run(verify)
File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 490, in run
raise TaskException(task.exception, message=msg)
morituri.extern.task.task.TaskException: (AssertionError('Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)',), 'exception AssertionError at /home/chrysn/git/whipper/morituri/image/image.py:253: stop(): Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)\nTraceback (most recent call last):\n File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 497, in _startWrap\n task.start(self)\n File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 395, in start\n BaseMultiTask.start(self, runner)\n File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 330, in start\n self.next()\n File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 401, in next\n BaseMultiTask.next(self)\n File "/home/chrysn/git/whipper/morituri/extern/task/task.py", line 351, in next\n self.stop()\n File "/home/chrysn/git/whipper/morituri/image/image.py", line 253, in stop\n assert taskk.length is not None, "Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)"\nAssertionError: Track length was not found; look for earlier errors in debug log (set RIP_DEBUG=4)\n')
98 lines
3.1 KiB
Python
98 lines
3.1 KiB
Python
# -*- Mode: Python -*-
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
|
|
|
import os
|
|
import sys
|
|
import pkg_resources
|
|
import musicbrainzngs
|
|
|
|
from morituri.common import log, logcommand, common, config, directory
|
|
from morituri.configure import configure
|
|
from morituri.extern.command import command
|
|
from morituri.extern.task import task
|
|
from morituri.rip import cd, offset, drive, image, accurip, debug
|
|
|
|
|
|
def main():
|
|
# set user agent
|
|
musicbrainzngs.set_useragent("morituri", configure.version,
|
|
'https://thomas.apestaart.org/morituri/trac')
|
|
# register plugins with pkg_resources
|
|
distributions, _ = pkg_resources.working_set.find_plugins(
|
|
pkg_resources.Environment([directory.data_path('plugins')])
|
|
)
|
|
map(pkg_resources.working_set.add, distributions)
|
|
c = Rip()
|
|
try:
|
|
ret = c.parse(sys.argv[1:])
|
|
except SystemError, e:
|
|
sys.stderr.write('rip: error: %s\n' % e.args)
|
|
return 255
|
|
except ImportError, e:
|
|
raise ImportError(e)
|
|
except task.TaskException, e:
|
|
if isinstance(e.exception, ImportError):
|
|
raise ImportError(e.exception)
|
|
elif isinstance(e.exception, common.MissingDependencyException):
|
|
sys.stderr.write('rip: error: missing dependency "%s"\n' %
|
|
e.exception.dependency)
|
|
return 255
|
|
|
|
if isinstance(e.exception, common.EmptyError):
|
|
log.debug('main',
|
|
"EmptyError: %r", log.getExceptionMessage(e.exception))
|
|
sys.stderr.write(
|
|
'rip: error: Could not create encoded file.\n')
|
|
return 255
|
|
|
|
# in python3 we can instead do `raise e.exception` as that would show
|
|
# the exception's original context
|
|
sys.stderr.write(e.exceptionMessage)
|
|
return 255
|
|
except command.CommandError, e:
|
|
sys.stderr.write('rip: error: %s\n' % e.output)
|
|
return e.status
|
|
|
|
if ret is None:
|
|
return 0
|
|
|
|
return ret
|
|
|
|
|
|
class Rip(logcommand.LogCommand):
|
|
usage = "%prog %command"
|
|
description = """Rip rips CD's.
|
|
|
|
Rip gives you a tree of subcommands to work with.
|
|
You can get help on subcommands by using the -h option to the subcommand.
|
|
"""
|
|
|
|
subCommandClasses = [accurip.AccuRip,
|
|
cd.CD, debug.Debug, drive.Drive, offset.Offset, image.Image, ]
|
|
|
|
def addOptions(self):
|
|
# FIXME: is this the right place ?
|
|
log.init()
|
|
log.debug("morituri", "This is morituri version %s (%s)",
|
|
configure.version, configure.revision)
|
|
|
|
self.parser.add_option('-R', '--record',
|
|
action="store_true", dest="record",
|
|
help="record API requests for playback")
|
|
self.parser.add_option('-v', '--version',
|
|
action="store_true", dest="version",
|
|
help="show version information")
|
|
|
|
def handleOptions(self, options):
|
|
if options.version:
|
|
print "rip %s" % configure.version
|
|
sys.exit(0)
|
|
|
|
self.record = options.record
|
|
|
|
self.config = config.Config()
|
|
|
|
def parse(self, argv):
|
|
log.debug("morituri", "rip %s" % " ".join(argv))
|
|
logcommand.LogCommand.parse(self, argv)
|