Skip to content

Commit fcc18c3

Browse files
committed
fix: do not factor in lde.lock of dependencies
1 parent a745da1 commit fcc18c3

2 files changed

Lines changed: 59 additions & 1 deletion

File tree

packages/lde-core/src/package/install/init.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ local function collectDependencies(dependencies, ctx)
8989
ctx.visiting[alias] = true
9090
local parentRelativeTo = ctx.relativeTo
9191
ctx.relativeTo = pkg:getDir()
92-
collectDependencies(pkg:getDependencies(), ctx)
92+
collectDependencies(pkg:readConfig().dependencies or {}, ctx)
9393
ctx.relativeTo = parentRelativeTo
9494
ctx.visiting[alias] = nil
9595
end

packages/lde-core/tests/main.test.lua

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,64 @@ test.it("installDependencies: writes a single flat lockfile containing all trans
555555
test.falsy(lde.Lockfile.open(path.join(middleDir, "lde.lock")))
556556
end)
557557

558+
test.it("installDependencies: ignores sub-package lockfiles during transitive resolution", function()
559+
fs.mkdir(tmpBase)
560+
561+
-- A deep package that actually exists and will be the real transitive dep
562+
local deepA = path.join(tmpBase, "ignore-lockfile-deep-a")
563+
fs.mkdir(deepA)
564+
fs.mkdir(path.join(deepA, "src"))
565+
fs.write(path.join(deepA, "src", "init.lua"), "return { name = 'deep-a' }")
566+
fs.write(path.join(deepA, "lde.json"), json.encode({
567+
name = "ignore-lockfile-deep-a",
568+
version = "0.1.0",
569+
dependencies = {}
570+
}))
571+
572+
-- Middle package: lde.json says deep-a, but it has a stale lde.lock referencing deep-b (nonexistent)
573+
local middleDir = path.join(tmpBase, "ignore-lockfile-middle")
574+
fs.mkdir(middleDir)
575+
fs.mkdir(path.join(middleDir, "src"))
576+
fs.write(path.join(middleDir, "src", "init.lua"), "return {}")
577+
fs.write(path.join(middleDir, "lde.json"), json.encode({
578+
name = "ignore-lockfile-middle",
579+
version = "0.1.0",
580+
dependencies = {
581+
["ignore-lockfile-deep-a"] = { path = "../ignore-lockfile-deep-a" }
582+
}
583+
}))
584+
-- Write a stale lockfile in the middle that points to a nonexistent deep-b
585+
-- If this lockfile were consulted, install would fail trying to resolve deep-b
586+
fs.write(path.join(middleDir, "lde.lock"), json.encode({
587+
version = "1",
588+
dependencies = {
589+
["ignore-lockfile-deep-b"] = { path = path.join(tmpBase, "ignore-lockfile-deep-b") }
590+
}
591+
}))
592+
593+
-- Root depends only on middle
594+
local rootDir = path.join(tmpBase, "ignore-lockfile-root")
595+
fs.mkdir(rootDir)
596+
fs.mkdir(path.join(rootDir, "src"))
597+
fs.write(path.join(rootDir, "src", "init.lua"), "return {}")
598+
fs.write(path.join(rootDir, "lde.json"), json.encode({
599+
name = "ignore-lockfile-root",
600+
version = "0.1.0",
601+
dependencies = {
602+
["ignore-lockfile-middle"] = { path = "../ignore-lockfile-middle" }
603+
}
604+
}))
605+
606+
local root = lde.Package.open(rootDir)
607+
root:installDependencies()
608+
609+
-- Root lockfile must contain deep-a (from lde.json), NOT deep-b (from stale lockfile)
610+
local lockfile = root:readLockfile()
611+
test.truthy(lockfile)
612+
test.truthy(lockfile:getDependency("ignore-lockfile-deep-a"))
613+
test.falsy(lockfile:getDependency("ignore-lockfile-deep-b"))
614+
end)
615+
558616
-- It's undefined behavior for lde specifically to rely on transitive deps.
559617
-- But regardless need to ensure it works at runtime for the actual dependencies that will use it.
560618
test.it("transitive dep: util is resolvable as a dependency of lde-core", function()

0 commit comments

Comments
 (0)