aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/telemetry/internal/util/path_set.py
blob: 0b467835b6a63ba0d450088a3cf674c6f91010fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Copyright 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))