[libcamera-devel,2/2] utils: checkstyle.py: Strip trailing white spaces

Message ID 20181218204609.22902-2-laurent.pinchart@ideasonboard.com
State Accepted
Commit 3c8886d6981e1238657cc6ee9dcf267f090fca41
Headers show
Series
  • [libcamera-devel,1/2] utils: checkstyle.py: Highlight trailing white space at end of line
Related show

Commit Message

Laurent Pinchart Dec. 18, 2018, 8:46 p.m. UTC
As astyle doesn't strip trailing white spaces, strip them manually.
Organize the code to allow for new additional formatting steps if
needed.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 utils/checkstyle.py | 49 +++++++++++++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 6 deletions(-)

Patch

diff --git a/utils/checkstyle.py b/utils/checkstyle.py
index dadb55dfb8c1..32974815048a 100755
--- a/utils/checkstyle.py
+++ b/utils/checkstyle.py
@@ -38,6 +38,10 @@  source_extensions = (
     '.h'
 )
 
+# ------------------------------------------------------------------------------
+# Colour terminal handling
+#
+
 class Colours:
     Default = 0
     Black = 0
@@ -79,6 +83,10 @@  class Colours:
             return ''
 
 
+# ------------------------------------------------------------------------------
+# Diff parsing, handling and printing
+#
+
 class DiffHunkSide(object):
     """A side of a diff hunk, recording line numbers"""
     def __init__(self, start):
@@ -179,6 +187,33 @@  def parse_diff(diff):
     return hunks
 
 
+# ------------------------------------------------------------------------------
+# Code reformatting
+#
+
+def formatter_astyle(data):
+    ret = subprocess.run(['astyle', *astyle_options],
+                         input=data.encode('utf-8'), stdout=subprocess.PIPE)
+    return ret.stdout.decode('utf-8')
+
+
+def formatter_strip_trailing_space(data):
+    lines = data.split('\n')
+    for i in range(len(lines)):
+        lines[i] = lines[i].rstrip() + '\n'
+    return ''.join(lines)
+
+
+formatters = [
+    formatter_astyle,
+    formatter_strip_trailing_space,
+]
+
+
+# ------------------------------------------------------------------------------
+# Style checking
+#
+
 def check_file(top_level, commit, filename):
     # Extract the line numbers touched by the commit.
     diff = subprocess.run(['git', 'diff', '%s~..%s' % (commit, commit), '--',
@@ -195,16 +230,18 @@  def check_file(top_level, commit, filename):
     if len(lines) == 0:
         return 0
 
-    # Format the file after the commit with astyle and compute the diff between
-    # the two files.
+    # Format the file after the commit with all formatters and compute the diff
+    # between the unformatted and formatted contents.
     after = subprocess.run(['git', 'show', '%s:%s' % (commit, filename)],
                            stdout=subprocess.PIPE).stdout
-    formatted = subprocess.run(['astyle', *astyle_options],
-                               input=after, stdout=subprocess.PIPE).stdout
+    after = after.decode('utf-8')
 
-    after = after.decode('utf-8').splitlines(True)
-    formatted = formatted.decode('utf-8').splitlines(True)
+    formatted = after
+    for formatter in formatters:
+        formatted = formatter(formatted)
 
+    after = after.splitlines(True)
+    formatted = formatted.splitlines(True)
     diff = difflib.unified_diff(after, formatted)
 
     # Split the diff in hunks, recording line number ranges for each hunk.