comparison en/examples/run-example @ 160:745ff473c8c4

Catch more errors.
author Bryan O'Sullivan <bos@serpentine.com>
date Mon, 26 Mar 2007 21:25:34 -0700
parents 914babdc99c8
children 8f4c9ae918af
comparison
equal deleted inserted replaced
159:7355af913937 160:745ff473c8c4
209 (self.name, out)) 209 (self.name, out))
210 return 1 210 return 1
211 assert os.sep not in out 211 assert os.sep not in out
212 if ofp is not None: 212 if ofp is not None:
213 ofp.close() 213 ofp.close()
214 err = self.rename_output(ofp_basename, ignore) 214 err |= self.rename_output(ofp_basename, ignore)
215 if out: 215 if out:
216 ofp_basename = '%s.%s' % (self.name, out) 216 ofp_basename = '%s.%s' % (self.name, out)
217 ofp = open(ofp_basename + '.tmp', 'w') 217 ofp = open(ofp_basename + '.tmp', 'w')
218 else: 218 else:
219 ofp = None 219 ofp = None
245 try: 245 try:
246 ps, output = self.sendreceive('exit\n') 246 ps, output = self.sendreceive('exit\n')
247 if ofp is not None: 247 if ofp is not None:
248 ofp.write(output) 248 ofp.write(output)
249 ofp.close() 249 ofp.close()
250 err = self.rename_output(ofp_basename, ignore) 250 err |= self.rename_output(ofp_basename, ignore)
251 os.close(self.cfd) 251 os.close(self.cfd)
252 except IOError: 252 except IOError:
253 pass 253 pass
254 os.kill(self.pid, signal.SIGTERM) 254 os.kill(self.pid, signal.SIGTERM)
255 pid, rc = os.wait() 255 pid, rc = os.wait()
256 if rc: 256 err = err or rc
257 if err:
257 if os.WIFEXITED(rc): 258 if os.WIFEXITED(rc):
258 print >> sys.stderr, '(exit %s)' % os.WEXITSTATUS(rc) 259 print >> sys.stderr, '(exit %s)' % os.WEXITSTATUS(rc)
259 elif os.WIFSIGNALED(rc): 260 elif os.WIFSIGNALED(rc):
260 print >> sys.stderr, '(signal %s)' % os.WTERMSIG(rc) 261 print >> sys.stderr, '(signal %s)' % os.WTERMSIG(rc)
261 else: 262 else:
262 open(self.name + '.run', 'w') 263 open(self.name + '.run', 'w')
263 return rc or err 264 return err
264 finally: 265 finally:
265 shutil.rmtree(tmpdir) 266 shutil.rmtree(tmpdir)
266 267
267 def rename_output(self, base, ignore): 268 def rename_output(self, base, ignore):
268 mangle_re = re.compile('(?:' + '|'.join(ignore) + ')') 269 mangle_re = re.compile('(?:' + '|'.join(ignore) + ')')
290 oldfp = open(oldname) 291 oldfp = open(oldname)
291 except IOError, err: 292 except IOError, err:
292 if err.errno != errno.ENOENT: 293 if err.errno != errno.ENOENT:
293 raise 294 raise
294 os.rename(errname, oldname) 295 os.rename(errname, oldname)
295 return 296 return False
296 if matchfp(oldfp, errfp): 297 if matchfp(oldfp, errfp):
297 os.unlink(errname) 298 os.unlink(errname)
299 return False
298 else: 300 else:
299 print >> sys.stderr, '\nOutput of %s has changed!' % base 301 print >> sys.stderr, '\nOutput of %s has changed!' % base
300 os.system('diff -u %s %s 1>&2' % (oldname, errname)) 302 os.system('diff -u %s %s 1>&2' % (oldname, errname))
301 return True 303 return True
302 304