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