[SCM] morituri/master: * morituri/program/cdrdao.py: Handle errors. Tested by not having a CD in the drive.

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:09:10 UTC 2014


The following commit has been merged in the master branch:
commit e61a10266d6a17a20bfe70929d9e4d0593f20a3a
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Thu Jul 2 20:36:35 2009 +0000

    	* morituri/program/cdrdao.py:
    	  Handle errors.  Tested by not having a CD in the drive.

diff --git a/ChangeLog b/ChangeLog
index 63f0baa..68970b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2009-07-02  Thomas Vander Stichele  <thomas at apestaart dot org>
 
+	* morituri/program/cdrdao.py:
+	  Handle errors.  Tested by not having a CD in the drive.
+
+2009-07-02  Thomas Vander Stichele  <thomas at apestaart dot org>
+
 	* morituri/common/task.py:
 	  Document better.
 	  Create an ITaskListener interface where we can document.
diff --git a/morituri/program/cdrdao.py b/morituri/program/cdrdao.py
index a544f2d..0158cde 100644
--- a/morituri/program/cdrdao.py
+++ b/morituri/program/cdrdao.py
@@ -67,6 +67,8 @@ _POSITION_RE = re.compile(r"""
     (?P<ss>\d\d)         # SS
 """, re.VERBOSE)
 
+_ERROR_RE = re.compile(r"""^ERROR: (?P<error>.*)""")
+
 class LineParser(object, log.Loggable):
     """
     Parse incoming bytes into lines
@@ -178,9 +180,16 @@ class OutputParser(object, log.Loggable):
     def _parse_START(self, line):
         if line.startswith('Track'):
             self.debug('Found possible track line')
-        if line == "Track   Mode    Flags  Start                Length":
-            self.debug('Found track line, moving to TRACK state')
-            self._state = 'TRACK'
+            if line == "Track   Mode    Flags  Start                Length":
+                self.debug('Found track line, moving to TRACK state')
+                self._state = 'TRACK'
+                return
+
+        m = _ERROR_RE.search(line)
+        if m:
+            error = m.group('error')
+            self._errors.append(error)
+
 
     def _parse_TRACK(self, line):
         if line.startswith('---'):
@@ -263,12 +272,16 @@ class CDRDAOTask(task.Task):
         self._done()
 
     def _done(self):
+            self.debug('Return code was %d', self._popen.returncode)
             self.setProgress(1.0)
+
             if self._popen.returncode != 0:
                 if self._errors:
-                    print "\n".join(self._errors)
+                    self.exception = DeviceOpenException(
+                        "\n".join(self._errors))
                 else:
-                    print 'ERROR: exit code %r' % self._popen.returncode
+                    self.exception = ProgramFailedException(
+                        self._popen.returncode)
             else:
                 self.done()
 
@@ -326,11 +339,19 @@ class DiscInfoTask(CDRDAOTask):
     def readbytesout(self, bytes):
         self.parser.read(bytes)
 
+    def readbyteserr(self, bytes):
+        self.parser.read(bytes)
+
+
     def parse(self, line):
         # called by parser
         if line.startswith('Sessions'):
             self.sessions = int (line[line.find(':') + 1:])
             self.debug('Found %d sessions', self.sessions)
+        m = _ERROR_RE.search(line)
+        if m:
+            error = m.group('error')
+            self._errors.append(error)
 
     def done(self):
         pass
@@ -453,19 +474,20 @@ class ReadAllSessionsTask(task.MultiSeparateTask):
         self.tasks = [DiscInfoTask(device=device), ]
 
     def stopped(self, taskk):
-        # After first task, schedule additional ones
-        if taskk == self.tasks[0]:
-            for i in range(taskk.sessions):
-                self.tasks.append(self._readClass(session=i + 1,
-                    device=self._device))
+        if not taskk.exception:
+            # After first task, schedule additional ones
+            if taskk == self.tasks[0]:
+                for i in range(taskk.sessions):
+                    self.tasks.append(self._readClass(session=i + 1,
+                        device=self._device))
 
-        if self._task == len(self.tasks):
-            self.table = self.tasks[1].table
-            if len(self.tasks) > 2:
-                for i, t in enumerate(self.tasks[2:]):
-                    self.table.merge(t.table, i + 2)
+            if self._task == len(self.tasks):
+                self.table = self.tasks[1].table
+                if len(self.tasks) > 2:
+                    for i, t in enumerate(self.tasks[2:]):
+                        self.table.merge(t.table, i + 2)
 
-            assert self.table.leadout is not None
+                assert self.table.leadout is not None
 
         task.MultiSeparateTask.stopped(self, taskk)
 
@@ -491,3 +513,14 @@ class ReadTOCTask(ReadAllSessionsTask):
 
     description = "Reading TOC..."
     _readClass = ReadTOCSessionTask
+
+class DeviceOpenException(Exception):
+    def __init__(self, msg):
+        self.msg = msg
+        self.args = (msg, )
+
+class ProgramFailedException(Exception):
+    def __init__(self, code):
+        self.code = code
+        self.args = (code, )
+

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list