Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/CompatHelper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ using UUIDs: UUIDs, UUID
using RegistryInstances: RegistryInstances

export DropEntry, KeepEntry, NewEntry
export AllExtras, IfExistingCompatExtras, NoExtras
export CIService, GitHubActions, GitLabCI

@static if Base.VERSION >= v"1.7-"
Expand Down
16 changes: 13 additions & 3 deletions src/dependencies.jl
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,17 @@ function get_local_clone(
return local_path
end

function get_project_deps(project_file::AbstractString; include_jll::Bool=false)
function get_project_deps(project_file::AbstractString; include_jll::Bool, open_prs_for_extras::ExtrasType)
project_deps = Set{DepInfo}()
dep_section = Dict{DepInfo,String}()
project = TOML.parsefile(project_file)

for section in ["deps", "weakdeps"]
sections = if open_prs_for_extras isa NoExtras
["deps", "weakdeps"]
else
["deps", "weakdeps", "extras"]
end
for section in sections
if haskey(project, section)
deps = project[section]
add_compat_section!(project)
Expand All @@ -38,7 +43,12 @@ function get_project_deps(project_file::AbstractString; include_jll::Bool=false)
compat_entry = DepInfo(package)
dep_entry = convert(String, strip(get(compat, name, "")))

if !isempty(dep_entry)
if isempty(dep_entry)
# Ignore dependencies in `[extras]` without a compat entry if `open_prs_for_extras` is `IfExistingCompatExtras()`
if section == "extras" && open_prs_for_extras isa IfExistingCompatExtras
continue
end
else
compat_entry.version_spec = semver_spec(dep_entry)
compat_entry.version_verbatim = dep_entry
end
Expand Down
10 changes: 9 additions & 1 deletion src/main.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
cc_user=false,
bump_version=false,
include_yanked=false,
open_prs_for_extras::ExtrasType=IfExistingCompatExtras(),
)

Main entry point for the package.
Expand All @@ -37,6 +38,13 @@ Main entry point for the package.
- `cc_user=false`: CC the user on the pull requests
- `bump_version=false`: When set to true, the version in Project.toml will be bumped if a pull request is made. Minor bump if >= 1.0, or patch bump if < 1.0
- `include_yanked=false`: When set to true, yanked versions will be included when calculating what the latest version of a package is
- `open_prs_for_extras::ExtrasType=IfExistingCompatExtras()`: How to handle dependencies in `[extras]`.
Can be `IfExistingCompatExtras()` (only open a pull request for a dependency in `[extras]` if a compat entry for it exists),
`AllExtras()` (open pull requests for all dependencies in `[extras]`),
or `NoExtras()` (do not open pull requests for dependencies in `[extras]`).

