hgbook

diff en/examples/run-example @ 137:9d7dffe74b2c

Save "good" example output so we can see if something has broken.
author Bryan O'Sullivan <bos@serpentine.com>
date Mon Mar 05 23:56:30 2007 -0800 (2007-03-05)
parents 7b5894fffc37
children d374685eb7fa
line diff
     1.1 --- a/en/examples/run-example	Mon Mar 05 20:26:23 2007 -0800
     1.2 +++ b/en/examples/run-example	Mon Mar 05 23:56:30 2007 -0800
     1.3 @@ -37,11 +37,20 @@
     1.4  def tex_escape(s):
     1.5      return ''.join(gensubs(s))
     1.6          
     1.7 +def maybe_unlink(name):
     1.8 +    try:
     1.9 +        os.unlink(name)
    1.10 +        return True
    1.11 +    except OSError, err:
    1.12 +        if err.errno != errno.ENOENT:
    1.13 +            raise
    1.14 +    return False
    1.15 +
    1.16  class example:
    1.17      shell = '/usr/bin/env bash'
    1.18      ps1 = '__run_example_ps1__ '
    1.19      ps2 = '__run_example_ps2__ '
    1.20 -    pi_re = re.compile(r'#\$\s*(name):\s*(.*)$')
    1.21 +    pi_re = re.compile(r'#\$\s*(name|ignore):\s*(.*)$')
    1.22      
    1.23      timeout = 5
    1.24  
    1.25 @@ -126,11 +135,7 @@
    1.26  
    1.27          # remove the marker file that we tell make to use to see if
    1.28          # this run succeeded
    1.29 -        try:
    1.30 -            os.unlink(self.name + '.run')
    1.31 -        except OSError, err:
    1.32 -            if err.errno != errno.ENOENT:
    1.33 -                raise
    1.34 +        maybe_unlink(self.name + '.run')
    1.35  
    1.36          rcfile = os.path.join(tmpdir, '.hgrc')
    1.37          rcfp = open(rcfile, 'w')
    1.38 @@ -172,6 +177,13 @@
    1.39              self.ps2: '>',
    1.40              }
    1.41  
    1.42 +        ignore = [
    1.43 +            r'\d+:[0-9a-f]{12}', # changeset number:hash
    1.44 +            r'^(?:---|\+\+\+) .*', # diff header with dates
    1.45 +            r'^date:.*', # date
    1.46 +            r'^diff -r.*', # "diff -r" is followed by hash
    1.47 +            ]
    1.48 +
    1.49          try:
    1.50              try:
    1.51                  # eat first prompt string from shell
    1.52 @@ -187,10 +199,16 @@
    1.53                              self.status('.')
    1.54                              out = rest
    1.55                              assert os.sep not in out
    1.56 +                            if ofp is not None:
    1.57 +                                ofp.close()
    1.58 +                                self.rename_output(ofp_basename, ignore)
    1.59                              if out:
    1.60 -                                ofp = open('%s.%s.out' % (self.name, out), 'w')
    1.61 +                                ofp_basename = '%s.%s' % (self.name, out)
    1.62 +                                ofp = open(ofp_basename + '.tmp', 'w')
    1.63                              else:
    1.64                                  ofp = None
    1.65 +                        elif pi == 'ignore':
    1.66 +                            ignore.append(rest)
    1.67                      elif hunk.strip():
    1.68                          # it's something we should execute
    1.69                          newps, output = self.sendreceive(hunk)
    1.70 @@ -234,6 +252,41 @@
    1.71          finally:
    1.72              shutil.rmtree(tmpdir)
    1.73  
    1.74 +    def rename_output(self, base, ignore):
    1.75 +        mangle_re = re.compile('(?:' + '|'.join(ignore) + ')')
    1.76 +        def mangle(s):
    1.77 +            return mangle_re.sub('', s)
    1.78 +        def matchfp(fp1, fp2):
    1.79 +            while True:
    1.80 +                s1 = mangle(fp1.readline())
    1.81 +                s2 = mangle(fp2.readline())
    1.82 +                if cmp(s1, s2):
    1.83 +                    break
    1.84 +                if not s1:
    1.85 +                    return True
    1.86 +            return False
    1.87 +
    1.88 +        oldname = base + '.out'
    1.89 +        tmpname = base + '.tmp'
    1.90 +        errname = base + '.err'
    1.91 +        errfp = open(errname, 'w+')
    1.92 +        for line in open(tmpname):
    1.93 +            errfp.write(mangle_re.sub('', line))
    1.94 +        os.unlink(tmpname)
    1.95 +        errfp.seek(0)
    1.96 +        try:
    1.97 +            oldfp = open(oldname)
    1.98 +        except IOError, err:
    1.99 +            if err.errno != errno.ENOENT:
   1.100 +                raise
   1.101 +            os.rename(errname, oldname)
   1.102 +            return
   1.103 +        if matchfp(oldfp, errfp):
   1.104 +            os.unlink(errname)
   1.105 +        else:
   1.106 +            print >> sys.stderr, '\nOutput of %s has changed!' % base
   1.107 +            os.system('diff -u %s %s 1>&2' % (oldname, errname))
   1.108 +
   1.109  def main(path='.'):
   1.110      opts, args = getopt.getopt(sys.argv[1:], 'v', ['verbose'])
   1.111      verbose = False