]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
more elegant way to treat exit status
authorGuido van Rossum <guido@python.org>
Sat, 7 Oct 1995 20:48:17 +0000 (20:48 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 7 Oct 1995 20:48:17 +0000 (20:48 +0000)
Demo/pdist/rcslib.py

index 4b34fd76489d401a07cc8e92ecc3ebf954a53333..43dcf0a07ef8905ffca37d7998503be09f36d247 100755 (executable)
@@ -53,7 +53,11 @@ class RCS:
        """
        f = self._open(name_rev, 'rlog ' + otherflags)
        data = f.read()
-       self._closepipe(f)
+       status = self._closepipe(f)
+       if status:
+           data = data + "%s: %s" % status
+       elif data[-1] == '\n':
+           data = data[:-1]
        return data
 
     def head(self, name_rev):
@@ -84,7 +88,9 @@ class RCS:
            if i > 0:
                key, value = line[:i], string.strip(line[i+1:])
                dict[key] = value
-       self._closepipe(f)
+       status = self._closepipe(f)
+       if status:
+           raise IOError, status
        return dict
 
     # --- Methods that change files ---
@@ -215,7 +221,9 @@ class RCS:
        """
        f = self._open(name_rev, 'rlog -L -R')
        line = f.readline()
-       self._closepipe(f)
+       status = self._closepipe(f)
+       if status:
+           raise IOError, status
        if not line: return None
        return self.realname(name_rev) == self.realname(line)
 
@@ -247,7 +255,7 @@ class RCS:
        namev = self.rcsname(name)
        if rev:
            cmd = cmd + ' ' + rflag + rev
-       return os.popen('%s %s' %  (cmd, `namev`))
+       return os.popen("%s %s" % (cmd, `namev`))
 
     def _unmangle(self, name_rev):
        """INTERNAL: Normalize NAME_REV argument to (NAME, REV) tuple.
@@ -270,8 +278,18 @@ class RCS:
     def _closepipe(self, f):
        """INTERNAL: Close PIPE and print its exit status if nonzero."""
        sts = f.close()
-       if sts:
-           raise IOError, "Exit status %d" % sts
+       if not sts: return None
+       detail, reason = divmod(sts, 256)
+       if reason == 0: return 'exit', detail   # Exit status
+       signal = reason&0x7F
+       if signal == 0x7F:
+           code = 'stopped'
+           signal = detail
+       else:
+           code = 'killed'
+       if reason&0x80:
+           code = code + '(coredump)'
+       return code, signal
  
     def _system(self, cmd):
        """INTERNAL: run COMMAND in a subshell.