From 5557c680744bfa379df98d86d9dae72ac9f053eb Mon Sep 17 00:00:00 2001 From: David Anthoff Date: Tue, 18 Aug 2026 14:55:30 -0700 Subject: [PATCH] TestEnv: port merge-project guard to Julia <=1.10 variants The Julia 1.11+ variant of the vendored TestEnv tolerates the package's own uuid already being present in the working manifest when merging the test manifest; the 1.4/1.7/1.8/1.9 variants still raised "can not merge projects" unconditionally. That breaks packages whose test/Manifest.toml dev's the package itself (path = "..") on Julia <= 1.10. Port the guard to the older variants, add the TestManifestPackage fixture and a regression test that runs it on the current Julia and, under the comprehensive_platform tag, on Julia 1.10. Refs julia-vscode/julia-vscode#3832, julia-vscode/julia-vscode#3633 Co-Authored-By: Claude Fable 5 --- .gitignore | 3 ++ .../TestEnv/src/julia-1.4/activate_set.jl | 3 +- .../TestEnv/src/julia-1.7/activate_set.jl | 3 +- .../TestEnv/src/julia-1.8/activate_set.jl | 3 +- .../TestEnv/src/julia-1.9/activate_set.jl | 3 +- test/test_test_manifest.jl | 51 +++++++++++++++++++ testdata/TestManifestPackage/Project.toml | 3 ++ .../src/TestManifestPackage.jl | 7 +++ .../TestManifestPackage/test/Manifest.toml | 44 ++++++++++++++++ .../TestManifestPackage/test/Project.toml | 4 ++ .../TestManifestPackage/test/testitems.jl | 4 ++ 11 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 test/test_test_manifest.jl create mode 100644 testdata/TestManifestPackage/Project.toml create mode 100644 testdata/TestManifestPackage/src/TestManifestPackage.jl create mode 100644 testdata/TestManifestPackage/test/Manifest.toml create mode 100644 testdata/TestManifestPackage/test/Project.toml create mode 100644 testdata/TestManifestPackage/test/testitems.jl diff --git a/.gitignore b/.gitignore index 4b50f40..7efe6f7 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ Manifest.toml *.log docs/build + +# Fixture for the TestEnv merge-project guard: the test manifest is the point of the test. +!testdata/TestManifestPackage/test/Manifest.toml diff --git a/packages/TestEnv/src/julia-1.4/activate_set.jl b/packages/TestEnv/src/julia-1.4/activate_set.jl index 105299b..40594cb 100644 --- a/packages/TestEnv/src/julia-1.4/activate_set.jl +++ b/packages/TestEnv/src/julia-1.4/activate_set.jl @@ -37,7 +37,8 @@ function activate(pkg::AbstractString=current_pkg_name()) if entry !== nothing && isfixed(entry) subgraph = Pkg.Operations.prune_manifest(sandbox_manifest, [uuid]) for (uuid, entry) in subgraph - if haskey(working_manifest, uuid) + entry_working = get(working_manifest, uuid, nothing) + if entry_working !== nothing && entry_working != entry && (ctx.env.pkg !== nothing && ctx.env.pkg.uuid != uuid) Pkg.Operations.pkgerror("can not merge projects") end working_manifest[uuid] = entry diff --git a/packages/TestEnv/src/julia-1.7/activate_set.jl b/packages/TestEnv/src/julia-1.7/activate_set.jl index a2c92b2..b0b6c0d 100644 --- a/packages/TestEnv/src/julia-1.7/activate_set.jl +++ b/packages/TestEnv/src/julia-1.7/activate_set.jl @@ -39,7 +39,8 @@ function activate(pkg::AbstractString=current_pkg_name()) if entry !== nothing && isfixed(entry) subgraph = Pkg.Operations.prune_manifest(sandbox_manifest, [uuid]) for (uuid, entry) in subgraph - if haskey(working_manifest, uuid) + entry_working = get(working_manifest, uuid, nothing) + if entry_working !== nothing && entry_working != entry && (ctx.env.pkg !== nothing && ctx.env.pkg.uuid != uuid) Pkg.Operations.pkgerror("can not merge projects") end working_manifest[uuid] = entry diff --git a/packages/TestEnv/src/julia-1.8/activate_set.jl b/packages/TestEnv/src/julia-1.8/activate_set.jl index f97529c..cada24a 100644 --- a/packages/TestEnv/src/julia-1.8/activate_set.jl +++ b/packages/TestEnv/src/julia-1.8/activate_set.jl @@ -39,7 +39,8 @@ function activate(pkg::AbstractString=current_pkg_name(); allow_reresolve=true) if entry !== nothing && isfixed(entry) subgraph = Pkg.Operations.prune_manifest(sandbox_manifest, [uuid]) for (uuid, entry) in subgraph - if haskey(working_manifest, uuid) + entry_working = get(working_manifest, uuid, nothing) + if entry_working !== nothing && entry_working != entry && (ctx.env.pkg !== nothing && ctx.env.pkg.uuid != uuid) Pkg.Operations.pkgerror("can not merge projects") end working_manifest[uuid] = entry diff --git a/packages/TestEnv/src/julia-1.9/activate_set.jl b/packages/TestEnv/src/julia-1.9/activate_set.jl index 925f5e0..b7fb6c6 100644 --- a/packages/TestEnv/src/julia-1.9/activate_set.jl +++ b/packages/TestEnv/src/julia-1.9/activate_set.jl @@ -39,7 +39,8 @@ function activate(pkg::AbstractString=current_pkg_name(); allow_reresolve=true) if entry !== nothing && isfixed(entry) subgraph = Pkg.Operations.prune_manifest(sandbox_manifest, [uuid]) for (uuid, entry) in subgraph - if haskey(working_manifest, uuid) + entry_working = get(working_manifest, uuid, nothing) + if entry_working !== nothing && entry_working != entry && (ctx.env.pkg !== nothing && ctx.env.pkg.uuid != uuid) Pkg.Operations.pkgerror("can not merge projects") end working_manifest[uuid] = entry diff --git a/test/test_test_manifest.jl b/test/test_test_manifest.jl new file mode 100644 index 0000000..c7ce63e --- /dev/null +++ b/test/test_test_manifest.jl @@ -0,0 +1,51 @@ +# Regression test for a package whose `test/Manifest.toml` lists the package itself as a +# `path = ".."` dev entry (the layout `Pkg.develop(path=".")` inside `test/` produces). +# +# TestEnv merges the test manifest into the package's own manifest and used to error with +# "can not merge projects" on Julia <= 1.10 when the package's uuid was already present, see +# julia-vscode/julia-vscode#3832 and #3633. The Julia 1.11+ variant of the vendored TestEnv +# already tolerated that; the older variants carry the same guard now. + +@testitem "Package with test/Manifest.toml dev-ing itself activates" setup=[TestHelpers] begin + pkg_path = joinpath(TestHelpers.TESTDATA_DIR, "TestManifestPackage") + discovered = TestHelpers.discover_test_items(pkg_path) + @test length(discovered.items) == 1 + + result = TestHelpers.run_testrun(discovered) + + passed_events = filter(e -> e.event == :passed, result.events) + errored_events = filter(e -> e.event == :errored, result.events) + failed_events = filter(e -> e.event == :failed, result.events) + + @test length(passed_events) == 1 + @test length(errored_events) == 0 + @test length(failed_events) == 0 +end + +# Same fixture on Julia 1.10, the newest release that runs the pre-1.11 TestEnv variant +# where the guard was missing. +@testitem "Package with test/Manifest.toml dev-ing itself activates on Julia 1.10" tags=[:comprehensive_platform] setup=[TestHelpers] begin + version = "1.10" + version in TestHelpers.installed_juliaup_channels() || + error("Julia $version is not installed. Install it with: juliaup add $version") + + pkg_path = joinpath(TestHelpers.TESTDATA_DIR, "TestManifestPackage") + discovered = TestHelpers.discover_test_items(pkg_path) + @test length(discovered.items) == 1 + + result = TestHelpers.run_testrun( + discovered; + julia_cmd="julia", + julia_args=["+$version"], + timeout=1800, + env=TestHelpers.isolated_depot_env(version) + ) + + passed_events = filter(e -> e.event == :passed, result.events) + errored_events = filter(e -> e.event == :errored, result.events) + failed_events = filter(e -> e.event == :failed, result.events) + + @test length(passed_events) == 1 + @test length(errored_events) == 0 + @test length(failed_events) == 0 +end diff --git a/testdata/TestManifestPackage/Project.toml b/testdata/TestManifestPackage/Project.toml new file mode 100644 index 0000000..c6361bd --- /dev/null +++ b/testdata/TestManifestPackage/Project.toml @@ -0,0 +1,3 @@ +name = "TestManifestPackage" +uuid = "a1b2c3d4-0001-0002-0003-000000000005" +version = "0.1.0" diff --git a/testdata/TestManifestPackage/src/TestManifestPackage.jl b/testdata/TestManifestPackage/src/TestManifestPackage.jl new file mode 100644 index 0000000..349a881 --- /dev/null +++ b/testdata/TestManifestPackage/src/TestManifestPackage.jl @@ -0,0 +1,7 @@ +module TestManifestPackage + +export add + +add(a, b) = a + b + +end diff --git a/testdata/TestManifestPackage/test/Manifest.toml b/testdata/TestManifestPackage/test/Manifest.toml new file mode 100644 index 0000000..7bbfea7 --- /dev/null +++ b/testdata/TestManifestPackage/test/Manifest.toml @@ -0,0 +1,44 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.10.12" +manifest_format = "2.0" +project_hash = "384635e1de875781e73ceb2aa94e5daeb20cc464" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.TestItems]] +git-tree-sha1 = "a6dd904babc04670c784f81b67957a3545271610" +uuid = "1c621080-faea-4a02-84b6-bbd5e436b8fe" +version = "1.1.0" + +[[deps.TestManifestPackage]] +path = ".." +uuid = "a1b2c3d4-0001-0002-0003-000000000005" +version = "0.1.0" diff --git a/testdata/TestManifestPackage/test/Project.toml b/testdata/TestManifestPackage/test/Project.toml new file mode 100644 index 0000000..c70f2ab --- /dev/null +++ b/testdata/TestManifestPackage/test/Project.toml @@ -0,0 +1,4 @@ +[deps] +Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +TestItems = "1c621080-faea-4a02-84b6-bbd5e436b8fe" +TestManifestPackage = "a1b2c3d4-0001-0002-0003-000000000005" diff --git a/testdata/TestManifestPackage/test/testitems.jl b/testdata/TestManifestPackage/test/testitems.jl new file mode 100644 index 0000000..46812da --- /dev/null +++ b/testdata/TestManifestPackage/test/testitems.jl @@ -0,0 +1,4 @@ +@testitem "add works" begin + using TestManifestPackage + @test add(1, 2) == 3 +end