summaryrefslogtreecommitdiffstats
path: root/Demo/pdist/rcslib.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-10-07 20:48:17 (GMT)
committerGuido van Rossum <guido@python.org>1995-10-07 20:48:17 (GMT)
commitc0c01f79c63952206d962a14b78236e5e0ae9147 (patch)
tree025fc8a719a63a528f7bd77d535247b916d9f1aa /Demo/pdist/rcslib.py
parenta176f585c4643821e4d9af7931eee7e1a6d83818 (diff)
downloadcpython-c0c01f79c63952206d962a14b78236e5e0ae9147.zip
cpython-c0c01f79c63952206d962a14b78236e5e0ae9147.tar.gz
cpython-c0c01f79c63952206d962a14b78236e5e0ae9147.tar.bz2
more elegant way to treat exit status
Diffstat (limited to 'Demo/pdist/rcslib.py')
-rwxr-xr-xDemo/pdist/rcslib.py30
1 files changed, 24 insertions, 6 deletions
diff --git a/Demo/pdist/rcslib.py b/Demo/pdist/rcslib.py
index 4b34fd7..43dcf0a 100755
--- a/Demo/pdist/rcslib.py
+++ b/Demo/pdist/rcslib.py
@@ -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.