diff --git a/source/dub/dub.d b/source/dub/dub.d index a18857d..403d3e4 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -1084,11 +1084,22 @@ continue; } - if (dspec.optional && !m_dub.packageManager.getFirstPackage(dname)) - continue; - if (m_options & UpgradeOptions.upgrade || !m_selectedVersions || !m_selectedVersions.hasSelectedVersion(dbasename)) - ret ~= TreeNodes(dname, dspec.mapToPath(pack.path)); - else ret ~= TreeNodes(dname, m_selectedVersions.getSelectedVersion(dbasename)); + DependencyType dt; + if (dspec.optional) { + if (dspec.default_) dt = DependencyType.optionalDefault; + else dt = DependencyType.optional; + } else dt = DependencyType.required; + + if (m_options & UpgradeOptions.upgrade || !m_selectedVersions || !m_selectedVersions.hasSelectedVersion(dbasename)) { + // keep deselected dependencies deselected by default + if (m_selectedVersions && !m_selectedVersions.bare && dt == DependencyType.optionalDefault) + dt = DependencyType.optional; + ret ~= TreeNodes(dname, dspec.mapToPath(pack.path), dt); + } else { + // keep already selected optional dependencies if possible + if (dt == DependencyType.optional) dt = DependencyType.optionalDefault; + ret ~= TreeNodes(dname, m_selectedVersions.getSelectedVersion(dbasename), dt); + } } return ret.data; } diff --git a/source/dub/project.d b/source/dub/project.d index dfb75e4..bc5bcce 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -1230,6 +1230,7 @@ enum FileVersion = 1; Selected[string] m_selections; bool m_dirty = false; // has changes since last save + bool m_bare = true; } enum defaultFile = "dub.selections.json"; @@ -1247,12 +1248,16 @@ auto json = jsonFromFile(path); deserialize(json); m_dirty = false; + m_bare = false; } @property string[] selectedPackages() const { return m_selections.keys; } @property bool dirty() const { return m_dirty; } + /// Determine if this set of selections is empty and has not been saved to disk. + @property bool bare() const { return m_bare && !m_dirty; } + void clear() { m_selections = null; @@ -1310,6 +1315,7 @@ file.writePrettyJsonString(json); file.put('\n'); m_dirty = false; + m_bare = false; } static Json dependencyToJson(Dependency d)