[tor-commits] [tor/master] Teach include-checker about advisory rules

dgoulet at torproject.org dgoulet at torproject.org
Wed Aug 21 13:50:12 UTC 2019


commit 720951f05664c38155a4515aa76b9c8d3a99269d
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Aug 5 17:04:00 2019 -0400

    Teach include-checker about advisory rules
    
    A .may_includes file can be "advisory", which means that some
    violations of the rules are expected.  We will track these
    violations with practracker, not as automatic errors.
---
 scripts/maint/practracker/includes.py | 24 ++++++++++++++++------
 src/core/crypto/.may_include          | 10 +++++++++
 src/core/mainloop/.may_include        | 20 ++++++++++++++++++
 src/core/or/.may_include              | 38 +++++++++++++++++++++++++++++++++++
 src/core/proto/.may_include           | 10 +++++++++
 5 files changed, 96 insertions(+), 6 deletions(-)

diff --git a/scripts/maint/practracker/includes.py b/scripts/maint/practracker/includes.py
index c35fcfd85..fbd68f4f5 100755
--- a/scripts/maint/practracker/includes.py
+++ b/scripts/maint/practracker/includes.py
@@ -56,9 +56,10 @@ def pattern_is_normal(s):
     return False
 
 class Error(object):
-    def __init__(self, location, msg):
+    def __init__(self, location, msg, is_advisory=False):
         self.location = location
         self.msg = msg
+        self.is_advisory = is_advisory
 
     def __str__(self):
         return "{} at {}".format(self.msg, self.location)
@@ -73,8 +74,12 @@ class Rules(object):
             self.incpath = dirpath
         self.patterns = []
         self.usedPatterns = set()
+        self.is_advisory = False
 
     def addPattern(self, pattern):
+        if pattern == "!advisory":
+            self.is_advisory = True
+            return
         if not pattern_is_normal(pattern):
             warn("Unusual pattern {} in {}".format(pattern, self.dirpath))
         self.patterns.append(pattern)
@@ -95,7 +100,8 @@ class Rules(object):
                 include = m.group(1)
                 if not self.includeOk(include):
                     yield Error("{}{}".format(loc_prefix,str(lineno)),
-                                "Forbidden include of {}".format(include))
+                                "Forbidden include of {}".format(include),
+                                is_advisory=self.is_advisory)
 
     def applyToFile(self, fname):
         with open_file(fname) as f:
@@ -204,7 +210,6 @@ def consider_include_rules(fname):
     for err in rules.applyToFile(fname):
         yield err
 
-
     list_unused = False
     log_sorted_levels = False
 
@@ -219,12 +224,16 @@ def walk_c_files(topdir="src"):
                 for err in consider_include_rules(fullpath):
                     yield err
 
-def run_check_includes(topdir, list_unused=False, log_sorted_levels=False):
+def run_check_includes(topdir, list_unused=False, log_sorted_levels=False,
+                       list_advisories=False):
     trouble = False
 
     for err in walk_c_files(topdir):
+        if err.is_advisory and not list_advisories:
+            continue
         print(err, file=sys.stderr)
-        trouble = True
+        if not err.is_advisory:
+            trouble = True
 
     if trouble:
         err(
@@ -262,13 +271,16 @@ def main(argv):
                         help="Print a topologically sorted list of modules")
     parser.add_argument("--list-unused", action="store_true",
                         help="List unused lines in .may_include files.")
+    parser.add_argument("--list-advisories", action="store_true",
+                        help="List advisories as well as forbidden includes")
     parser.add_argument("topdir", default="src", nargs="?",
                         help="Top-level directory for the tor source")
     args = parser.parse_args(argv[1:])
 
     run_check_includes(topdir=args.topdir,
                        log_sorted_levels=args.toposort,
-                       list_unused=args.list_unused)
+                       list_unused=args.list_unused,
+                       list_advisories=args.list_advisories)
 
 if __name__ == '__main__':
     main(sys.argv)
diff --git a/src/core/crypto/.may_include b/src/core/crypto/.may_include
new file mode 100644
index 000000000..5782a3679
--- /dev/null
+++ b/src/core/crypto/.may_include
@@ -0,0 +1,10 @@
+!advisory
+
+orconfig.h
+
+lib/crypt_ops/*.h
+lib/ctime/*.h
+lib/cc/*.h
+lib/log/*.h
+
+core/crypto/*.h
diff --git a/src/core/mainloop/.may_include b/src/core/mainloop/.may_include
new file mode 100644
index 000000000..79d6a130a
--- /dev/null
+++ b/src/core/mainloop/.may_include
@@ -0,0 +1,20 @@
+!advisory
+
+orconfig.h
+
+lib/container/*.h
+lib/dispatch/*.h
+lib/evloop/*.h
+lib/pubsub/*.h
+lib/subsys/*.h
+lib/buf/*.h
+lib/crypt_ops/*.h
+lib/err/*.h
+lib/tls/*.h
+lib/net/*.h
+lib/evloop/*.h
+lib/geoip/*.h
+lib/sandbox/*.h
+lib/compress/*.h
+
+core/mainloop/*.h
\ No newline at end of file
diff --git a/src/core/or/.may_include b/src/core/or/.may_include
new file mode 100644
index 000000000..5173e8a2b
--- /dev/null
+++ b/src/core/or/.may_include
@@ -0,0 +1,38 @@
+!advisory
+
+orconfig.h
+
+lib/arch/*.h
+lib/buf/*.h
+lib/cc/*.h
+lib/compress/*.h
+lib/container/*.h
+lib/crypt_ops/*.h
+lib/ctime/*.h
+lib/defs/*.h
+lib/encoding/*.h
+lib/err/*.h
+lib/evloop/*.h
+lib/fs/*.h
+lib/geoip/*.h
+lib/intmath/*.h
+lib/log/*.h
+lib/malloc/*.h
+lib/math/*.h
+lib/net/*.h
+lib/pubsub/*.h
+lib/string/*.h
+lib/subsys/*.h
+lib/test/*.h
+lib/testsupport/*.h
+lib/thread/*.h
+lib/time/*.h
+lib/tls/*.h
+lib/wallclock/*.h
+
+trunnel/*.h
+
+core/mainloop/*.h
+core/proto/*.h
+core/crypto/*.h
+core/or/*.h
\ No newline at end of file
diff --git a/src/core/proto/.may_include b/src/core/proto/.may_include
new file mode 100644
index 000000000..c1647a5cf
--- /dev/null
+++ b/src/core/proto/.may_include
@@ -0,0 +1,10 @@
+!advisory
+
+orconfig.h
+
+lib/crypt_ops/*.h
+lib/buf/*.h
+
+trunnel/*.h
+
+core/proto/*.h
\ No newline at end of file





More information about the tor-commits mailing list