32 lines
1.1 KiB
Python
32 lines
1.1 KiB
Python
from pathlib import Path
|
|
import stat
|
|
|
|
|
|
def sqlite_inventory(root, expected):
|
|
root = Path(root)
|
|
assert root.is_absolute() and root.resolve(strict=True) == root
|
|
assert (root / 'data').is_dir()
|
|
expected = set(expected)
|
|
assert all(path.is_relative_to(root) for path in expected)
|
|
seen = set()
|
|
pending = [root]
|
|
while pending:
|
|
path = pending.pop()
|
|
assert not path.is_symlink() and not getattr(path, 'is_junction', lambda: False)()
|
|
mode = path.stat().st_mode
|
|
if stat.S_ISDIR(mode):
|
|
pending.extend(path.iterdir())
|
|
continue
|
|
assert stat.S_ISREG(mode)
|
|
name = path.name.lower()
|
|
if name.endswith(('-wal', '-shm', '-journal')):
|
|
assert path.with_name(path.name.rsplit('-', 1)[0]) in expected
|
|
continue
|
|
with path.open('rb') as stream:
|
|
header = stream.read(16)
|
|
if header == b'SQLite format 3\x00' or name.endswith('.db') or '.sqlite' in name:
|
|
assert path in expected
|
|
seen.add(path)
|
|
assert seen == expected
|
|
return sorted(seen)
|