Skip to content

Commit b303a3c

Browse files
committed
fix: (#2) caches now track deleted files
1 parent c4278d4 commit b303a3c

File tree

3 files changed

+86
-14
lines changed

3 files changed

+86
-14
lines changed

beet_observer/data_pack.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from pathlib import PosixPath
12
from typing import Any
23

34
import beet.contrib.worldgen as wg
@@ -6,9 +7,10 @@
67

78
def gen_dp_overlays(
89
ctx: Context, ctx_overlay: Context, overlay_dir: str, ignore: list[str]
9-
) -> None:
10+
) -> list[PosixPath]:
1011
"""
11-
Generates overlays between two datapacks.
12+
Generates overlays between two datapacks. \n
13+
Returns a list of deleted files from the source pack.
1214
1315
Keyword arguments: \n
1416
`ctx` -- the build context \n
@@ -108,8 +110,9 @@ def gen_dp_overlays(
108110
),
109111
]
110112
# for each file type, check for required overlays
113+
deleted: list[PosixPath] = []
111114
for registry, registry_overlay in file_types:
112-
check_registry(ctx, overlay_dir, registry, registry_overlay)
115+
deleted.extend(check_registry(ctx, overlay_dir, registry, registry_overlay))
113116

114117
# get pack.mcmeta overlay entries
115118
mcmeta: dict[str, dict[str, list[dict[str, Any]]]] = ctx.data.mcmeta.data.copy()
@@ -154,29 +157,36 @@ def gen_dp_overlays(
154157
if len(entries) > 0:
155158
ctx.data.mcmeta.data.update({"overlays": {"entries": entries}})
156159

160+
return deleted
161+
157162

158163
def check_registry(
159164
ctx: Context,
160165
overlay_dir: str,
161166
registry: NamespaceProxy[Any],
162167
registry_overlay: NamespaceProxy[Any],
163-
) -> None:
168+
) -> list[PosixPath]:
164169
"""
165-
Generates overlays for each namespace proxy.
170+
Generates overlays for each namespace proxy. \n
171+
Returns a list of deleted files from the source pack.
166172
167173
Keyword arguments: \n
168174
`ctx` -- the build context \n
169175
`overlay_dir` -- the directory of the overlay \n
170176
`registry` -- the namespace proxy from the build context \n
171177
`registry_overlay` -- the namespace proxy from the overlay context \n
172178
"""
179+
# prepare cache deletion list
180+
deleted: list[PosixPath] = []
181+
173182
# check each file in the build pack
174183
for name in list(registry):
175184
if name in registry_overlay:
176185
# exists in both, so check if an overlay is needed
177186
gen_registry_overlay(ctx, overlay_dir, name, registry, registry_overlay)
178187
else:
179188
# exists only in overlay, so create a deletion overlay
189+
deleted.append(registry[name].source_path)
180190
gen_registry_overlay(
181191
ctx, overlay_dir, name, registry, registry_overlay, "deletion"
182192
)
@@ -187,6 +197,8 @@ def check_registry(
187197
ctx, overlay_dir, name, registry, registry_overlay, "addition"
188198
)
189199

200+
return deleted
201+
190202

191203
def gen_registry_overlay(
192204
ctx: Context,

beet_observer/plugin.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from pathlib import PosixPath
2+
13
from beet import Context, run_beet
24

35
from .data_pack import gen_dp_overlays
@@ -17,12 +19,52 @@ def beet_default(ctx: Context):
1719
if ctx.data:
1820
dp_path = cache.get_path(f"{ctx.directory} saved_data_pack")
1921
if dp_path.is_dir():
20-
ctx.data.load(f"{dp_path}")
22+
# get files that were moved to an overlay
23+
with open(f"{dp_path}/deleted.txt", mode="r") as del_list:
24+
deleted = del_list.read().splitlines()
25+
26+
# delete files that were moved to an overlay
27+
for target in deleted:
28+
# get file location
29+
target_path = PosixPath(target)
30+
folders = target_path.parts
31+
ext = "." + folders[-1].split(".")[-1]
32+
loc = f"{folders[1]}:{folders[-1].removesuffix(ext)}"
33+
# get resource location
34+
for location, resource in ctx.data.all(loc):
35+
p = str(resource.source_path) # type: ignore
36+
resource_path = PosixPath((p[p.find("/data/") + 1 :]))
37+
# delete resource from pack
38+
if target_path == resource_path:
39+
del ctx.data[type(resource)][location]
40+
41+
# add overlays to pack
42+
ctx.data.load(f"{dp_path}/pack")
2143
cached_dp = True
2244
if ctx.assets:
2345
rp_path = cache.get_path(f"{ctx.directory} saved_resource_pack")
2446
if rp_path.is_dir():
25-
ctx.assets.load(f"{rp_path}")
47+
# get files that were moved to an overlay
48+
with open(f"{rp_path}/deleted.txt", mode="r") as del_list:
49+
deleted = del_list.read().splitlines()
50+
51+
# delete files that were moved to an overlay
52+
for target in deleted:
53+
# get file location
54+
target_path = PosixPath(target)
55+
folders = target_path.parts
56+
ext = "." + folders[-1].split(".")[-1]
57+
loc = f"{folders[1]}:{folders[-1].removesuffix(ext)}"
58+
# get resource location
59+
for location, resource in ctx.assets.all(loc):
60+
p = str(resource.source_path) # type: ignore
61+
resource_path = PosixPath((p[p.find("/assets/") + 1 :]))
62+
# delete resource from pack
63+
if target_path == resource_path:
64+
del ctx.assets[type(resource)][location]
65+
66+
# add overlays to pack
67+
ctx.assets.load(f"{rp_path}/pack")
2668
cached_rp = True
2769
if cached_dp and cached_rp:
2870
return
@@ -52,6 +94,8 @@ def beet_default(ctx: Context):
5294
for overlay in ctx.assets.overlays:
5395
save_rp.append(overlay)
5496
# loop through all overlays
97+
deleted_dp: list[PosixPath] = []
98+
deleted_rp: list[PosixPath] = []
5599
for overlay in ctx.meta["observer"]["overlays"]:
56100
# get pack
57101
if overlay["process"].startswith("https://"):
@@ -70,12 +114,18 @@ def beet_default(ctx: Context):
70114
rp_dir = overlay["directory"]
71115
# compare build pack and overlay pack
72116
if not cached_dp and ctx.data:
73-
gen_dp_overlays(ctx, ctx_overlay, dp_dir, save_dp)
117+
deleted_dp = gen_dp_overlays(ctx, ctx_overlay, dp_dir, save_dp)
74118
if not cached_rp and ctx.assets:
75-
gen_rp_overlays(ctx, ctx_overlay, rp_dir, save_rp)
119+
deleted_rp = gen_rp_overlays(ctx, ctx_overlay, rp_dir, save_rp)
76120

77121
# save to cache
78122
if not cached_dp and ctx.data:
79-
ctx.data.save(path=dp_path)
123+
ctx.data.save(path=f"{dp_path}/pack")
124+
with open(f"{dp_path}/deleted.txt", mode="x") as file:
125+
for s in deleted_dp:
126+
file.write(str(s)[str(s).find("/data/") + 1 :] + "\n")
80127
if not cached_rp and ctx.assets:
81-
ctx.assets.save(path=rp_path)
128+
ctx.assets.save(path=f"{rp_path}/pack")
129+
with open(f"{rp_path}/deleted.txt", mode="x") as file:
130+
for s in deleted_rp:
131+
file.write(str(s)[str(s).find("/assets/") + 1 :] + "\n")

beet_observer/resource_pack.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
from pathlib import PosixPath
12
from typing import Any
23

34
from beet import Context, NamespaceProxy
45

56

67
def gen_rp_overlays(
78
ctx: Context, ctx_overlay: Context, overlay_dir: str, ignore: list[str]
8-
) -> None:
9+
) -> list[PosixPath]:
910
"""
1011
Generates overlays between two resource packs.
1112
@@ -36,8 +37,9 @@ def gen_rp_overlays(
3637
(ctx.assets.atlases, ctx_overlay.assets.atlases),
3738
]
3839
# for each file type, check for required overlays
40+
deleted: list[PosixPath] = []
3941
for registry, registry_overlay in file_types:
40-
check_registry(ctx, overlay_dir, registry, registry_overlay)
42+
deleted.extend(check_registry(ctx, overlay_dir, registry, registry_overlay))
4143

