]> arthur.barton.de Git - bup.git/blob - lib/bup/test/vfs.py
Move vfs resolve() tests to tresolve.py
[bup.git] / lib / bup / test / vfs.py
1
2 from __future__ import absolute_import, print_function
3 from collections import namedtuple
4 from stat import S_ISDIR
5
6 from bup import vfs
7 from bup.metadata import Metadata
8 from bup.git import BUP_CHUNKED
9
10 TreeDictValue = namedtuple('TreeDictValue', ('name', 'oid', 'meta'))
11
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
15     None.
16
17     """
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
22     try:
23         maybe_meta = lambda : Metadata.read(bupm) if bupm else None
24         m = maybe_meta()
25         if m and m.size is None:
26             m.size = 0
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':
31                 continue
32             assert name != '.'
33             if S_ISDIR(gitmode):
34                 if kind == BUP_CHUNKED:
35                     yield TreeDictValue(name=name, oid=sub_oid,
36                                         meta=maybe_meta())
37                 else:
38                     yield TreeDictValue(name=name, oid=sub_oid,
39                                         meta=vfs.default_dir_mode)
40             else:
41                 yield TreeDictValue(name=name, oid=sub_oid, meta=maybe_meta())
42     finally:
43         if bupm:
44             bupm.close()
45
46 def tree_dict(repo, oid):
47     return dict((x.name, x) for x in tree_items(repo, oid))