2 from __future__ import absolute_import, print_function
3 from collections import namedtuple
4 from stat import S_ISDIR
7 from bup.metadata import Metadata
8 from bup.git import BUP_CHUNKED
10 TreeDictValue = namedtuple('TreeDictValue', ('name', 'oid', 'meta'))
12 def tree_items(repo, oid):
13 """Yield (name, entry_oid, meta) for each entry in oid. meta will be
14 a Metadata object for any non-directories and for '.', otherwise
18 # This is a simpler approach than the one in the vfs, used to
19 # cross-check its behavior.
20 tree_data, bupm_oid = vfs.tree_data_and_bupm(repo, oid)
21 bupm = vfs._FileReader(repo, bupm_oid) if bupm_oid else None
23 maybe_meta = lambda : Metadata.read(bupm) if bupm else None
25 if m and m.size is None:
27 yield TreeDictValue(name='.', oid=oid, meta=m)
28 tree_ents = vfs.ordered_tree_entries(tree_data, bupm=True)
29 for name, mangled_name, kind, gitmode, sub_oid in tree_ents:
30 if mangled_name == '.bupm':
34 if kind == BUP_CHUNKED:
35 yield TreeDictValue(name=name, oid=sub_oid,
38 yield TreeDictValue(name=name, oid=sub_oid,
39 meta=vfs.default_dir_mode)
41 yield TreeDictValue(name=name, oid=sub_oid, meta=maybe_meta())
46 def tree_dict(repo, oid):
47 return dict((x.name, x) for x in tree_items(repo, oid))