Bläddra i källkod

checkIncludes: Separate file-handling from rule-handling

This is our shift from directory-at-a-time processing to
file-at-a-time processing.
Nick Mathewson 4 år sedan
förälder
incheckning
47d9bcfef8
1 ändrade filer med 23 tillägg och 11 borttagningar
  1. 23 11
      scripts/maint/checkIncludes.py

+ 23 - 11
scripts/maint/checkIncludes.py

@@ -126,9 +126,14 @@ class Rules(object):
 include_rules_cache = {}
 
 def load_include_rules(fname):
-    """ Read a rules file from 'fname', and return it as a Rules object. """
+    """ Read a rules file from 'fname', and return it as a Rules object.
+        Return 'None' if fname does not exist.
+    """
     if fname in include_rules_cache:
         return include_rules_cache[fname]
+    if not os.path.exists(fname):
+        include_rules_cache[fname] = None
+        return None
     result = Rules(os.path.split(fname)[0])
     with open_file(fname) as f:
         for line in f:
@@ -139,6 +144,11 @@ def load_include_rules(fname):
     include_rules_cache[fname] = result
     return result
 
+def get_all_include_rules():
+    return [ rules for (fname,rules) in
+             sorted(include_rules_cache.items())
+             if rules is not None ]
+
 def remove_self_edges(graph):
     """Takes a directed graph in as an adjacency mapping (a mapping from
        node to a list of the nodes to which it connects).
@@ -187,18 +197,12 @@ if __name__ == '__main__':
     list_unused = False
     log_sorted_levels = False
 
-    uses_dirs = { }
-
     for dirpath, dirnames, fnames in os.walk("src"):
-        if ".may_include" in fnames:
-            rules = load_include_rules(os.path.join(dirpath, RULES_FNAME))
-            for fname in fnames:
-                if fname_is_c(fname):
+        for fname in fnames:
+            if fname_is_c(fname):
+                rules = load_include_rules(os.path.join(dirpath, RULES_FNAME))
+                if rules is not None:
                     rules.applyToFile(os.path.join(dirpath,fname))
-            if list_unused:
-                rules.noteUnusedRules()
-
-            uses_dirs[rules.incpath] = rules.getAllowedDirectories()
 
     if trouble:
         err(
@@ -206,6 +210,14 @@ if __name__ == '__main__':
     files in its enclosing directory.""".format(RULES_FNAME))
         sys.exit(1)
 
+    if list_unused:
+        for rules in get_all_include_rules():
+            rules.noteUnusedRules()
+
+    uses_dirs = { }
+    for rules in get_all_include_rules():
+        uses_dirs[rules.incpath] = rules.getAllowedDirectories()
+
     remove_self_edges(uses_dirs)
     all_levels = toposort(uses_dirs)