diff --git a/source/dub/dub.d b/source/dub/dub.d index 2d31988..0290694 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -1264,16 +1264,21 @@ 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) + Dependency dspec = d.spec.mapToPath(pack.path); + + // if not upgrading, use the selected version + if (!(m_options & UpgradeOptions.upgrade) && m_selectedVersions && m_selectedVersions.hasSelectedVersion(dbasename)) + dspec = m_selectedVersions.getSelectedVersion(dbasename); + + // keep selected optional dependencies and avoid non-selected optional-default dependencies by default + if (m_selectedVersions && !m_selectedVersions.bare) { + if (dt == DependencyType.optionalDefault && !m_selectedVersions.hasSelectedVersion(dbasename)) dt = DependencyType.optional; - ret ~= TreeNodes(d.name, d.spec.mapToPath(pack.path), dt); - } else { - // keep already selected optional dependencies if possible - if (dt == DependencyType.optional) dt = DependencyType.optionalDefault; - ret ~= TreeNodes(d.name, m_selectedVersions.getSelectedVersion(dbasename), dt); + else if (dt == DependencyType.optional && m_selectedVersions.hasSelectedVersion(dbasename)) + dt = DependencyType.optionalDefault; } + + ret ~= TreeNodes(d.name, dspec, dt); } return ret.data; } diff --git a/test/issue672-upgrade-optional.sh b/test/issue672-upgrade-optional.sh new file mode 100755 index 0000000..8c16aa6 --- /dev/null +++ b/test/issue672-upgrade-optional.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +cd ${CURR_DIR}/issue672-upgrade-optional +rm -rf b/.dub +echo "{\"fileVersion\": 1,\"versions\": {\"dub\": \"1.0.0\"}}" > dub.selections.json +${DUB} upgrade || exit 1 + +if ! grep -c -e "\"dub\": \"1.1.0\"" dub.selections.json; then + echo "Dependency not upgraded." + exit 1 +fi diff --git a/test/issue672-upgrade-optional/.no_build b/test/issue672-upgrade-optional/.no_build new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue672-upgrade-optional/.no_build diff --git a/test/issue672-upgrade-optional/dub.sdl b/test/issue672-upgrade-optional/dub.sdl new file mode 100644 index 0000000..9b142c3 --- /dev/null +++ b/test/issue672-upgrade-optional/dub.sdl @@ -0,0 +1,2 @@ +name "b" +dependency "dub" version=">=1.0.0 <=1.1.0" optional=true diff --git a/test/issue672-upgrade-optional/dub.selections.json b/test/issue672-upgrade-optional/dub.selections.json new file mode 100644 index 0000000..44b07d4 --- /dev/null +++ b/test/issue672-upgrade-optional/dub.selections.json @@ -0,0 +1,6 @@ +{ + "fileVersion": 1, + "versions": { + "dub": "1.0.0" + } +}