Skip to content

Commit d5d2db3

Browse files
Fix weak dep, which is a test dep for merged projects (#40)
* fix weak dep, which is a test dep * use julia v1.10 * try to fix julia version mismatch error * Revert "try to fix julia version mismatch error" This reverts commit 29781e9. * make VERSION the default for julia_version * clarify README
1 parent 066064d commit d5d2db3

File tree

4 files changed

+88
-10
lines changed

4 files changed

+88
-10
lines changed

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ minimal versions and fail if your compat bounds are too low.
5151
mode: 'alldeps'
5252

5353
# Julia version to use with resolver (requires Julia 1.9+)
54-
# Default: '1.10'
55-
julia_version: '1.10'
54+
# Default: '1' (converted to current runtime Julia major.minor)
55+
julia_version: '1'
5656
```
5757
5858
## Example
@@ -86,6 +86,9 @@ before `julia-buildpkg` so that Resolver.jl creates a Manifest.toml with minimal
8686

8787
In this example, we test both `deps` (direct dependencies only) and `alldeps` (deps + weakdeps) scenarios.
8888

89+
When possible, run the action on the same Julia version that you pass as `julia_version`.
90+
Cross-runtime resolution may fail; matching runtime and target version is recommended and the default for `julia_version`.
91+
8992
## Downgrade Modes
9093

9194
- **`deps`**: Minimize only your direct dependencies (recommended for most packages)

action.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ inputs:
1111
description: 'Downgrade mode: deps (direct dependencies), alldeps (deps + weakdeps), weakdeps (only weakdeps), forcedeps (deps with strict lower bound verification)'
1212
default: 'alldeps'
1313
julia_version:
14-
description: 'Julia version to use with resolver (default: 1.10)'
15-
default: '1.10'
14+
description: 'Julia version to use with resolver (default: 1, i.e. current runtime Julia major.minor)'
15+
default: '1'
1616
runs:
1717
using: "composite"
1818
steps:

downgrade.jl

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@ using TOML
33
ignore_pkgs = filter(!isempty, map(strip, split(ARGS[1], ",")))
44
dirs = filter(!isempty, map(strip, split(ARGS[2], ",")))
55
mode = length(ARGS) >= 3 ? ARGS[3] : "deps"
6-
julia_version = length(ARGS) >= 4 ? ARGS[4] : "1.10"
6+
current_julia_minor = string(VERSION.major, ".", VERSION.minor)
7+
julia_version = length(ARGS) >= 4 ? ARGS[4] : current_julia_minor
78

89
# Convert "1" to the current running Julia version (e.g., "1.12" for Julia 1.12.3)
910
# This ensures the resolved manifest matches the Julia version that will read it
1011
if julia_version == "1"
11-
julia_version = string(VERSION.major, ".", VERSION.minor)
12+
julia_version = current_julia_minor
1213
@info "Converted julia_version \"1\" to \"$julia_version\" (current Julia version)"
1314
end
1415

16+
if julia_version != current_julia_minor
17+
@warn "Requested julia_version=$julia_version differs from current runtime Julia $current_julia_minor. Cross-runtime mode may fail."
18+
end
19+
1520
valid_modes = ["deps", "alldeps", "weakdeps", "forcedeps"]
1621
mode in valid_modes || error("mode must be one of: $(join(valid_modes, ", "))")
1722

@@ -137,17 +142,31 @@ function create_merged_project(main_project_file::String, test_project_file::Str
137142
delete!(merged, "workspace")
138143

139144
# Merge deps from test project (excluding source packages)
145+
# If a package is weak in main but strong in test, promote it to strong
146+
# in the merged project by removing it from weakdeps.
140147
test_deps = get(test_project, "deps", Dict())
141148
if !haskey(merged, "deps")
142149
merged["deps"] = Dict{String, Any}()
143150
end
144151
for (pkg, uuid) in test_deps
145-
if pkg source_pkgs && !haskey(merged["deps"], pkg)
146-
merged["deps"][pkg] = uuid
147-
@info "Adding test dependency to merged project: $pkg"
152+
if pkg source_pkgs
153+
if !haskey(merged["deps"], pkg)
154+
merged["deps"][pkg] = uuid
155+
@info "Adding test dependency to merged project: $pkg"
156+
end
157+
158+
if haskey(merged, "weakdeps") && haskey(merged["weakdeps"], pkg)
159+
delete!(merged["weakdeps"], pkg)
160+
@info "Promoting $pkg from weakdep to dependency in merged project"
161+
end
148162
end
149163
end
150164

165+
# Remove empty [weakdeps] section after promotions
166+
if haskey(merged, "weakdeps") && isempty(merged["weakdeps"])
167+
delete!(merged, "weakdeps")
168+
end
169+
151170
# Merge compat entries from test project
152171
test_compat = get(test_project, "compat", Dict())
153172
if !haskey(merged, "compat")

test/runtests.jl

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ downgrade_jl = joinpath(dirname(@__DIR__), "downgrade.jl")
107107

108108
# Run the downgrade script with forcedeps mode - should fail
109109
@test_throws ProcessFailedException run(
110-
`$(Base.julia_cmd()) $downgrade_jl "" "." "forcedeps" "1.10"`,
110+
`$(Base.julia_cmd()) $downgrade_jl "" "." "forcedeps"`,
111111
)
112112
end
113113
end
@@ -300,4 +300,60 @@ downgrade_jl = joinpath(dirname(@__DIR__), "downgrade.jl")
300300
end
301301
end
302302
end
303+
304+
@testset "merged resolution promotes weakdeps used by tests" begin
305+
mktempdir() do dir
306+
cd(dir) do
307+
# Main project has JuMP as weakdep
308+
main_toml = """
309+
name = "TestPackage"
310+
uuid = "598b003f-0677-49cf-8d2a-39b1658b755a"
311+
version = "0.1.0"
312+
313+
[deps]
314+
315+
[weakdeps]
316+
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
317+
318+
[extensions]
319+
JuMPExt = "JuMP"
320+
321+
[compat]
322+
julia = "1.10"
323+
JuMP = "1.28"
324+
325+
[workspace]
326+
projects = ["test"]
327+
"""
328+
write("Project.toml", main_toml)
329+
330+
mkdir("src")
331+
write("src/TestPackage.jl", "module TestPackage\nend\n")
332+
333+
# Test project requires JuMP as a regular dependency
334+
mkdir("test")
335+
test_toml = """
336+
[deps]
337+
TestPackage = "598b003f-0677-49cf-8d2a-39b1658b755a"
338+
JuMP = "4076af6c-e467-56ae-b986-b466b2749572"
339+
340+
[compat]
341+
JuMP = "1.28"
342+
343+
[sources.TestPackage]
344+
path = ".."
345+
"""
346+
write("test/Project.toml", test_toml)
347+
348+
run(`$(Base.julia_cmd()) $downgrade_jl "" ".,test" "forcedeps"`)
349+
350+
manifest = TOML.parsefile("Manifest.toml")
351+
deps = manifest["deps"]
352+
353+
deps_JuMP = get(deps, "JuMP", [])
354+
@test !isempty(deps_JuMP)
355+
@test startswith(deps_JuMP[1]["version"], "1.28")
356+
end
357+
end
358+
end
303359
end

0 commit comments

Comments
 (0)