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