Skip to content

Commit fca2937

Browse files
cursoragentTanya7z
andcommitted
fix(bds-tools): 强化 occupancy 单测并同步 lock(超集并行 #85)
保留 #81 扫描不中断契约(try/catch),采用完整+残缺 header 覆盖; 同步 #84 后 package-lock 中 sdk/cli 的 0.2.0-beta.1。 Co-authored-by: Shiroha <Tanya7z@users.noreply.github.com>
1 parent bcbb5e3 commit fca2937

3 files changed

Lines changed: 50 additions & 24 deletions

File tree

‎bds-tools/src/world-packs.ts‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,8 @@ export type PackInstallPlan =
566566

567567
/**
568568
* 读单目录占用事实(info 优先,否则 header)。
569-
* 读失败上抛,由调用方决定跳过或仍占文件夹名(uuid 置空)。
569+
* info/header 解析失败返回 null;BOM 已由 readJsonFile 剥离。
570+
* 其它异常上抛,由 scanDestOccupancy 决定仍占文件夹名(uuid 置空)。
570571
*/
571572
export function readPackDirOccupancy(dir: string): {
572573
uuid: string;
@@ -590,7 +591,7 @@ export function readPackDirOccupancy(dir: string): {
590591
return null;
591592
}
592593

593-
/** 扫描 destParent 下含 manifest 的目录占用 */
594+
/** 扫描 destParent 下含 manifest 的目录占用(占用事实唯一入口:readPackDirOccupancy) */
594595
export function scanDestOccupancy(destParent: string): DestOccupancy[] {
595596
const out: DestOccupancy[] = [];
596597
for (const dir of listPackDirsIn(destParent)) {
@@ -599,7 +600,7 @@ export function scanDestOccupancy(destParent: string): DestOccupancy[] {
599600
// DRY:单目录占用只走 readPackDirOccupancy,禁止再内联一份 info/header 分支
600601
facts = readPackDirOccupancy(dir);
601602
} catch {
602-
/* manifest 不可读则占位 uuid 为空 */
603+
/* manifest 不可读则占位 uuid 为空(#81 契约:扫描本身不因单目录失败而中断) */
603604
}
604605
out.push({
605606
folderName: path.basename(dir),

‎bds-tools/world-packs.test.mjs‎

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -283,24 +283,49 @@ describe("world-packs primitives", () => {
283283
assert.deepEqual(version, [2, 0, 1]);
284284
});
285285

286-
it("scanDestOccupancy 走 readPackDirOccupancy(含 kind)", async () => {
287-
const { scanDestOccupancy } = await import("./dist/world-packs.js");
288-
const parent = path.join(tmp, "occupancy-scan");
289-
const dir = path.join(parent, "[BP] Occ");
290-
const uuid = "cccccccc-cccc-cccc-cccc-cccccccccccc";
291-
writeManifest(dir, {
292-
name: "OccPack",
293-
uuid,
294-
version: [2, 3, 4],
295-
type: "data",
286+
it("scanDestOccupancy 走 readPackDirOccupancy(完整 + 残缺 header)", async () => {
287+
const { scanDestOccupancy, readPackDirOccupancy } = await import("./dist/world-packs.js");
288+
const dest = path.join(tmp, "occupancy-dry");
289+
const fullDir = path.join(dest, "[RP] Full");
290+
writeManifest(fullDir, {
291+
name: "Full Pack",
292+
uuid: "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
293+
version: [2, 1, 0],
294+
type: "resources",
296295
});
297-
const rows = scanDestOccupancy(parent);
298-
assert.equal(rows.length, 1);
299-
assert.equal(rows[0].folderName, "[BP] Occ");
300-
assert.equal(rows[0].uuid, uuid);
301-
assert.deepEqual(rows[0].version, [2, 3, 4]);
302-
assert.equal(rows[0].name, "OccPack");
303-
assert.equal(rows[0].kind, "behavior");
296+
const partialDir = path.join(dest, "[RP] Partial");
297+
fs.mkdirSync(partialDir, { recursive: true });
298+
fs.writeFileSync(
299+
path.join(partialDir, "manifest.json"),
300+
JSON.stringify({
301+
format_version: 2,
302+
header: {
303+
name: "Partial",
304+
uuid: "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb",
305+
version: [3, 0, 0],
306+
},
307+
modules: [],
308+
})
309+
);
310+
311+
const fullFacts = readPackDirOccupancy(fullDir);
312+
assert.equal(fullFacts?.uuid, "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
313+
assert.deepEqual(fullFacts?.version, [2, 1, 0]);
314+
assert.equal(fullFacts?.name, "Full Pack");
315+
assert.equal(fullFacts?.kind, "resource");
316+
317+
const partialFacts = readPackDirOccupancy(partialDir);
318+
assert.equal(partialFacts?.uuid, "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb");
319+
assert.deepEqual(partialFacts?.version, [3, 0, 0]);
320+
assert.equal(partialFacts?.kind, undefined);
321+
322+
const occ = scanDestOccupancy(dest);
323+
assert.equal(occ.length, 2);
324+
const byUuid = new Map(occ.map((o) => [o.uuid, o]));
325+
assert.equal(byUuid.get("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")?.name, "Full Pack");
326+
assert.equal(byUuid.get("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa")?.kind, "resource");
327+
assert.equal(byUuid.get("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb")?.version?.[0], 3);
328+
assert.equal(byUuid.get("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb")?.name, undefined);
304329
});
305330

306331
it("decidePackInstallPlan 表驱动", async () => {

‎package-lock.json‎

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)