!!! note
The `open_prs_for_extras` keyword argument is considered experimental and may be changed in a non-breaking release.
"""
function main(
env::AbstractDict=ENV, ci_cfg::CIService=auto_detect_ci_service(; env=env); kwargs...
Expand All @@ -51,7 +59,7 @@ function main(

for subdir in options.subdirs
project_file = @mock joinpath(local_clone_path, subdir, "Project.toml")
deps, dep_sections = get_project_deps(project_file; include_jll=options.include_jll)
deps, dep_sections = get_project_deps(project_file; include_jll=options.include_jll, open_prs_for_extras=options.open_prs_for_extras)

populate_dep_versions_from_reg!(deps; options)

Expand Down
6 changes: 6 additions & 0 deletions src/utilities/types.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ mutable struct DepInfo
end
end

abstract type ExtrasType end
struct AllExtras <: ExtrasType end
struct IfExistingCompatExtras <: ExtrasType end
struct NoExtras <: ExtrasType end

function Base.in(p::Package, s::Set{DepInfo})
for i in s
if i.package == p
Expand Down Expand Up @@ -56,4 +61,5 @@ Base.@kwdef struct Options
cc_user::Bool = false
bump_version::Bool = false
include_yanked::Bool = false
open_prs_for_extras::ExtrasType = IfExistingCompatExtras()
end
74 changes: 68 additions & 6 deletions test/dependencies.jl
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,82 @@ end
@testset "get_project_deps" begin
project = joinpath(@__DIR__, "deps", "Project.toml")

deps, dep_section = CompatHelper.get_project_deps(project; include_jll=true)
deps, dep_section = CompatHelper.get_project_deps(project; include_jll=true, open_prs_for_extras = AllExtras())
@test length(deps) == 6
@test issetequal([dep.package.name for dep in deps], ["Baz", "Bex_jll", "Car", "Foobar_jll", "LinearAlgebra", "Skix"])
@test issetequal(keys(dep_section), deps)
for (k, s) in pairs(dep_section)
if k.package.name ∈ ["Bex_jll", "Skix"]
@test s == "weakdeps"
elseif k.package.name ∈ ["Baz", "Car"]
@test s == "extras"
else # k.package.name ∈ ["Foobar_jll", "LinearAlgebra"]
@test s == "deps"
end
end

deps, dep_section = CompatHelper.get_project_deps(project; include_jll=false, open_prs_for_extras = AllExtras())
@test length(deps) == 4
@test issetequal([dep.package.name for dep in deps], ["Baz", "Car", "LinearAlgebra", "Skix"])
@test issetequal(keys(dep_section), deps)
for (k, s) in pairs(dep_section)
if k.package.name == "Skix"
@test s == "weakdeps"
elseif k.package.name ∈ ["Baz", "Car"]
@test s == "extras"
else # k.package.name == "LinearAlgebra"
@test s == "deps"
end
end

deps, dep_section = CompatHelper.get_project_deps(project; include_jll=true, open_prs_for_extras = IfExistingCompatExtras())
@test length(deps) == 5
@test issetequal([dep.package.name for dep in deps], ["Baz", "Bex_jll", "Foobar_jll", "LinearAlgebra", "Skix"])
@test issetequal(keys(dep_section), deps)
for (k, s) in pairs(dep_section)
if k.package.name ∈ ["Bex_jll", "Skix"]
@test s == "weakdeps"
else
elseif k.package.name == "Baz"
@test s == "extras"
else # k.package.name ∈ ["Foobar_jll", "LinearAlgebra"]
@test s == "deps"
end
end

deps, dep_section = CompatHelper.get_project_deps(project; include_jll=false)
deps, dep_section = CompatHelper.get_project_deps(project; include_jll=false, open_prs_for_extras = IfExistingCompatExtras())
@test length(deps) == 3
@test issetequal([dep.package.name for dep in deps], ["Baz", "LinearAlgebra", "Skix"])
@test issetequal(keys(dep_section), deps)
for (k, s) in pairs(dep_section)
if k.package.name == "Skix"
@test s == "weakdeps"
else
elseif k.package.name == "Baz"
@test s == "extras"
else # k.package.name == "LinearAlgebra"
@test s == "deps"
end
end

deps, dep_section = CompatHelper.get_project_deps(project; include_jll=true, open_prs_for_extras = NoExtras())
@test length(deps) == 4
@test issetequal([dep.package.name for dep in deps], ["Bex_jll", "Foobar_jll", "LinearAlgebra", "Skix"])
@test issetequal(keys(dep_section), deps)
for (k, s) in pairs(dep_section)
if k.package.name ∈ ["Bex_jll", "Skix"]
@test s == "weakdeps"
else # k.package.name ∈ ["Foobar_jll", "LinearAlgebra"]
@test s == "deps"
end
end

deps, dep_section = CompatHelper.get_project_deps(project; include_jll=false, open_prs_for_extras = NoExtras())
@test length(deps) == 2
@test issetequal([dep.package.name for dep in deps], ["LinearAlgebra", "Skix"])
@test issetequal(keys(dep_section), deps)
for (k, s) in pairs(dep_section)
if k.package.name == "Skix"
@test s == "weakdeps"
else # k.package.name == "LinearAlgebra"
@test s == "deps"
end
end
Expand Down Expand Up @@ -142,13 +200,17 @@ end
project_file = joinpath(pkgdir(CompatHelper), "Project.toml")

# Just for this test, we hardcode this list
unregistered_stdlibs = ["Base64", "Dates", "Pkg", "UUIDs"]
unregistered_stdlibs = ["Base64", "Dates", "Pkg", "Random", "Test", "UUIDs"]

@test ispath(project_file)
@test isfile(project_file)
for use_existing_registries in [true, false]
options = CompatHelper.Options(; use_existing_registries)
deps, _ = CompatHelper.get_project_deps(project_file)
deps, _ = CompatHelper.get_project_deps(
project_file;
include_jll=false,
open_prs_for_extras=IfExistingCompatExtras(),
)
for dep in deps
@test dep.latest_version === nothing
end
Expand Down
5 changes: 4 additions & 1 deletion test/deps/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ version = "1.0.0"

[deps]
Foobar_jll = "6ca821de-e512-569d-89d9-0b16ce691416"
Baz = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

[weakdeps]
Expand All @@ -14,6 +13,10 @@ Skix = "3db6da90-6ed3-11ee-0779-f549c8e3e90d"
[extensions]
Ext = ["Bex_jll", "Skix"]

[extras]
Baz = "ea10d353-3f73-51f8-a26c-33c1cb351aa5"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any particular reason for moving Baz from [deps] to [extras]?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was just not creative enough and hence initially only moved around things. Only later I noticed that an additional dependency is needed to cover all cases.

Car = "0add4187-88db-462b-bf06-da4bec59fd54"

[compat]
Foobar_jll = "1"
Baz = "1"
Expand Down
Loading