Index: tools/telemetry_tools/path_set.py |
diff --git a/tools/telemetry_tools/path_set.py b/tools/telemetry_tools/path_set.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3cd61ba97c74ce063032d7649fbd2d1e6cb62b61 |
--- /dev/null |
+++ b/tools/telemetry_tools/path_set.py |
@@ -0,0 +1,44 @@ |
+# Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import collections |
+import os |
+ |
+ |
+class PathSet(collections.MutableSet): |
+ """A set of paths. |
+ |
+ All mutation methods can take both directories or individual files, but the |
+ iterator yields the individual files. All paths are automatically normalized. |
+ """ |
+ def __init__(self, iterable=None): |
+ self._paths = set() |
+ if iterable: |
+ self |= iterable |
+ |
+ def __contains__(self, path): |
+ return os.path.realpath(path) in self._paths |
+ |
+ def __iter__(self): |
+ return iter(self._paths) |
+ |
+ def __len__(self): |
+ return len(self._paths) |
+ |
+ def add(self, path): |
+ path = os.path.realpath(path) |
+ if os.path.isfile(path): |
+ self._paths.add(path) |
+ for root, _, files in os.walk(path): |
+ for basename in files: |
+ file_path = os.path.join(root, basename) |
+ if os.path.isfile(file_path): |
+ self._paths.add(file_path) |
+ |
+ def discard(self, path): |
+ path = os.path.realpath(path) |
+ self._paths.discard(path) |
+ for root, _, files in os.walk(path): |
+ for basename in files: |
+ self._paths.discard(os.path.join(root, basename)) |