Singularity/.sing/stage/lib/dirstat.py

52 lines
1.2 KiB
Python

from .abc import FileWrap, DirWrap
import os
import functools
if hasattr(functools, "cache"):
cache_fn = functools.cache
else:
cache_fn = functools.lru_cache
@cache_fn
def parse_directory(dirp):
structure = {}
os.chdir(dirp)
for d in os.listdir():
if os.path.isdir(d):
structure[d] = parse_directory(d)
elif os.path.isfile(d):
structure[d] = open(d, "rb").read()
os.chdir("..")
return structure
@cache_fn
def wrap_directory(dirp, level=0):
structure = parse_directory(dirp)
data = []
for k, v in structure.items():
if isinstance(v, dict):
data.append(wrap_directory(k, level + 1))
else:
data.append(FileWrap(k, v))
if level == 0:
os.chdir(os.path.join("..", ".."))
return DirWrap(dirp, *data)
@cache_fn
def unpack(dirw: DirWrap):
import shutil
for k, v in dirw.contains.items():
if isinstance(v, DirWrap):
if os.path.isdir(k):
shutil.rmtree(k)
os.mkdir(v.name)
os.chdir(v.name)
unpack(v)
os.chdir("..")
else:
open(k, "wb+").write(v.data)