tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

util.py (1991B)


      1 # Future imports for Python 2.7, mandatory in 3.0
      2 from __future__ import division
      3 from __future__ import print_function
      4 from __future__ import unicode_literals
      5 
      6 import os
      7 
      8 # We don't want to run metrics for unittests, automatically-generated C files,
      9 # external libraries or git leftovers.
     10 EXCLUDE_SOURCE_DIRS = {"src/test/", "src/trunnel/", "src/ext/" }
     11 
     12 EXCLUDE_FILES = {"orconfig.h"}
     13 
     14 def _norm(p):
     15    return os.path.normcase(os.path.normpath(p))
     16 
     17 def get_tor_c_files(tor_topdir, include_dirs=None):
     18    """
     19    Return a list with the .c and .h filenames we want to get metrics of.
     20    """
     21    files_list = []
     22    exclude_dirs = { _norm(os.path.join(tor_topdir, p)) for p in EXCLUDE_SOURCE_DIRS }
     23 
     24    if include_dirs is None:
     25        topdirs = [ tor_topdir ]
     26    else:
     27        topdirs = [ os.path.join(tor_topdir, inc) for inc in include_dirs ]
     28 
     29    for topdir in topdirs:
     30        for root, directories, filenames in os.walk(topdir):
     31            # Remove all the directories that are excluded.
     32            directories[:] = [ d for d in directories
     33                               if _norm(os.path.join(root,d)) not in exclude_dirs ]
     34            directories.sort()
     35            filenames.sort()
     36            for filename in filenames:
     37                # We only care about .c and .h files
     38                if not (filename.endswith(".c") or filename.endswith(".h")):
     39                    continue
     40                if filename in EXCLUDE_FILES:
     41                    continue
     42                # Avoid editor temporary files
     43                bname = os.path.basename(filename)
     44                if bname.startswith("."):
     45                    continue
     46                if bname.startswith("#"):
     47                    continue
     48 
     49                full_path = os.path.join(root,filename)
     50 
     51                files_list.append(full_path)
     52 
     53    return files_list
     54 
     55 class NullFile:
     56    """A file-like object that we can us to suppress output."""
     57    def __init__(self):
     58        pass
     59    def write(self, s):
     60        pass