hgbook
changeset 73:9604dd885616
Fix run-example script on Debian.
Still works on Fedora, too.
Still works on Fedora, too.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Wed Aug 30 00:01:45 2006 -0700 (2006-08-30) |
parents | 12df31afb4e1 |
children | ec1f144968de |
files | en/examples/run-example |
line diff
1.1 --- a/en/examples/run-example Tue Aug 29 22:34:03 2006 -0700 1.2 +++ b/en/examples/run-example Wed Aug 30 00:01:45 2006 -0700 1.3 @@ -5,9 +5,11 @@ 1.4 # files, for use in examples. 1.5 1.6 import cStringIO 1.7 +import errno 1.8 import os 1.9 import pty 1.10 import re 1.11 +import select 1.12 import shutil 1.13 import signal 1.14 import stat 1.15 @@ -26,7 +28,7 @@ 1.16 1.17 class example: 1.18 shell = '/usr/bin/env bash' 1.19 - prompt = '__run_example_prompt__\n' 1.20 + prompt = '__run_example_prompt__ ' 1.21 pi_re = re.compile(r'#\$\s*(name):\s*(.*)$') 1.22 1.23 def __init__(self, name): 1.24 @@ -49,17 +51,23 @@ 1.25 sys.stdout.flush() 1.26 1.27 def send(self, s): 1.28 - self.cfp.write(s) 1.29 - self.cfp.flush() 1.30 + while s: 1.31 + count = os.write(self.cfd, s) 1.32 + s = s[count:] 1.33 1.34 def receive(self): 1.35 out = cStringIO.StringIO() 1.36 while True: 1.37 - s = self.cfp.readline().replace('\r\n', '\n') 1.38 - if not s or s == self.prompt: 1.39 - break 1.40 + try: 1.41 + s = os.read(self.cfd, 1024) 1.42 + except OSError, err: 1.43 + if err.errno == errno.EIO: 1.44 + return '' 1.45 + raise 1.46 out.write(s) 1.47 - return out.getvalue() 1.48 + s = out.getvalue() 1.49 + if s.endswith(self.prompt): 1.50 + return s.replace('\r\n', '\n')[:-len(self.prompt)] 1.51 1.52 def sendreceive(self, s): 1.53 self.send(s) 1.54 @@ -87,7 +95,7 @@ 1.55 rcfp.close() 1.56 sys.stdout.flush() 1.57 sys.stderr.flush() 1.58 - pid, fd = pty.fork() 1.59 + pid, self.cfd = pty.fork() 1.60 if pid == 0: 1.61 cmdline = ['/usr/bin/env', 'bash', '--noediting', '--noprofile', 1.62 '--norc'] 1.63 @@ -97,11 +105,12 @@ 1.64 print >> sys.stderr, '%s: %s' % (cmdline[0], err.strerror) 1.65 sys.stderr.flush() 1.66 os._exit(0) 1.67 - self.cfp = os.fdopen(fd, 'w+') 1.68 try: 1.69 try: 1.70 + # eat first prompt string from shell 1.71 + os.read(self.cfd, 1024) 1.72 # setup env and prompt 1.73 - self.sendreceive('source %s\n\n' % rcfile) 1.74 + self.sendreceive('source %s\n' % rcfile) 1.75 for hunk in self.parse(): 1.76 # is this line a processing instruction? 1.77 m = self.pi_re.match(hunk) 1.78 @@ -141,7 +150,7 @@ 1.79 output = self.sendreceive('exit\n') 1.80 if ofp: 1.81 ofp.write(output) 1.82 - self.cfp.close() 1.83 + os.close(self.cfd) 1.84 except IOError: 1.85 pass 1.86 os.kill(pid, signal.SIGTERM)