]> git.cworth.org Git - apitrace/blobdiff - scripts/retracediff.py
Use wdiff by default.
[apitrace] / scripts / retracediff.py
index 0b6a3b09f5713402b8ae8d249891ed31c7d76b5c..8a0837a82bf6a17d9e973c62db70cdbaf6b9860c 100755 (executable)
@@ -37,7 +37,7 @@ import sys
 from PIL import Image
 
 from snapdiff import Comparer
-from highlight import Highlighter
+from highlight import AutoHighlighter
 import jsondiff
 
 
@@ -54,37 +54,42 @@ class Setup:
         self.args = args
         self.env = env
 
-    def retrace(self):
+    def _retrace(self, args):
         cmd = [
             options.retrace,
+        ] + args + self.args
+        try:
+            return subprocess.Popen(cmd, env=self.env, stdout=subprocess.PIPE, stderr=NULL)
+        except OSError, ex:
+            sys.stderr.write('error: failed to execute %s: %s\n' % (cmd[0], ex.strerror))
+            sys.exit(1)
+
+    def retrace(self):
+        return self._retrace([
             '-s', '-',
             '-S', options.snapshot_frequency,
-        ] + self.args
-        p = subprocess.Popen(cmd, env=self.env, stdout=subprocess.PIPE, stderr=NULL)
-        return p
+        ])
 
     def dump_state(self, call_no):
         '''Get the state dump at the specified call no.'''
 
-        cmd = [
-            options.retrace,
+        p = self._retrace([
             '-D', str(call_no),
-        ] + self.args
-        p = subprocess.Popen(cmd, env=self.env, stdout=subprocess.PIPE, stderr=NULL)
+        ])
         state = jsondiff.load(p.stdout)
         p.wait()
         return state.get('parameters', {})
 
-    def diff_state(self, ref_call_no, src_call_no):
+    def diff_state(self, ref_call_no, src_call_no, stream):
         '''Compare the state between two calls.'''
 
         ref_state = self.dump_state(ref_call_no)
         src_state = self.dump_state(src_call_no)
 
-        sys.stdout.flush()
-        differ = jsondiff.Differ(sys.stdout)
+        stream.flush()
+        differ = jsondiff.Differ(stream)
         differ.visit(ref_state, src_state)
-        sys.stdout.write('\n')
+        stream.write('\n')
 
 
 def read_pnm(stream):
@@ -151,9 +156,13 @@ def main():
         type="float", dest="threshold", default=12.0,
         help="threshold precision  [default: %default]")
     optparser.add_option(
-        '-S', '--snapshot-frequency', metavar='FREQUENCY',
+        '-S', '--snapshot-frequency', metavar='CALLSET',
         type="string", dest="snapshot_frequency", default='draw',
-        help="snapshot frequency: frame, framebuffer, or draw  [default: %default]")
+        help="calls to compare [default: %default]")
+    optparser.add_option(
+        '-o', '--output', metavar='FILE',
+        type="string", dest="output",
+        help="output file [default: stdout]")
 
     (options, args) = optparser.parse_args(sys.argv[1:])
     ref_env = parse_env(optparser, options.ref_env)
@@ -164,7 +173,12 @@ def main():
     ref_setup = Setup(args, ref_env)
     src_setup = Setup(args, src_env)
 
-    highligher = Highlighter(sys.stdout)
+    if options.output:
+        output = open(options.output, 'wt')
+    else:
+        output = sys.stdout
+
+    highligher = AutoHighlighter(output)
 
     highligher.write('call\tprecision\n')
 
@@ -212,7 +226,7 @@ def main():
                         src_image.save(prefix + '.src.png')
                         comparer.write_diff(prefix + '.diff.png')
                     if last_bad < last_good:
-                        src_setup.diff_state(last_good, call_no)
+                        src_setup.diff_state(last_good, call_no, output)
                     last_bad = call_no
                 else:
                     last_good = call_no