misc: Merge branch 'release-staging-v20.0.0.0' into develop
[gem5.git] / util / style / verifiers.py
index 89247dc4fee0f478d8066ed9c876076029c54d55..00cf0705ca2e78bd816f3a9fadd7c8a150fc58d7 100644 (file)
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python2.7
 #
 # Copyright (c) 2014, 2016 ARM Limited
 # All rights reserved
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# Authors: Nathan Binkert
-#          Steve Reinhardt
-#          Andreas Sandberg
 
 from abc import ABCMeta, abstractmethod
 from difflib import SequenceMatcher
@@ -51,10 +47,12 @@ import os
 import re
 import sys
 
-import style
-import sort_includes
-from region import *
-from file_types import lang_type
+from six import add_metaclass
+
+from . import style
+from . import sort_includes
+from .region import *
+from .file_types import lang_type
 
 
 def safefix(fix_func):
@@ -104,6 +102,7 @@ def _modified_regions(old, new):
     return regions
 
 
+@add_metaclass(ABCMeta)
 class Verifier(object):
     """Base class for style verifiers
 
@@ -121,7 +120,6 @@ class Verifier(object):
 
     """
 
-    __metaclass__ = ABCMeta
 
     def __init__(self, ui, opts, base=None):
         self.ui = ui
@@ -148,9 +146,9 @@ class Verifier(object):
 
     def open(self, filename, mode):
         try:
-            f = file(filename, mode)
-        except OSError, msg:
-            print 'could not open file %s: %s' % (filename, msg)
+            f = open(filename, mode)
+        except OSError as msg:
+            print('could not open file {}: {}'.format(filename, msg))
             return None
 
         return f
@@ -226,11 +224,12 @@ class Verifier(object):
         """
         pass
 
+@add_metaclass(ABCMeta)
 class LineVerifier(Verifier):
     def check(self, filename, regions=all_regions, fobj=None, silent=False):
         close = False
         if fobj is None:
-            fobj = self.open(filename, 'r')
+            fobj = self.open(filename, 'rb')
             close = True
 
         lang = lang_type(filename)
@@ -240,13 +239,13 @@ class LineVerifier(Verifier):
         for num,line in enumerate(fobj):
             if num not in regions:
                 continue
-            line = line.rstrip('\n')
-            if not self.check_line(line, language=lang):
+            s_line = line.decode().rstrip('\n')
+            if not self.check_line(s_line, language=lang):
                 if not silent:
                     self.ui.write("invalid %s in %s:%d\n" % \
                                   (self.test_name, filename, num + 1))
                     if self.ui.verbose:
-                        self.ui.write(">>%s<<\n" % line[:-1])
+                        self.ui.write(">>%s<<\n" % s_line[:-1])
                 errors += 1
         if close:
             fobj.close()
@@ -352,7 +351,7 @@ class SortedIncludes(Verifier):
             close = True
         norm_fname = self.normalize_filename(filename)
 
-        old = [ l.rstrip('\n') for l in fobj.xreadlines() ]
+        old = [ l.decode().rstrip('\n') for l in fobj ]
         if close:
             fobj.close()
 
@@ -378,11 +377,12 @@ class SortedIncludes(Verifier):
     @safefix
     def fix(self, filename, regions=all_regions):
         f = self.open(filename, 'r+')
+        norm_fname = self.normalize_filename(filename)
 
         old = f.readlines()
         lines = [ l.rstrip('\n') for l in old ]
         language = lang_type(filename, lines[0])
-        sort_lines = list(self.sort_includes(lines, filename, language))
+        sort_lines = list(self.sort_includes(lines, norm_fname, language))
         new = ''.join(line + '\n' for line in sort_lines)
 
         f.seek(0)
@@ -431,14 +431,14 @@ class ControlCharacters(LineVerifier):
     test_name = 'control character'
     opt_name = 'ascii'
 
-    valid = ('\n', '\t')
-    invalid = "".join([chr(i) for i in range(0, 0x20) if chr(i) not in valid])
+    invalid = "".join([chr(i) for i in range(0, 0x20) \
+        if chr(i) not in ('\n', '\t')])
 
     def check_line(self, line, **kwargs):
         return self.fix_line(line) == line
 
     def fix_line(self, line, **kwargs):
-        return line.translate(None, ControlCharacters.invalid)
+        return ''.join(c for c in line if c not in ControlCharacters.invalid)
 
 class BoolCompare(LineVerifier):
     languages = set(('C', 'C++', 'python'))