hgbook

changeset 73:9604dd885616

Fix run-example script on Debian.
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)