Index: sky/tools/webkitpy/thirdparty/coverage/files.py |
diff --git a/sky/tools/webkitpy/thirdparty/coverage/files.py b/sky/tools/webkitpy/thirdparty/coverage/files.py |
deleted file mode 100644 |
index 81ec196f21685af4434a0fbc61f85d7f901aa8e7..0000000000000000000000000000000000000000 |
--- a/sky/tools/webkitpy/thirdparty/coverage/files.py |
+++ /dev/null |
@@ -1,219 +0,0 @@ |
-"""File wrangling.""" |
- |
-from coverage.backward import to_string |
-from coverage.misc import CoverageException |
-import fnmatch, os, re, sys |
- |
-class FileLocator(object): |
- """Understand how filenames work.""" |
- |
- def __init__(self): |
- # The absolute path to our current directory. |
- self.relative_dir = self.abs_file(os.curdir) + os.sep |
- |
- # Cache of results of calling the canonical_filename() method, to |
- # avoid duplicating work. |
- self.canonical_filename_cache = {} |
- |
- def abs_file(self, filename): |
- """Return the absolute normalized form of `filename`.""" |
- return os.path.normcase(os.path.abspath(os.path.realpath(filename))) |
- |
- def relative_filename(self, filename): |
- """Return the relative form of `filename`. |
- |
- The filename will be relative to the current directory when the |
- `FileLocator` was constructed. |
- |
- """ |
- if filename.startswith(self.relative_dir): |
- filename = filename.replace(self.relative_dir, "") |
- return filename |
- |
- def canonical_filename(self, filename): |
- """Return a canonical filename for `filename`. |
- |
- An absolute path with no redundant components and normalized case. |
- |
- """ |
- if filename not in self.canonical_filename_cache: |
- f = filename |
- if os.path.isabs(f) and not os.path.exists(f): |
- if self.get_zip_data(f) is None: |
- f = os.path.basename(f) |
- if not os.path.isabs(f): |
- for path in [os.curdir] + sys.path: |
- if path is None: |
- continue |
- g = os.path.join(path, f) |
- if os.path.exists(g): |
- f = g |
- break |
- cf = self.abs_file(f) |
- self.canonical_filename_cache[filename] = cf |
- return self.canonical_filename_cache[filename] |
- |
- def get_zip_data(self, filename): |
- """Get data from `filename` if it is a zip file path. |
- |
- Returns the string data read from the zip file, or None if no zip file |
- could be found or `filename` isn't in it. The data returned will be |
- an empty string if the file is empty. |
- |
- """ |
- import zipimport |
- markers = ['.zip'+os.sep, '.egg'+os.sep] |
- for marker in markers: |
- if marker in filename: |
- parts = filename.split(marker) |
- try: |
- zi = zipimport.zipimporter(parts[0]+marker[:-1]) |
- except zipimport.ZipImportError: |
- continue |
- try: |
- data = zi.get_data(parts[1]) |
- except IOError: |
- continue |
- return to_string(data) |
- return None |
- |
- |
-class TreeMatcher(object): |
- """A matcher for files in a tree.""" |
- def __init__(self, directories): |
- self.dirs = directories[:] |
- |
- def __repr__(self): |
- return "<TreeMatcher %r>" % self.dirs |
- |
- def add(self, directory): |
- """Add another directory to the list we match for.""" |
- self.dirs.append(directory) |
- |
- def match(self, fpath): |
- """Does `fpath` indicate a file in one of our trees?""" |
- for d in self.dirs: |
- if fpath.startswith(d): |
- if fpath == d: |
- # This is the same file! |
- return True |
- if fpath[len(d)] == os.sep: |
- # This is a file in the directory |
- return True |
- return False |
- |
- |
-class FnmatchMatcher(object): |
- """A matcher for files by filename pattern.""" |
- def __init__(self, pats): |
- self.pats = pats[:] |
- |
- def __repr__(self): |
- return "<FnmatchMatcher %r>" % self.pats |
- |
- def match(self, fpath): |
- """Does `fpath` match one of our filename patterns?""" |
- for pat in self.pats: |
- if fnmatch.fnmatch(fpath, pat): |
- return True |
- return False |
- |
- |
-def sep(s): |
- """Find the path separator used in this string, or os.sep if none.""" |
- sep_match = re.search(r"[\\/]", s) |
- if sep_match: |
- the_sep = sep_match.group(0) |
- else: |
- the_sep = os.sep |
- return the_sep |
- |
- |
-class PathAliases(object): |
- """A collection of aliases for paths. |
- |
- When combining data files from remote machines, often the paths to source |
- code are different, for example, due to OS differences, or because of |
- serialized checkouts on continuous integration machines. |
- |
- A `PathAliases` object tracks a list of pattern/result pairs, and can |
- map a path through those aliases to produce a unified path. |
- |
- `locator` is a FileLocator that is used to canonicalize the results. |
- |
- """ |
- def __init__(self, locator=None): |
- self.aliases = [] |
- self.locator = locator |
- |
- def add(self, pattern, result): |
- """Add the `pattern`/`result` pair to the list of aliases. |
- |
- `pattern` is an `fnmatch`-style pattern. `result` is a simple |
- string. When mapping paths, if a path starts with a match against |
- `pattern`, then that match is replaced with `result`. This models |
- isomorphic source trees being rooted at different places on two |
- different machines. |
- |
- `pattern` can't end with a wildcard component, since that would |
- match an entire tree, and not just its root. |
- |
- """ |
- # The pattern can't end with a wildcard component. |
- pattern = pattern.rstrip(r"\/") |
- if pattern.endswith("*"): |
- raise CoverageException("Pattern must not end with wildcards.") |
- pattern_sep = sep(pattern) |
- pattern += pattern_sep |
- |
- # Make a regex from the pattern. fnmatch always adds a \Z or $ to |
- # match the whole string, which we don't want. |
- regex_pat = fnmatch.translate(pattern).replace(r'\Z(', '(') |
- if regex_pat.endswith("$"): |
- regex_pat = regex_pat[:-1] |
- # We want */a/b.py to match on Windows to, so change slash to match |
- # either separator. |
- regex_pat = regex_pat.replace(r"\/", r"[\\/]") |
- # We want case-insensitive matching, so add that flag. |
- regex = re.compile("(?i)" + regex_pat) |
- |
- # Normalize the result: it must end with a path separator. |
- result_sep = sep(result) |
- result = result.rstrip(r"\/") + result_sep |
- self.aliases.append((regex, result, pattern_sep, result_sep)) |
- |
- def map(self, path): |
- """Map `path` through the aliases. |
- |
- `path` is checked against all of the patterns. The first pattern to |
- match is used to replace the root of the path with the result root. |
- Only one pattern is ever used. If no patterns match, `path` is |
- returned unchanged. |
- |
- The separator style in the result is made to match that of the result |
- in the alias. |
- |
- """ |
- for regex, result, pattern_sep, result_sep in self.aliases: |
- m = regex.match(path) |
- if m: |
- new = path.replace(m.group(0), result) |
- if pattern_sep != result_sep: |
- new = new.replace(pattern_sep, result_sep) |
- if self.locator: |
- new = self.locator.canonical_filename(new) |
- return new |
- return path |
- |
- |
-def find_python_files(dirname): |
- """Yield all of the importable Python files in `dirname`, recursively.""" |
- for dirpath, dirnames, filenames in os.walk(dirname, topdown=True): |
- if '__init__.py' not in filenames: |
- # If a directory doesn't have __init__.py, then it isn't |
- # importable and neither are its files |
- del dirnames[:] |
- continue |
- for filename in filenames: |
- if fnmatch.fnmatch(filename, "*.py"): |
- yield os.path.join(dirpath, filename) |