def _affecting_processes(self, process, packages, affected_process_factory=AffectedProcess): collection = AffectedProcessesCollection() process_files = process.files for package in packages: matching_files = set() for package_file in self._PACKAGE_MANAGER.package_files( package.name): package_file = FilenameCleaner.strip(package_file) if not package_file in process_files: continue if process.create_time() <= package.modified: matching_files.add(package_file) if matching_files: aff_pkg = package aff_pkg.files = matching_files affected = affected_process_factory(process.pid) affected.__dict__.update(process.__dict__) affected.packages.update([aff_pkg]) collection.update([affected]) return collection
def _affecting_children(self, process, packages, affected_process_factory): if not self._rules.find(process.name()): return {} processes = AffectedProcessesCollection() for child in process.children(): processes.update(self._affecting_processes(child, packages, affected_process_factory)) processes.update(self._affecting_children(child, packages, affected_process_factory)) return processes
def test_processes_update(self): p1 = AffectedProcess(1234) p2 = AffectedProcess(1234) p2.files = set(['foo', 'bar', 'baz']) c = AffectedProcessesCollection() c.update([p1]) c.update([p2]) self.assertIn(p1, c) self.assertIn('bar', c[c.index(p1)].files)
def trace_application(self, app, affected_process_factory=AffectedProcess): """ Returns collection of processes where each of them contains packages which affected it. Packages contains only files matching with the particular process """ packages = self._modified_packages() processes = AffectedProcessesCollection() for process in app.instances: processes.update(self._affecting_processes(process, packages, affected_process_factory)) processes.update(self._affecting_children(process, packages, affected_process_factory)) return processes
def trace_application(self, app_name, affected_process_factory=AffectedProcess): """ Returns collection of processes where each of them contains packages which affected it. Packages contains only files matching with the particular process """ packages = self._modified_packages() processes = AffectedProcessesCollection() for process in self._applications.find(app_name).instances: processes.update(self._affecting_processes(process, packages, affected_process_factory)) processes.update(self._affecting_children(process, packages, affected_process_factory)) return processes
def _affecting_processes(self, process, packages, affected_process_factory=AffectedProcess): collection = AffectedProcessesCollection() process_files = process.files for package in packages: matching_files = set() for package_file in self._PACKAGE_MANAGER.package_files(package.name): package_file = FilenameCleaner.strip(package_file) if not package_file in process_files: continue if process.create_time() <= package.modified: matching_files.add(package_file) if matching_files: aff_pkg = package aff_pkg.files = matching_files affected = affected_process_factory(process.pid) affected.__dict__.update(process.__dict__) affected.packages.update([aff_pkg]) collection.update([affected]) return collection