diff --git a/src/API.jl b/src/API.jl index 103e7c99f3..d11ce3d453 100644 --- a/src/API.jl +++ b/src/API.jl @@ -187,46 +187,57 @@ for f in (:develop, :add, :rm, :up, :pin, :free, :test, :build, :status, :why, : end end -function update_source_if_set(project, pkg) +function update_source_if_set(env, pkg) + project = env.project source = get(project.sources, pkg.name, nothing) - source === nothing && return - if pkg.repo == GitRepo() - delete!(project.sources, pkg.name) - else - # This should probably not modify the dicts directly... - if pkg.repo.source !== nothing - source["url"] = pkg.repo.source - delete!(source, "path") + if source !== nothing + if pkg.repo == GitRepo() + delete!(project.sources, pkg.name) + else + # This should probably not modify the dicts directly... + if pkg.repo.source !== nothing + source["url"] = pkg.repo.source + delete!(source, "path") + end + if pkg.repo.rev !== nothing + source["rev"] = pkg.repo.rev + delete!(source, "path") + end + if pkg.repo.subdir !== nothing + source["subdir"] = pkg.repo.subdir + end + if pkg.path !== nothing + source["path"] = pkg.path + delete!(source, "url") + delete!(source, "rev") + end end - if pkg.repo.rev !== nothing - source["rev"] = pkg.repo.rev - delete!(source, "path") + if pkg.subdir !== nothing + source["subdir"] = pkg.subdir end - if pkg.repo.subdir !== nothing - source["subdir"] = pkg.repo.subdir + path, repo = get_path_repo(project, pkg.name) + if path !== nothing + pkg.path = path end - if pkg.path !== nothing - source["path"] = pkg.path - delete!(source, "url") - delete!(source, "rev") + if repo.source !== nothing + pkg.repo.source = repo.source + end + if repo.rev !== nothing + pkg.repo.rev = repo.rev + end + if repo.subdir !== nothing + pkg.repo.subdir = repo.subdir end end - if pkg.subdir !== nothing - source["subdir"] = pkg.subdir - end - path, repo = get_path_repo(project, pkg.name) - if path !== nothing - pkg.path = path - end - if repo.source !== nothing - pkg.repo.source = repo.source - end - if repo.rev !== nothing - pkg.repo.rev = repo.rev - end - if repo.subdir !== nothing - pkg.repo.subdir = repo.subdir + + # Packages in manifest should have their paths set to the path in the manifest + for (path, wproj) in env.workspace + if wproj.uuid == pkg.uuid + pkg.path = Types.relative_project_path(env.manifest_file, dirname(path)) + break + end end + return end function develop(ctx::Context, pkgs::Vector{PackageSpec}; shared::Bool=true, @@ -268,7 +279,7 @@ function develop(ctx::Context, pkgs::Vector{PackageSpec}; shared::Bool=true, if length(findall(x -> x.uuid == pkg.uuid, pkgs)) > 1 pkgerror("it is invalid to specify multiple packages with the same UUID: $(err_rep(pkg))") end - update_source_if_set(ctx.env.project, pkg) + update_source_if_set(ctx.env, pkg) end Operations.develop(ctx, pkgs, new_git; preserve=preserve, platform=platform) @@ -322,7 +333,7 @@ function add(ctx::Context, pkgs::Vector{PackageSpec}; preserve::PreserveLevel=Op if length(findall(x -> x.uuid == pkg.uuid, pkgs)) > 1 pkgerror("it is invalid to specify multiple packages with the same UUID: $(err_rep(pkg))") end - update_source_if_set(ctx.env.project, pkg) + update_source_if_set(ctx.env, pkg) end Operations.add(ctx, pkgs, new_git; allow_autoprecomp, preserve, platform, target) @@ -401,7 +412,7 @@ function up(ctx::Context, pkgs::Vector{PackageSpec}; ensure_resolved(ctx, ctx.env.manifest, pkgs) end for pkg in pkgs - update_source_if_set(ctx.env.project, pkg) + update_source_if_set(ctx.env, pkg) end Operations.up(ctx, pkgs, level; skip_writing_project, preserve) return @@ -440,7 +451,7 @@ function pin(ctx::Context, pkgs::Vector{PackageSpec}; all_pkgs::Bool=false, kwar pkgerror("pinning a package requires a single version, not a versionrange") end end - update_source_if_set(ctx.env.project, pkg) + update_source_if_set(ctx.env, pkg) end project_deps_resolve!(ctx.env, pkgs) diff --git a/test/test_packages/WorkspacePathResolution/Project.toml b/test/test_packages/WorkspacePathResolution/Project.toml new file mode 100644 index 0000000000..793ff0e389 --- /dev/null +++ b/test/test_packages/WorkspacePathResolution/Project.toml @@ -0,0 +1,5 @@ +[workspace] +projects = [ + "SubProjectA", + "SubProjectB", +] \ No newline at end of file diff --git a/test/test_packages/WorkspacePathResolution/SubProjectA/Project.toml b/test/test_packages/WorkspacePathResolution/SubProjectA/Project.toml new file mode 100644 index 0000000000..e5aa2bbe50 --- /dev/null +++ b/test/test_packages/WorkspacePathResolution/SubProjectA/Project.toml @@ -0,0 +1,9 @@ +name = "SubProjectA" +uuid = "87654321-4321-4321-4321-210987654321" +version = "0.1.0" + +[deps] +SubProjectB = "12345678-1234-1234-1234-123456789012" + +[sources] +SubProjectB = {path = "SubProjectB"} diff --git a/test/test_packages/WorkspacePathResolution/SubProjectA/src/SubProjectA.jl b/test/test_packages/WorkspacePathResolution/SubProjectA/src/SubProjectA.jl new file mode 100644 index 0000000000..06b4efa7b4 --- /dev/null +++ b/test/test_packages/WorkspacePathResolution/SubProjectA/src/SubProjectA.jl @@ -0,0 +1,7 @@ +module SubProjectA + +using SubProjectB + +greet() = "Hello from SubProjectA! " * SubProjectB.greet() + +end \ No newline at end of file diff --git a/test/test_packages/WorkspacePathResolution/SubProjectB/Project.toml b/test/test_packages/WorkspacePathResolution/SubProjectB/Project.toml new file mode 100644 index 0000000000..f989c45989 --- /dev/null +++ b/test/test_packages/WorkspacePathResolution/SubProjectB/Project.toml @@ -0,0 +1,3 @@ +name = "SubProjectB" +uuid = "12345678-1234-1234-1234-123456789012" +version = "0.1.0" \ No newline at end of file diff --git a/test/test_packages/WorkspacePathResolution/SubProjectB/src/SubProjectB.jl b/test/test_packages/WorkspacePathResolution/SubProjectB/src/SubProjectB.jl new file mode 100644 index 0000000000..342bdf6c94 --- /dev/null +++ b/test/test_packages/WorkspacePathResolution/SubProjectB/src/SubProjectB.jl @@ -0,0 +1,5 @@ +module SubProjectB + +greet() = "Hello from SubProjectB!" + +end \ No newline at end of file diff --git a/test/workspaces.jl b/test/workspaces.jl index 33b75d2baa..ba848246f0 100644 --- a/test/workspaces.jl +++ b/test/workspaces.jl @@ -163,4 +163,19 @@ end end end +@testset "workspace path resolution issue #4222" begin + mktempdir() do dir + path = copy_test_package(dir, "WorkspacePathResolution") + cd(path) do + with_current_env() do + # First resolve SubProjectB (non-root project) without existing Manifest + Pkg.activate("SubProjectB") + @test !isfile("Manifest.toml") + # Should be able to find SubProjectA and succeed + Pkg.update() + end + end + end +end + end # module