]> git.cworth.org Git - apitrace/commitdiff
Better highlighting of tracediff2.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 15 Mar 2012 23:43:52 +0000 (23:43 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Thu, 15 Mar 2012 23:43:52 +0000 (23:43 +0000)
scripts/highlight.py
scripts/tracediff2.py

index db6a37f9ab4887553757cf4953c91091e39ac6cf..f76b1ab672e5b476f01cbdfc38642156c3fd05f1 100644 (file)
@@ -86,11 +86,9 @@ class AnsiHighlighter(PlainHighlighter):
 
     def __init__(self, stream):
         PlainHighlighter.__init__(self, stream)
-        self.isatty = stream.isatty()
 
     def _escape(self, code):
-        if self.isatty:
-            self.stream.write(self._csi + code)
+        self.stream.write(self._csi + code)
 
     def normal(self):
         self._escape(self._normal)
@@ -182,11 +180,14 @@ class WindowsConsoleHighlighter(PlainHighlighter):
         pass
 
 
-def Highlighter(stream = sys.stdout):
-    if platform.system() == 'Windows':
-        return WindowsConsoleHighlighter(stream)
+def Highlighter(stream = sys.stdout, force = False):
+    if force or stream.isatty():
+        if platform.system() == 'Windows':
+            return WindowsConsoleHighlighter(stream)
+        else:
+            return AnsiHighlighter(stream)
     else:
-        return AnsiHighlighter(stream)
+        return PlainHighlighter(stream)
 
 
 __all__ = [
index c6a8682652e06d0267bf34c579ec254990be8bbe..7dc11e2bf1c48caa8729640c00afc490290c0e2d 100755 (executable)
@@ -32,6 +32,7 @@ import subprocess
 import sys
 
 from unpickle import Unpickler
+from highlight import Highlighter
 
 
 ignoredFunctionNames = set([
@@ -76,9 +77,12 @@ def readtrace(trace):
 
 class SDiffer:
 
-    def __init__(self, a, b):
+    def __init__(self, a, b, highlighter):
         self.a = a
         self.b = b
+        self.highlighter = highlighter
+        self.delete_color = highlighter.red
+        self.insert_color = highlighter.green
 
     def diff(self):
         matcher = difflib.SequenceMatcher(None, self.a, self.b)
@@ -125,17 +129,17 @@ class SDiffer:
             b_call = self.b[blo + i]
             assert a_call.functionName == b_call.functionName
             assert len(a_call.args) == len(b_call.args)
-            sys.stdout.write('  ' + b_call.functionName + '(')
+            self.highlighter.write('  ' + b_call.functionName + '(')
             sep = ''
             for j in xrange(len(b_call.args)):
-                sys.stdout.write(sep)
+                self.highlighter.write(sep)
                 self.replace_value(a_call.args[j], b_call.args[j])
                 sep = ', '
-            sys.stdout.write(')')
+            self.highlighter.write(')')
             if a_call.ret is not None or b_call.ret is not None:
-                sys.stdout.write(' = ')
+                self.highlighter.write(' = ')
                 self.replace_value(a_call.ret, b_call.ret)
-            sys.stdout.write('\n')
+            self.highlighter.write('\n')
 
     def replace_dissimilar(self, alo, ahi, blo, bhi):
         assert alo < ahi and blo < bhi
@@ -152,24 +156,47 @@ class SDiffer:
 
     def replace_value(self, a, b):
         if b == a:
-            sys.stdout.write(str(b))
+            self.highlighter.write(str(b))
         else:
-            sys.stdout.write('%s -> %s' % (a, b))
+            self.highlighter.color(self.delete_color)
+            self.highlighter.write(str(b))
+            self.highlighter.normal()
+            self.highlighter.write(" -> ")
+            self.highlighter.color(self.insert_color)
+            self.highlighter.write(str(b))
+            self.highlighter.normal()
 
     escape = "\33["
 
     def delete(self, alo, ahi):
-        self.dump('- ' + self.escape + '9m', self.a, alo, ahi, self.escape + '0m')
+        self.dump(self.delete_prefix, self.a, alo, ahi, self.normal_suffix)
 
     def insert(self, blo, bhi):
-        self.dump('+ ', self.b, blo, bhi)
+        self.dump(self.insert_prefix, self.b, blo, bhi, self.normal_suffix)
 
     def equal(self, alo, ahi):
-        self.dump('  ' + self.escape + '2m', self.a, alo, ahi, self.escape + '0m')
+        self.dump(self.equal_prefix, self.a, alo, ahi, self.normal_suffix)
 
-    def dump(self, prefix, x, lo, hi, suffix=""):
+    def dump(self, prefix, x, lo, hi, suffix):
         for i in xrange(lo, hi):
-            sys.stdout.write(prefix + str(x[i]) + suffix + '\n')
+            prefix()
+            self.highlighter.write(str(x[i]))
+            suffix()
+            self.highlighter.write('\n')
+
+    def delete_prefix(self):
+        self.highlighter.write('- ')
+        self.highlighter.color(self.delete_color)
+    
+    def insert_prefix(self):
+        self.highlighter.write('+ ')
+        self.highlighter.color(self.insert_color)
+
+    def equal_prefix(self):
+        self.highlighter.write('  ')
+
+    def normal_suffix(self):
+        self.highlighter.normal()
 
 
 def main():
@@ -197,8 +224,20 @@ def main():
     ref_calls = readtrace(args[0])
     src_calls = readtrace(args[1])
 
-    differ = SDiffer(ref_calls, src_calls)
+    if sys.stdout.isatty():
+        less = subprocess.Popen(
+            args = ['less', '-FRXn'],
+            stdin = subprocess.PIPE
+        )
+        highlighter = Highlighter(less.stdin, True)
+    else:
+        highlighter = Highlighter(sys.stdout)
+
+    differ = SDiffer(ref_calls, src_calls, highlighter)
     differ.diff()
+    less.stdin.close()
+
+    less.wait()
 
 
 if __name__ == '__main__':