diff --git a/source/dub/dub.d b/source/dub/dub.d index 3c5c11c..042cdb0 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -592,8 +592,15 @@ } } + string[] missingDependenciesBeforeReinit = m_project.missingDependencies; m_project.reinit(); + if (!m_project.hasAllDependencies) { + auto resolvedDependencies = setDifference(missingDependenciesBeforeReinit, m_project.missingDependencies); + if (!resolvedDependencies.empty) + upgrade(options, m_project.missingDependencies); + } + if ((options & UpgradeOptions.select) && !(options & (UpgradeOptions.noSaveSelections | UpgradeOptions.dryRun))) m_project.saveSelections(); } diff --git a/source/dub/project.d b/source/dub/project.d index d01fe41..4315299 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -43,7 +43,7 @@ Package[] m_dependencies; Package[][Package] m_dependees; SelectedVersions m_selections; - bool m_hasAllDependencies; + string[] m_missingDependencies; string[string] m_overriddenConfigs; } @@ -114,7 +114,10 @@ to `selections`, or to use `Dub.upgrade` to automatically select all missing dependencies. */ - bool hasAllDependencies() const { return m_hasAllDependencies; } + bool hasAllDependencies() const { return m_missingDependencies.length == 0; } + + /// Sorted list of missing dependencies. + string[] missingDependencies() { return m_missingDependencies; } /** Allows iteration of the dependency tree in topological order */ @@ -318,7 +321,7 @@ void reinit() { m_dependencies = null; - m_hasAllDependencies = true; + m_missingDependencies = []; m_packageManager.refresh(false); void collectDependenciesRec(Package pack, int depth = 0) @@ -346,7 +349,7 @@ try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, subname, false); catch (Exception e) { logDiagnostic("%sError getting sub package %s: %s", indent, dep.name, e.msg); - if (is_desired) m_hasAllDependencies = false; + if (is_desired) m_missingDependencies ~= dep.name; continue; } } else if (m_selections.hasSelectedVersion(basename)) { @@ -386,7 +389,7 @@ if (!p) { logDiagnostic("%sMissing dependency %s %s of %s", indent, dep.name, vspec, pack.name); - if (is_desired) m_hasAllDependencies = false; + if (is_desired) m_missingDependencies ~= dep.name; continue; } @@ -403,6 +406,7 @@ } } collectDependenciesRec(m_rootPackage); + m_missingDependencies.sort(); } /// Returns the name of the root package. diff --git a/test/issue1524-maven-upgrade-dependency-tree.sh b/test/issue1524-maven-upgrade-dependency-tree.sh new file mode 100755 index 0000000..711cded --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +DIR=$(dirname "${BASH_SOURCE[0]}") + +. "$DIR"/common.sh + +PORT=$(($$ + 1024)) # PID + 1024 + +dub remove maven-dubpackage-a --non-interactive --version=* 2>/dev/null || true +dub remove maven-dubpackage-b --non-interactive --version=* 2>/dev/null || true + +"$DUB" build --single "$DIR"/test_registry.d +"$DIR"/test_registry --folder="$DIR/issue1524-maven-upgrade-dependency-tree" --port=$PORT & +PID=$! +sleep 1 +trap 'kill $PID 2>/dev/null || true' exit + +echo "Trying to download maven-dubpackage-a (1.0.5) with dependency to maven-dubpackage-b (1.0.6)" +"$DUB" upgrade --root "$DIR/issue1524-maven-upgrade-dependency-tree" --skip-registry=standard --registry=mvn+http://localhost:$PORT/maven/release/dubpackages + +if ! dub remove maven-dubpackage-a --non-interactive --version=1.0.5 2>/dev/null; then + die 'DUB did not install package "maven-dubpackage-a" from maven registry.' +fi + +if ! dub remove maven-dubpackage-b --non-interactive --version=1.0.6 2>/dev/null; then + die 'DUB did not install package "maven-dubpackage-b" from maven registry.' +fi + diff --git a/test/issue1524-maven-upgrade-dependency-tree.sh.min_frontend b/test/issue1524-maven-upgrade-dependency-tree.sh.min_frontend new file mode 100644 index 0000000..bb0a2e1 --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree.sh.min_frontend @@ -0,0 +1 @@ +2.076 diff --git a/test/issue1524-maven-upgrade-dependency-tree/.gitignore b/test/issue1524-maven-upgrade-dependency-tree/.gitignore new file mode 100644 index 0000000..304e955 --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/.gitignore @@ -0,0 +1,8 @@ +.dub +docs.json +__dummy.html +docs/ +*.exe +*.o +*.obj +*.lst diff --git a/test/issue1524-maven-upgrade-dependency-tree/.no_build b/test/issue1524-maven-upgrade-dependency-tree/.no_build new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/.no_build diff --git a/test/issue1524-maven-upgrade-dependency-tree/dub.json b/test/issue1524-maven-upgrade-dependency-tree/dub.json new file mode 100644 index 0000000..131a264 --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/dub.json @@ -0,0 +1,6 @@ +{ + "name": "test", + "dependencies": { + "maven-dubpackage-a": "~>1.0.5" + } +} \ No newline at end of file diff --git a/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-a/1.0.5/maven-dubpackage-a-1.0.5.zip b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-a/1.0.5/maven-dubpackage-a-1.0.5.zip new file mode 100644 index 0000000..6d5cfc9 --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-a/1.0.5/maven-dubpackage-a-1.0.5.zip Binary files differ diff --git a/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-a/maven-metadata.xml b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-a/maven-metadata.xml new file mode 100644 index 0000000..b3202ee --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-a/maven-metadata.xml @@ -0,0 +1,13 @@ + + + dubpackages + maven-dubpackage-a + + 1.0.5 + 1.0.5 + + 1.0.5 + + 20180317184845 + + \ No newline at end of file diff --git a/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-b/1.0.6/maven-dubpackage-b-1.0.6.zip b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-b/1.0.6/maven-dubpackage-b-1.0.6.zip new file mode 100644 index 0000000..c793c0b --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-b/1.0.6/maven-dubpackage-b-1.0.6.zip Binary files differ diff --git a/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-b/maven-metadata.xml b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-b/maven-metadata.xml new file mode 100644 index 0000000..f7dcd2a --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/maven/release/dubpackages/maven-dubpackage-b/maven-metadata.xml @@ -0,0 +1,13 @@ + + + dubpackages + maven-dubpackage-b + + 1.0.6 + 1.0.6 + + 1.0.6 + + 20180317184845 + + \ No newline at end of file diff --git a/test/issue1524-maven-upgrade-dependency-tree/source/app.d b/test/issue1524-maven-upgrade-dependency-tree/source/app.d new file mode 100644 index 0000000..ef93217 --- /dev/null +++ b/test/issue1524-maven-upgrade-dependency-tree/source/app.d @@ -0,0 +1 @@ +void main(){} \ No newline at end of file