Index: tracing/third_party/tvcm/tvcm/project.py |
diff --git a/tracing/third_party/tvcm/tvcm/project.py b/tracing/third_party/tvcm/tvcm/project.py |
deleted file mode 100644 |
index f7f99e2426f69e011410ba219d921bdc3de5acd7..0000000000000000000000000000000000000000 |
--- a/tracing/third_party/tvcm/tvcm/project.py |
+++ /dev/null |
@@ -1,235 +0,0 @@ |
-# Copyright 2013 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 |
-import cStringIO |
- |
-from tvcm import resource_loader |
- |
- |
-def _FindAllFilesRecursive(source_paths): |
- all_filenames = set() |
- for source_path in source_paths: |
- for dirpath, _, filenames in os.walk(source_path): |
- for f in filenames: |
- if f.startswith('.'): |
- continue |
- x = os.path.abspath(os.path.join(dirpath, f)) |
- all_filenames.add(x) |
- return all_filenames |
- |
- |
- |
-class AbsFilenameList(object): |
- |
- def __init__(self, willDirtyCallback): |
- self._willDirtyCallback = willDirtyCallback |
- self._filenames = [] |
- self._filenames_set = set() |
- |
- def _WillBecomeDirty(self): |
- if self._willDirtyCallback: |
- self._willDirtyCallback() |
- |
- def append(self, filename): |
- assert os.path.isabs(filename) |
- self._WillBecomeDirty() |
- self._filenames.append(filename) |
- self._filenames_set.add(filename) |
- |
- def extend(self, iterable): |
- self._WillBecomeDirty() |
- for filename in iterable: |
- assert os.path.isabs(filename) |
- self._filenames.append(filename) |
- self._filenames_set.add(filename) |
- |
- def appendRel(self, basedir, filename): |
- assert os.path.isabs(basedir) |
- self._WillBecomeDirty() |
- n = os.path.abspath(os.path.join(basedir, filename)) |
- self._filenames.append(n) |
- self._filenames_set.add(n) |
- |
- def extendRel(self, basedir, iterable): |
- self._WillBecomeDirty() |
- assert os.path.isabs(basedir) |
- for filename in iterable: |
- n = os.path.abspath(os.path.join(basedir, filename)) |
- self._filenames.append(n) |
- self._filenames_set.add(n) |
- |
- def __contains__(self, x): |
- return x in self._filenames_set |
- |
- def __len__(self): |
- return self._filenames.__len__() |
- |
- def __iter__(self): |
- return iter(self._filenames) |
- |
- def __repr__(self): |
- return repr(self._filenames) |
- |
- def __str__(self): |
- return str(self._filenames) |
- |
- |
-class Project(object): |
- |
- tvcm_path = os.path.abspath(os.path.join( |
- os.path.dirname(__file__), '..')) |
- |
- def __init__(self, source_paths=None): |
- """ |
- source_paths: A list of top-level directories in which modules and raw |
- scripts can be found. Module paths are relative to these directories. |
- """ |
- self._loader = None |
- self._frozen = False |
- self.source_paths = AbsFilenameList(self._WillPartOfPathChange) |
- |
- if source_paths is not None: |
- self.source_paths.extend(source_paths) |
- |
- def Freeze(self): |
- self._frozen = True |
- |
- def _WillPartOfPathChange(self): |
- if self._frozen: |
- raise Exception('The project is frozen. You cannot edit it now') |
- self._loader = None |
- |
- @staticmethod |
- def FromDict(d): |
- return Project(d['source_paths']) |
- |
- def AsDict(self): |
- return { |
- 'source_paths': list(self.source_paths) |
- } |
- |
- def __repr__(self): |
- return "Project(%s)" % repr(self.source_paths) |
- |
- def AddSourcePath(self, path): |
- self.source_paths.append(path) |
- |
- @property |
- def loader(self): |
- if self._loader is None: |
- self._loader = resource_loader.ResourceLoader(self) |
- return self._loader |
- |
- def ResetLoader(self): |
- self._loader = None |
- |
- def _Load(self, filenames): |
- return [self.loader.LoadModule(module_filename=filename) for |
- filename in filenames] |
- |
- def LoadModule(self, module_name=None, module_filename=None): |
- return self.loader.LoadModule(module_name=module_name, |
- module_filename=module_filename) |
- |
- def CalcLoadSequenceForModuleNames(self, module_names): |
- modules = [self.loader.LoadModule(module_name=name) for |
- name in module_names] |
- return self.CalcLoadSequenceForModules(modules) |
- |
- def CalcLoadSequenceForModules(self, modules): |
- already_loaded_set = set() |
- load_sequence = [] |
- for m in modules: |
- m.ComputeLoadSequenceRecursive(load_sequence, already_loaded_set) |
- return load_sequence |
- |
- def GetDepsGraphFromModuleNames(self, module_names): |
- modules = [self.loader.LoadModule(module_name=name) for |
- name in module_names] |
- return self.GetDepsGraphFromModules(modules) |
- |
- def GetDepsGraphFromModules(self, modules): |
- load_sequence = self.CalcLoadSequenceForModules(modules) |
- g = _Graph() |
- for m in load_sequence: |
- g.AddModule(m) |
- |
- for dep in m.dependent_modules: |
- g.AddEdge(m, dep.id) |
- |
- # FIXME: _GetGraph is not defined. Maybe `return g` is intended? |
- return _GetGraph(load_sequence) |
- |
- def GetDominatorGraphForModulesNamed(self, module_names, load_sequence): |
- modules = [self.loader.LoadModule(module_name=name) |
- for name in module_names] |
- return self.GetDominatorGraphForModules(modules, load_sequence) |
- |
- def GetDominatorGraphForModules(self, start_modules, load_sequence): |
- modules_by_id = {} |
- for m in load_sequence: |
- modules_by_id[m.id] = m |
- |
- # Module referrers goes module |
- module_referrers = collections.defaultdict(list) |
- for m in load_sequence: |
- for dep in m.dependent_modules: |
- module_referrers[dep].append(m) |
- |
- # Now start at the top module and reverse. |
- visited = set() |
- g = _Graph() |
- |
- pending = collections.deque() |
- pending.extend(start_modules) |
- while len(pending): |
- cur = pending.pop() |
- |
- g.AddModule(cur) |
- visited.add(cur) |
- |
- for out_dep in module_referrers[cur]: |
- if out_dep in visited: |
- continue |
- g.AddEdge(out_dep, cur) |
- visited.add(out_dep) |
- pending.append(out_dep) |
- |
- # Visited -> Dot |
- return g.GetDot() |
- |
- |
-class _Graph(object): |
- |
- def __init__(self): |
- self.nodes = [] |
- self.edges = [] |
- |
- def AddModule(self, m): |
- f = cStringIO.StringIO() |
- m.AppendJSContentsToFile(f, False, None) |
- |
- attrs = { |
- "label": "%s (%i)" % (m.name, f.tell()) |
- } |
- |
- f.close() |
- |
- attr_items = ['%s="%s"' % (x, y) for x, y in attrs.iteritems()] |
- node = "M%i [%s];" % (m.id, ','.join(attr_items)) |
- self.nodes.append(node) |
- |
- def AddEdge(self, mFrom, mTo): |
- edge = "M%i -> M%i;" % (mFrom.id, mTo.id) |
- self.edges.append(edge) |
- |
- def GetDot(self): |
- return """digraph deps { |
-%s |
- |
-%s |
-} |
-""" % ('\n'.join(self.nodes), '\n'.join(self.edges)) |