hgbook

changeset 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
files .hgignore en/examples/run-example
line diff
     1.1 --- a/.hgignore	Mon Mar 05 20:26:23 2007 -0800
     1.2 +++ b/.hgignore	Mon Mar 05 23:56:30 2007 -0800
     1.3 @@ -12,6 +12,7 @@
     1.4  *.blg
     1.5  *.dvi
     1.6  *.eps
     1.7 +*.err
     1.8  *.idx
     1.9  *.ilg
    1.10  *.ind
     2.1 --- a/en/examples/run-example	Mon Mar 05 20:26:23 2007 -0800
     2.2 +++ b/en/examples/run-example	Mon Mar 05 23:56:30 2007 -0800
     2.3 @@ -37,11 +37,20 @@
     2.4  def tex_escape(s):
     2.5      return ''.join(gensubs(s))
     2.6          
     2.7 +def maybe_unlink(name):
     2.8 +    try:
     2.9 +        os.unlink(name)
    2.10 +        return True
    2.11 +    except OSError, err:
    2.12 +        if err.errno != errno.ENOENT:
    2.13 +            raise
    2.14 +    return False
    2.15 +
    2.16  class example:
    2.17      shell = '/usr/bin/env bash'
    2.18      ps1 = '__run_example_ps1__ '
    2.19      ps2 = '__run_example_ps2__ '
    2.20 -    pi_re = re.compile(r'#\$\s*(name):\s*(.*)$')
    2.21 +    pi_re = re.compile(r'#\$\s*(name|ignore):\s*(.*)$')
    2.22      
    2.23      timeout = 5
    2.24  
    2.25 @@ -126,11 +135,7 @@
    2.26  
    2.27          # remove the marker file that we tell make to use to see if
    2.28          # this run succeeded
    2.29 -        try:
    2.30 -            os.unlink(self.name + '.run')
    2.31 -        except OSError, err:
    2.32 -            if err.errno != errno.ENOENT:
    2.33 -                raise
    2.34 +        maybe_unlink(self.name + '.run')
    2.35  
    2.36          rcfile = os.path.join(tmpdir, '.hgrc')
    2.37          rcfp = open(rcfile, 'w')
    2.38 @@ -172,6 +177,13 @@
    2.39              self.ps2: '>',
    2.40              }
    2.41  
    2.42 +        ignore = [
    2.43 +            r'\d+:[0-9a-f]{12}', # changeset number:hash
    2.44 +            r'^(?:---|\+\+\+) .*', # diff header with dates
    2.45 +            r'^date:.*', # date
    2.46 +            r'^diff -r.*', # "diff -r" is followed by hash
    2.47 +            ]
    2.48 +
    2.49          try:
    2.50              try:
    2.51                  # eat first prompt string from shell
    2.52 @@ -187,10 +199,16 @@
    2.53                              self.status('.')
    2.54                              out = rest
    2.55                              assert os.sep not in out
    2.56 +                            if ofp is not None:
    2.57 +                                ofp.close()
    2.58 +                                self.rename_output(ofp_basename, ignore)
    2.59                              if out:
    2.60 -                                ofp = open('%s.%s.out' % (self.name, out), 'w')
    2.61 +                                ofp_basename = '%s.%s' % (self.name, out)
    2.62 +                                ofp = open(ofp_basename + '.tmp', 'w')
    2.63                              else:
    2.64                                  ofp = None
    2.65 +                        elif pi == 'ignore':
    2.66 +                            ignore.append(rest)
    2.67                      elif hunk.strip():
    2.68                          # it's something we should execute
    2.69                          newps, output = self.sendreceive(hunk)
    2.70 @@ -234,6 +252,41 @@
    2.71          finally:
    2.72              shutil.rmtree(tmpdir)
    2.73  
    2.74 +    def rename_output(self, base, ignore):
    2.75 +        mangle_re = re.compile('(?:' + '|'.join(ignore) + ')')
    2.76 +        def mangle(s):
    2.77 +            return mangle_re.sub('', s)
    2.78 +        def matchfp(fp1, fp2):
    2.79 +            while True:
    2.80 +                s1 = mangle(fp1.readline())
    2.81 +                s2 = mangle(fp2.readline())
    2.82 +                if cmp(s1, s2):
    2.83 +                    break
    2.84 +                if not s1:
    2.85 +                    return True
    2.86 +            return False
    2.87 +
    2.88 +        oldname = base + '.out'
    2.89 +        tmpname = base + '.tmp'
    2.90 +        errname = base + '.err'
    2.91 +        errfp = open(errname, 'w+')
    2.92 +        for line in open(tmpname):
    2.93 +            errfp.write(mangle_re.sub('', line))
    2.94 +        os.unlink(tmpname)
    2.95 +        errfp.seek(0)
    2.96 +        try:
    2.97 +            oldfp = open(oldname)
    2.98 +        except IOError, err:
    2.99 +            if err.errno != errno.ENOENT:
   2.100 +                raise
   2.101 +            os.rename(errname, oldname)
   2.102 +            return
   2.103 +        if matchfp(oldfp, errfp):
   2.104 +            os.unlink(errname)
   2.105 +        else:
   2.106 +            print >> sys.stderr, '\nOutput of %s has changed!' % base
   2.107 +            os.system('diff -u %s %s 1>&2' % (oldname, errname))
   2.108 +
   2.109  def main(path='.'):
   2.110      opts, args = getopt.getopt(sys.argv[1:], 'v', ['verbose'])
   2.111      verbose = False