diff options
author | Lars Wirzenius <liw@liw.fi> | 2016-06-12 19:00:39 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2016-06-12 19:00:39 +0300 |
commit | 121c01d2000ac3238ef2ba1ad7f18fc5fe2419aa (patch) | |
tree | 0ce945682bd36327150e2a7070e03d13c640651e | |
parent | 677aeebeaedb7214863673c09b83937bcd7739e8 (diff) | |
download | obnam-121c01d2000ac3238ef2ba1ad7f18fc5fe2419aa.tar.gz |
Try simpler approach
-rw-r--r-- | meliaereader/reader.py | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/meliaereader/reader.py b/meliaereader/reader.py index f8a4b925..37a044b7 100644 --- a/meliaereader/reader.py +++ b/meliaereader/reader.py @@ -64,7 +64,7 @@ class MeliaeReader(object): def get_objs_of_type(self, typename): return [o for o in self if o['type'] == typename] - def compute_closures(self): + def compute_closures_foo(self): all_refs = self._objs.keys() # Set all closures to be just the object itself. @@ -99,21 +99,23 @@ class MeliaeReader(object): grown = True return grown + def compute_closures(self): + for ref in self._objs.keys(): + sys.stderr.write('{} closures left\n'.format( + len(self) - len(self._closures))) + self._closures[ref] = self._simple_get_closure(ref) + def _simple_get_closure(self, ref): # pragma: no cover closure = set() todo = set([ref]) - done = set() while todo: ref = todo.pop() - done.add(ref) - if ref in self._closures: - closure = closure.union(self._closures[ref]) - else: - closure.add(ref) - obj = self.get_object(ref) - for child_ref in obj['refs']: - if child_ref not in done and child_ref in self: - todo.add(child_ref) + assert ref not in closure + closure.add(ref) + obj = self.get_object(ref) + for child_ref in obj['refs']: + if child_ref not in closure and child_ref in self: + todo.add(child_ref) return closure |