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