diff --git a/changelog/path-dep-fix.dd b/changelog/path-dep-fix.dd new file mode 100644 index 0000000..2798729 --- /dev/null +++ b/changelog/path-dep-fix.dd @@ -0,0 +1,7 @@ +Path dependencies of path-based sub-packages have been fixed + +Path-based dependencies in path-based sub-packages in DUB v1.30.0 and 1.31.0 +have had regressed and didn't resolve properly. (dub.selections.json could be +used to workaround this issue before) + +From this release, these resolve properly again. diff --git a/source/dub/dependency.d b/source/dub/dependency.d index 2169b8f..95fc57d 100644 --- a/source/dub/dependency.d +++ b/source/dub/dependency.d @@ -215,7 +215,10 @@ return this.m_value.match!( (NativePath v) { if (v.empty || v.absolute) return this; - return Dependency(path ~ v); + auto ret = Dependency(path ~ v); + ret.m_default = m_default; + ret.m_optional = m_optional; + return ret; }, (Repository v) => this, (VersionRange v) => this, diff --git a/source/dub/dub.d b/source/dub/dub.d index e2dad1e..d321369 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -864,7 +864,7 @@ if (options & FetchOptions.printOnly) { if (existing && existing.version_ != ver) logInfo("A new version for %s is available (%s -> %s). Run \"%s\" to switch.", - packageId.color(Mode.bold), existing.version_, ver, + packageId.color(Mode.bold), existing, ver, text("dub upgrade ", packageId).color(Mode.bold)); return null; } @@ -983,7 +983,7 @@ try { remove(pack); } catch (Exception e) { - logError("Failed to remove %s %s: %s", package_id, pack.version_, e.msg); + logError("Failed to remove %s %s: %s", package_id, pack, e.msg); logInfo("Continuing with other packages (if any)."); } } @@ -1631,7 +1631,7 @@ protected override Dependency[] getSpecificConfigs(string pack, TreeNodes nodes) { if (!nodes.configs.path.empty || !nodes.configs.repository.empty) { - if (getPackage(pack, nodes.configs)) return [nodes.configs]; + if (getPackage(nodes.pack, nodes.configs)) return [nodes.configs]; else return null; } else return null; @@ -1676,7 +1676,7 @@ if (!d.spec.path.empty && absdeppath != desireddeppath) logWarn("Sub package %s, referenced by %s %s must be referenced using the path to its base package", - subpack.name, pack.name, pack.version_); + subpack.name, pack.name, pack); enforce(d.spec.path.empty || absdeppath == desireddeppath || absdeppath == altdeppath, format("Dependency from %s to %s uses wrong path: %s vs. %s", @@ -1746,11 +1746,11 @@ m_remotePackages[sp.name] = sp; return sp; } else { - logDiagnostic("Sub package %s doesn't exist in %s %s.", name, basename, dep.version_); + logDiagnostic("Sub package %s doesn't exist in %s %s.", name, basename, dep); return null; } } else { - logDiagnostic("External sub package %s %s not found.", name, dep.version_); + logDiagnostic("External sub package %s %s not found.", name, dep); return null; } } @@ -1805,7 +1805,7 @@ m_dub.fetch(rootpack, vers, m_dub.defaultPlacementLocation, fetchOpts, "need sub package description"); auto ret = m_dub.m_packageManager.getBestPackage(name, vers); if (!ret) { - logWarn("Package %s %s doesn't have a sub package %s", rootpack, dep.version_, name); + logWarn("Package %s %s doesn't have a sub package %s", rootpack, dep, name); return null; } m_remotePackages[key] = ret; diff --git a/source/dub/recipe/packagerecipe.d b/source/dub/recipe/packagerecipe.d index d282233..ce406bc 100644 --- a/source/dub/recipe/packagerecipe.d +++ b/source/dub/recipe/packagerecipe.d @@ -38,7 +38,8 @@ } /** - Returns the name of the top level package for a given (sub) package name. + Returns the name of the top level package for a given (sub) package name of + format `"basePackageName"` or `"basePackageName:subPackageName"`. In case of a top level package, the qualified name is returned unmodified. */ @@ -48,7 +49,8 @@ } /** - Returns the qualified sub package part of the given package name. + Returns the qualified sub package part of the given package name of format + `"basePackageName:subPackageName"`, or empty string if none. This is the part of the package name excluding the base package name. See also $(D getBasePackageName). diff --git a/test/issue2587-subpackage-dependency-resolution.sh b/test/issue2587-subpackage-dependency-resolution.sh new file mode 100755 index 0000000..bee1454 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -e + +. $(dirname "${BASH_SOURCE[0]}")/common.sh +cd "${CURR_DIR}/issue2587-subpackage-dependency-resolution/a" + +rm -f dub.selections.json +$DUB upgrade -v +$DUB run + +rm -f dub.selections.json +$DUB run diff --git a/test/issue2587-subpackage-dependency-resolution/.no_build b/test/issue2587-subpackage-dependency-resolution/.no_build new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/.no_build diff --git a/test/issue2587-subpackage-dependency-resolution/.no_run b/test/issue2587-subpackage-dependency-resolution/.no_run new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/.no_run diff --git a/test/issue2587-subpackage-dependency-resolution/.no_test b/test/issue2587-subpackage-dependency-resolution/.no_test new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/.no_test diff --git a/test/issue2587-subpackage-dependency-resolution/a/.gitignore b/test/issue2587-subpackage-dependency-resolution/a/.gitignore new file mode 100644 index 0000000..7b9e404 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/a/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/a +a.so +a.dylib +a.dll +a.a +a.lib +a-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/test/issue2587-subpackage-dependency-resolution/a/dub.json b/test/issue2587-subpackage-dependency-resolution/a/dub.json new file mode 100644 index 0000000..febb36a --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/a/dub.json @@ -0,0 +1,6 @@ +{ + "name": "a", + "dependencies": { + "b": {"path":"../b"} + } +} diff --git a/test/issue2587-subpackage-dependency-resolution/a/source/app.d b/test/issue2587-subpackage-dependency-resolution/a/source/app.d new file mode 100644 index 0000000..8d1ede9 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/a/source/app.d @@ -0,0 +1,7 @@ +import b, c; + +void main() +{ + doB(); + doC(); +} diff --git a/test/issue2587-subpackage-dependency-resolution/b/.gitignore b/test/issue2587-subpackage-dependency-resolution/b/.gitignore new file mode 100644 index 0000000..d699f7e --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/b/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/b +b.so +b.dylib +b.dll +b.a +b.lib +b-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/test/issue2587-subpackage-dependency-resolution/b/dub.json b/test/issue2587-subpackage-dependency-resolution/b/dub.json new file mode 100644 index 0000000..94a359b --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/b/dub.json @@ -0,0 +1,14 @@ +{ + "name": "b", + "dependencies": { + "b:sub":"*" + }, + "subPackages": [ + { + "name": "sub", + "dependencies": { + "c": {"path":"../c"} + } + } + ] +} diff --git a/test/issue2587-subpackage-dependency-resolution/b/source/b.d b/test/issue2587-subpackage-dependency-resolution/b/source/b.d new file mode 100644 index 0000000..ae8b14a --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/b/source/b.d @@ -0,0 +1,5 @@ +module b; + +void doB() +{ +} diff --git a/test/issue2587-subpackage-dependency-resolution/c/.gitignore b/test/issue2587-subpackage-dependency-resolution/c/.gitignore new file mode 100644 index 0000000..7c7bbbd --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/c/.gitignore @@ -0,0 +1,16 @@ +.dub +docs.json +__dummy.html +docs/ +/c +c.so +c.dylib +c.dll +c.a +c.lib +c-test-* +*.exe +*.pdb +*.o +*.obj +*.lst diff --git a/test/issue2587-subpackage-dependency-resolution/c/dub.json b/test/issue2587-subpackage-dependency-resolution/c/dub.json new file mode 100644 index 0000000..16e56e9 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/c/dub.json @@ -0,0 +1,3 @@ +{ + "name": "c" +} diff --git a/test/issue2587-subpackage-dependency-resolution/c/source/c.d b/test/issue2587-subpackage-dependency-resolution/c/source/c.d new file mode 100644 index 0000000..6886227 --- /dev/null +++ b/test/issue2587-subpackage-dependency-resolution/c/source/c.d @@ -0,0 +1,5 @@ +module c; + +void doC() +{ +}