style: Add support for a style ignore list and ignore ext/
authorAndreas Sandberg <Andreas.Sandberg@ARM.com>
Tue, 26 Aug 2014 14:14:30 +0000 (10:14 -0400)
committerAndreas Sandberg <Andreas.Sandberg@ARM.com>
Tue, 26 Aug 2014 14:14:30 +0000 (10:14 -0400)
There are some directories within the repository where we don't want
to enforce our coding style. Specifically, we don't want the style
hooks to warn whenever we update external code in the ext/ directory.

util/style.py

index fb3440541de45de4fa2a44abd29798f1381fa6dd..6ad0399adedfdba40367f51bb62d401639f40eb6 100644 (file)
@@ -67,6 +67,37 @@ good_control = re.compile(r'\b(if|while|for) [(]')
 
 format_types = set(('C', 'C++'))
 
+
+def re_ignore(expr):
+    """Helper function to create regular expression ignore file
+    matcher functions"""
+
+    rex = re.compile(expr)
+    def match_re(fname):
+        return rex.match(fname)
+    return match_re
+
+# This list contains a list of functions that are called to determine
+# if a file should be excluded from the style matching rules or
+# not. The functions are called with the file name relative to the
+# repository root (without a leading slash) as their argument. A file
+# is excluded if any function in the list returns true.
+style_ignores = [
+    # Ignore external projects as they are unlikely to follow the gem5
+    # coding convention.
+    re_ignore("^ext/"),
+]
+
+def check_ignores(fname):
+    """Check if a file name matches any of the ignore rules"""
+
+    for rule in style_ignores:
+        if rule(fname):
+            return True
+
+    return False
+
+
 def modified_regions(old_data, new_data):
     regions = Regions()
     beg = None
@@ -408,6 +439,7 @@ def do_check_style(hgui, repo, *pats, **opts):
 
     opt_fix_white = opts.get('fix_white', False)
     opt_all = opts.get('all', False)
+    opt_no_ignore = opts.get('no_ignore', False)
     ui = MercurialUI(hgui, hgui.verbose, opt_fix_white)
 
     def prompt(name, func, regions=all_regions):
@@ -447,6 +479,9 @@ def do_check_style(hgui, repo, *pats, **opts):
     whitespace = Whitespace(ui)
     sorted_includes = SortedIncludes(ui)
     for fname, mod_regions in files:
+        if not opt_no_ignore and check_ignores(fname):
+            continue
+
         fpath = joinpath(repo.root, fname)
 
         if whitespace.apply(fpath, prompt, mod_regions):
@@ -515,6 +550,7 @@ cmdtable = {
             ('w', 'fix-white', False, _("automatically fix whitespace")),
             ('a', 'all', False,
              _("include clean files and unmodified parts of modified files")),
+            ('', 'no-ignore', False, _("ignore the style ignore list")),
             ] +  commands.walkopts,
         _('hg m5style [-a] [FILE]...')),
     '^m5format' :