Skip to content

Commit 98a52b1

Browse files
authored
Backport fixes for conflicts between [workspace] and [sources] relative paths to release-1.12 (#4513)
1 parent 499e7d3 commit 98a52b1

File tree

7 files changed

+93
-33
lines changed

7 files changed

+93
-33
lines changed

.github/workflows/test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ jobs:
3737
pkg-server:
3838
- "pkg.julialang.org" # Default to this for all except specific cases
3939
julia-version:
40-
- 'nightly'
40+
- '1.12-nightly'
4141
exclude:
4242
- os: ubuntu-latest
4343
julia-arch: aarch64
@@ -50,11 +50,11 @@ jobs:
5050
include:
5151
- os: ubuntu-latest
5252
julia-arch: 'x64'
53-
julia-version: 'nightly'
53+
julia-version: '1.12-nightly'
5454
pkg-server: ""
5555
- os: ubuntu-latest
5656
julia-arch: 'x64'
57-
julia-version: 'nightly'
57+
julia-version: '1.12-nightly'
5858
pkg-server: "pkg.julialang.org"
5959
steps:
6060
- name: Set git to use LF and fix TEMP on windows
@@ -95,7 +95,7 @@ jobs:
9595
- uses: julia-actions/setup-julia@v2
9696
with:
9797
# version: '1.6'
98-
version: 'nightly'
98+
version: '1.12-nightly'
9999
- name: Generate docs
100100
run: |
101101
julia --project --color=yes -e 'using Pkg; Pkg.activate("docs"); Pkg.instantiate();'

src/API.jl

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -191,15 +191,42 @@ function update_source_if_set(env, pkg)
191191
project = env.project
192192
source = get(project.sources, pkg.name, nothing)
193193
if source !== nothing
194-
# This should probably not modify the dicts directly...
195-
if pkg.repo.source !== nothing
196-
source["url"] = pkg.repo.source
194+
if pkg.repo == GitRepo()
195+
delete!(project.sources, pkg.name)
196+
else
197+
# This should probably not modify the dicts directly...
198+
if pkg.repo.source !== nothing
199+
source["url"] = pkg.repo.source
200+
delete!(source, "path")
201+
end
202+
if pkg.repo.rev !== nothing
203+
source["rev"] = pkg.repo.rev
204+
delete!(source, "path")
205+
end
206+
if pkg.repo.subdir !== nothing
207+
source["subdir"] = pkg.repo.subdir
208+
end
209+
if pkg.path !== nothing
210+
source["path"] = pkg.path
211+
delete!(source, "url")
212+
delete!(source, "rev")
213+
end
197214
end
198-
if pkg.repo.rev !== nothing
199-
source["rev"] = pkg.repo.rev
215+
if pkg.subdir !== nothing
216+
source["subdir"] = pkg.subdir
217+
end
218+
path, repo = get_path_repo(project, env.project_file, env.manifest_file, pkg.name)
219+
if path !== nothing
220+
pkg.path = path
221+
end
222+
if repo.source !== nothing
223+
pkg.repo.source = repo.source
200224
end
201-
if pkg.path !== nothing
202-
source["path"] = pkg.path
225+
if repo.rev !== nothing
226+
pkg.repo.rev = repo.rev
227+
end
228+
if repo.subdir !== nothing
229+
pkg.repo.subdir = repo.subdir
203230
end
204231
end
205232

@@ -347,14 +374,14 @@ end
347374
function append_all_pkgs!(pkgs, ctx, mode)
348375
if mode == PKGMODE_PROJECT || mode == PKGMODE_COMBINED
349376
for (name::String, uuid::UUID) in ctx.env.project.deps
350-
path, repo = get_path_repo(ctx.env.project, name)
351-
push!(pkgs, PackageSpec(name=name, uuid=uuid, path=path, repo=repo))
377+
path, repo = get_path_repo(ctx.env.project, ctx.env.project_file, ctx.env.manifest_file, name)
378+
push!(pkgs, PackageSpec(name = name, uuid = uuid, path = path, repo = repo))
352379
end
353380
end
354381
if mode == PKGMODE_MANIFEST || mode == PKGMODE_COMBINED
355382
for (uuid, entry) in ctx.env.manifest
356-
path, repo = get_path_repo(ctx.env.project, entry.name)
357-
push!(pkgs, PackageSpec(name=entry.name, uuid=uuid, path=path, repo=repo))
383+
path, repo = get_path_repo(ctx.env.project, ctx.env.project_file, ctx.env.manifest_file, entry.name)
384+
push!(pkgs, PackageSpec(name = entry.name, uuid = uuid, path = path, repo = repo))
358385
end
359386
end
360387
return
@@ -425,6 +452,7 @@ function pin(ctx::Context, pkgs::Vector{PackageSpec}; all_pkgs::Bool=false, kwar
425452
pkgerror("pinning a package requires a single version, not a versionrange")
426453
end
427454
end
455+
update_source_if_set(ctx.env, pkg)
428456
end
429457

430458
project_deps_resolve!(ctx.env, pkgs)

src/Operations.jl

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ function load_project_deps(project::Project, project_file::String, manifest::Man
114114

115115
for (name::String, uuid::UUID) in project.deps
116116
findfirst(pkg -> pkg.uuid == uuid, pkgs) === nothing || continue # do not duplicate packages
117-
path, repo = get_path_repo(project, name)
117+
path, repo = get_path_repo(project, project_file, manifest_file, name)
118118
entry = manifest_info(manifest, uuid)
119119
push!(pkgs_direct, entry === nothing ?
120120
PackageSpec(;uuid, name, path, repo) :
@@ -155,7 +155,7 @@ function load_all_deps(env::EnvCache, pkgs::Vector{PackageSpec}=PackageSpec[];
155155
pkgs = load_manifest_deps(env.manifest, pkgs; preserve=preserve)
156156
# Sources takes presedence over the manifest...
157157
for pkg in pkgs
158-
path, repo = get_path_repo(env.project, pkg.name)
158+
path, repo = get_path_repo(env.project, env.project_file, env.manifest_file, pkg.name)
159159
if path !== nothing
160160
pkg.path = path
161161
end
@@ -319,7 +319,7 @@ function reset_all_compat!(proj::Project)
319319
return nothing
320320
end
321321

322-
function collect_project(pkg::Union{PackageSpec, Nothing}, path::String, julia_version)
322+
function collect_project(pkg::Union{PackageSpec, Nothing}, path::String, manifest_file::String, julia_version)
323323
deps = PackageSpec[]
324324
weakdeps = Set{UUID}()
325325
project_file = projectfile_path(path; strict=true)
@@ -329,9 +329,9 @@ function collect_project(pkg::Union{PackageSpec, Nothing}, path::String, julia_v
329329
pkgerror("julia version requirement for package at `$path` not satisfied: compat entry \"julia = $(get_compat_str(project, "julia"))\" does not include Julia version $julia_version")
330330
end
331331
for (name, uuid) in project.deps
332-
path, repo = get_path_repo(project, name)
332+
dep_path, repo = get_path_repo(project, project_file, manifest_file, name)
333333
vspec = get_compat(project, name)
334-
push!(deps, PackageSpec(name=name, uuid=uuid, version=vspec, path=path, repo=repo))
334+
push!(deps, PackageSpec(name = name, uuid = uuid, version = vspec, path = dep_path, repo = repo))
335335
end
336336
for (name, uuid) in project.weakdeps
337337
vspec = get_compat(project, name)
@@ -390,15 +390,15 @@ function collect_fixed!(env::EnvCache, pkgs::Vector{PackageSpec}, names::Dict{UU
390390
weak_map = Dict{UUID,Set{UUID}}()
391391

392392
uuid = Types.project_uuid(env)
393-
deps, weakdeps = collect_project(env.pkg, dirname(env.project_file), julia_version)
393+
deps, weakdeps = collect_project(env.pkg, dirname(env.project_file), env.manifest_file, julia_version)
394394
deps_map[uuid] = deps
395395
weak_map[uuid] = weakdeps
396396
names[uuid] = env.pkg === nothing ? "project" : env.pkg.name
397397

398398
for (path, project) in env.workspace
399399
uuid = Types.project_uuid(project, path)
400-
pkg = project.name === nothing ? nothing : PackageSpec(name=project.name, uuid=uuid)
401-
deps, weakdeps = collect_project(pkg, path, julia_version)
400+
pkg = project.name === nothing ? nothing : PackageSpec(name = project.name, uuid = uuid)
401+
deps, weakdeps = collect_project(pkg, path, env.manifest_file, julia_version)
402402
deps_map[Types.project_uuid(env)] = deps
403403
weak_map[Types.project_uuid(env)] = weakdeps
404404
names[uuid] = project.name === nothing ? "project" : project.name
@@ -418,7 +418,7 @@ function collect_fixed!(env::EnvCache, pkgs::Vector{PackageSpec}, names::Dict{UU
418418
if !isdir(path)
419419
pkgerror("expected package $(err_rep(pkg)) to exist at path `$path`")
420420
end
421-
deps, weakdeps = collect_project(pkg, path, julia_version)
421+
deps, weakdeps = collect_project(pkg, path, env.manifest_file, julia_version)
422422
deps_map[pkg.uuid] = deps
423423
weak_map[pkg.uuid] = weakdeps
424424
end
@@ -1883,7 +1883,7 @@ function up(ctx::Context, pkgs::Vector{PackageSpec}, level::UpgradeLevel;
18831883
# TODO check all pkg.version == VersionSpec()
18841884
# set version constraints according to `level`
18851885
for pkg in pkgs
1886-
source_path, source_repo = get_path_repo(ctx.env.project, pkg.name)
1886+
source_path, source_repo = get_path_repo(ctx.env.project, ctx.env.project_file, ctx.env.manifest_file, pkg.name)
18871887
entry = manifest_info(ctx.env.manifest, pkg.uuid)
18881888
new = up_load_versions!(ctx, pkg, entry, source_path, source_repo, level)
18891889
new && push!(new_git, pkg.uuid) #TODO put download + push! in utility function
@@ -2100,7 +2100,8 @@ end
21002100
function abspath!(env::EnvCache, project::Project)
21012101
for (key, entry) in project.sources
21022102
if haskey(entry, "path")
2103-
entry["path"] = project_rel_path(env, entry["path"])
2103+
# Paths in project sources are project-relative, so join with project_file dir, not manifest_file dir
2104+
entry["path"] = normpath(joinpath(dirname(env.project_file), entry["path"]))
21042105
end
21052106
end
21062107
return project

src/Types.jl

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,22 @@ function EnvCache(env::Union{Nothing,String}=nothing)
434434
return env′
435435
end
436436

437+
# Convert a path from project-relative to manifest-relative
438+
# If path is absolute, returns it as-is
439+
function project_path_to_manifest_path(project_file::String, manifest_file::String, path::String)
440+
isabspath(path) && return path
441+
abs_path = Pkg.safe_realpath(joinpath(dirname(project_file), path))
442+
return relpath(abs_path, Pkg.safe_realpath(dirname(manifest_file)))
443+
end
444+
445+
# Convert a path from manifest-relative to project-relative
446+
# If path is absolute, returns it as-is
447+
function manifest_path_to_project_path(project_file::String, manifest_file::String, path::String)
448+
isabspath(path) && return path
449+
abs_path = Pkg.safe_realpath(joinpath(dirname(manifest_file), path))
450+
return relpath(abs_path, Pkg.safe_realpath(dirname(project_file)))
451+
end
452+
437453
include("project.jl")
438454
include("manifest.jl")
439455

@@ -1249,7 +1265,7 @@ function write_env(env::EnvCache; update_undo=true,
12491265
skip_writing_project::Bool=false)
12501266
# Verify that the generated manifest is consistent with `sources`
12511267
for (pkg, uuid) in env.project.deps
1252-
path, repo = get_path_repo(env.project, pkg)
1268+
path, repo = get_path_repo(env.project, env.project_file, env.manifest_file, pkg)
12531269
entry = manifest_info(env.manifest, uuid)
12541270
if path !== nothing
12551271
@assert normpath(entry.path) == normpath(path)
@@ -1262,6 +1278,19 @@ function write_env(env::EnvCache; update_undo=true,
12621278
@assert entry.repo.subdir == repo.subdir
12631279
end
12641280
end
1281+
if entry !== nothing
1282+
if entry.path !== nothing
1283+
# Convert path from manifest-relative to project-relative before writing
1284+
project_relative_path = manifest_path_to_project_path(env.project_file, env.manifest_file, entry.path)
1285+
env.project.sources[pkg] = Dict("path" => project_relative_path)
1286+
elseif entry.repo != GitRepo()
1287+
d = Dict{String, String}()
1288+
entry.repo.source !== nothing && (d["url"] = entry.repo.source)
1289+
entry.repo.rev !== nothing && (d["rev"] = entry.repo.rev)
1290+
entry.repo.subdir !== nothing && (d["subdir"] = entry.repo.subdir)
1291+
env.project.sources[pkg] = d
1292+
end
1293+
end
12651294
end
12661295
if (env.project != env.original_project) && (!skip_writing_project)
12671296
write_project(env)

src/project.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
listed_deps(project::Project; include_weak::Bool) =
55
vcat(collect(keys(project.deps)), collect(keys(project.extras)), include_weak ? collect(keys(project.weakdeps)) : String[])
66

7-
function get_path_repo(project::Project, name::String)
7+
function get_path_repo(project::Project, project_file::String, manifest_file::String, name::String)
88
source = get(project.sources, name, nothing)
99
if source === nothing
1010
return nothing, GitRepo()
@@ -17,6 +17,10 @@ function get_path_repo(project::Project, name::String)
1717
pkgerror("`path` and `url` are conflicting specifications")
1818
end
1919
repo = GitRepo(url, rev, subdir)
20+
# Convert path from project-relative to manifest-relative
21+
if path !== nothing
22+
path = project_path_to_manifest_path(project_file, manifest_file, path)
23+
end
2024
return path, repo
2125
end
2226

test/sources.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ temp_pkg_dir() do project_path
2121
cp("Project.toml.bak", "Project.toml"; force=true)
2222
cp("BadManifest.toml", "Manifest.toml"; force=true)
2323
Pkg.resolve()
24-
@test Pkg.project().sources["Example"] == Dict("url" => "https://github.com/JuliaLang/Example.jl")
24+
@test Pkg.project().sources["Example"] == Dict("rev" => "master", "url" => "https://github.com/JuliaLang/Example.jl")
2525
@test Pkg.project().sources["LocalPkg"] == Dict("path" => "LocalPkg")
2626
end
2727
end

test/workspaces.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ temp_pkg_dir() do project_path
2525
Pkg.develop(path="PrivatePackage")
2626
d = TOML.parsefile("Project.toml")
2727
d["workspace"] = Dict("projects" => ["test", "docs", "benchmarks", "PrivatePackage"])
28-
abs_path = abspath("PrivatePackage") # TODO: Make relative after #3842 is fixed
29-
d["sources"] = Dict("PrivatePackage" => Dict("path" => abs_path))
28+
d["sources"] = Dict("PrivatePackage" => Dict("path" => "PrivatePackage"))
3029
Pkg.Types.write_project(d, "Project.toml")
3130
write("src/MonorepoSub.jl", """
3231
module MonorepoSub
@@ -98,8 +97,7 @@ temp_pkg_dir() do project_path
9897
Pkg.generate("TestSpecificPackage")
9998
Pkg.develop(path="TestSpecificPackage")
10099
d = TOML.parsefile("test/Project.toml")
101-
abs_pkg = abspath("TestSpecificPackage") # TODO: Make relative after #3842 is fixed
102-
d["sources"] = Dict("TestSpecificPackage" => Dict("path" => abs_pkg))
100+
d["sources"] = Dict("TestSpecificPackage" => Dict("path" => "../TestSpecificPackage"))
103101
Pkg.Types.write_project(d, "test/Project.toml")
104102

105103
@test !isfile("test/Manifest.toml")

0 commit comments

Comments
 (0)