diff --git a/source/dub/dub.d b/source/dub/dub.d index bf94ccf..b4e0f24 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -672,7 +672,7 @@ return null; } foreach (dname, dspec; pack.dependencies) { - auto dbasename = getBasePackage(dname); + auto dbasename = getBasePackageName(dname); if (dspec.optional && !m_dub.packageManager.getFirstPackage(dname)) continue; if (m_options & UpdateOptions.upgrade || !m_selectedVersions || !m_selectedVersions.hasSelectedVersion(dbasename)) diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d index 31b4652..97a911f 100644 --- a/source/dub/packagemanager.d +++ b/source/dub/packagemanager.d @@ -731,16 +731,16 @@ // Additionally to the internally defined subpackages, whose metadata // is loaded with the main package.json, load all externally defined // packages after the package is available with all the data. - foreach ( sub_path; pack.exportedPackages ) { + foreach (sub_path; pack.exportedPackages) { auto path = pack.path ~ sub_path; - if ( !existsFile(path) ) { + if (!existsFile(path)) { logError("Package %s declared a sub-package, definition file is missing: %s", pack.name, path.toNativeString()); continue; } // Add the subpackage. try { dst_repos ~= new Package(path, pack); - } catch( Exception e ){ + } catch (Exception e) { logError("Package '%s': Failed to load sub-package in %s, error: %s", pack.name, path.toNativeString(), e.msg); logDiagnostic("Full error: %s", e.toString().sanitize()); } diff --git a/source/dub/project.d b/source/dub/project.d index 0e92892..d156c53 100644 --- a/source/dub/project.d +++ b/source/dub/project.d @@ -204,15 +204,25 @@ } if (!p) { - if (!m_selectedVersions.hasSelectedVersion(name)) { - logDiagnostic("Version selection for dependency %s of %s is missing.", - name, pack.name); - continue; + auto basename = getBasePackageName(name); + if (basename == m_rootPackage.basePackage.name) { + vspec = Dependency(m_rootPackage.ver); + try p = m_rootPackage.getSubPackage(getSubPackageName(name)); + catch (Exception e) { + logDiagnostic("Error getting sub package %s: %s", name, e.msg); + continue; + } + } else { + if (!m_selectedVersions.hasSelectedVersion(basename)) { + logDiagnostic("Version selection for dependency %s (%s) of %s is missing.", + basename, name, pack.name); + continue; + } + + vspec = m_selectedVersions.selectedVersion(basename); + + p = m_packageManager.getBestPackage(name, vspec); } - - vspec = m_selectedVersions.selectedVersion(name); - - p = m_packageManager.getBestPackage(name, vspec); } if (!p) { @@ -517,6 +527,8 @@ void saveSelections() { assert(m_selectedVersions !is null, "Cannot save selections for non-disk based project (has no selections)."); + if (m_selectedVersions.hasSelectedVersion(m_rootPackage.basePackage.name)) + m_selectedVersions.deselectVersion(m_rootPackage.basePackage.name); m_selectedVersions.save(m_rootPackage.path ~ SelectedVersions.defaultFile); } @@ -779,6 +791,11 @@ m_selectedVersions[packageId] = Selected(version_/*, issuer*/); } + void deselectVersion(string package_id) + { + m_selectedVersions.remove(package_id); + } + bool hasSelectedVersion(string packageId) const { return (packageId in m_selectedVersions) !is null;