4244
# get pack.mcmeta overlay entries
4345
mcmeta: dict[str, dict[str, list[dict[str, Any]]]] = ctx.assets.mcmeta.data.copy()
@@ -82,13 +84,15 @@ def gen_rp_overlays(
8284
if len(entries) > 0:
8385
ctx.assets.mcmeta.data.update({"overlays": {"entries": entries}})
8486

87+
return deleted
88+
8589

8690
def check_registry(
8791
ctx: Context,
8892
overlay_dir: str,
8993
registry: NamespaceProxy[Any],
9094
registry_overlay: NamespaceProxy[Any],
91-
) -> None:
95+
) -> list[PosixPath]:
9296
"""
9397
Generates overlays for each namespace proxy.
9498
@@ -98,13 +102,17 @@ def check_registry(
98102
`registry` -- the namespace proxy from the build context \n
99103
`registry_overlay` -- the namespace proxy from the overlay context \n
100104
"""
105+
# prepare cache deletion list
106+
deleted: list[PosixPath] = []
107+
101108
# check each file in the build pack
102109
for name in list(registry):
103110
if name in registry_overlay:
104111
# exists in both, so check if an overlay is needed
105112
gen_registry_overlay(ctx, overlay_dir, name, registry, registry_overlay)
106113
else:
107114
# exists only in overlay, so create a deletion overlay
115+
deleted.append(registry[name].source_path)
108116
gen_registry_overlay(
109117
ctx, overlay_dir, name, registry, registry_overlay, "deletion"
110118
)
@@ -115,6 +123,8 @@ def check_registry(
115123
ctx, overlay_dir, name, registry, registry_overlay, "addition"
116124
)
117125

126+
return deleted
127+
118128

119129
def gen_registry_overlay(
120130
ctx: Context,

0 commit comments

Comments
 (0)