diff --git a/source/dub/commandline.d b/source/dub/commandline.d index e4ed883..a391089 100644 --- a/source/dub/commandline.d +++ b/source/dub/commandline.d @@ -212,6 +212,7 @@ if (!cmd.skipDubInitialization) { if (options.bare) { dub = new Dub(Path(getcwd())); + dub.rootPath = Path(options.root_path); dub.defaultPlacementLocation = options.placementLocation; } else { // initialize DUB @@ -1088,14 +1089,14 @@ this() { this.name = "upgrade"; - this.argumentsPattern = "[]"; - this.description = "Forces an upgrade of all dependencies"; + this.argumentsPattern = "[]"; + this.description = "Forces an upgrade of the dependencies"; this.helpText = [ "Upgrades all dependencies of the package by querying the package registry(ies) for new versions.", "", - "This will also update the versions stored in the selections file ("~SelectedVersions.defaultFile~") accordingly.", + "This will update the versions stored in the selections file ("~SelectedVersions.defaultFile~") accordingly.", "", - "If a package specified, (only) that package will be upgraded. Otherwise all direct and indirect dependencies of the current package will get upgraded." + "If one or more package names are specified, only those dependencies will be upgraded. Otherwise all direct and indirect dependencies of the root package will get upgraded." ]; } @@ -1125,8 +1126,7 @@ auto options = UpgradeOptions.upgrade|UpgradeOptions.select; if (m_missingOnly) options &= ~UpgradeOptions.upgrade; if (m_prerelease) options |= UpgradeOptions.preRelease; - enforceUsage(free_args.length == 0, "Upgrading a specific package is not yet implemented."); - dub.upgrade(options); + dub.upgrade(options, free_args); return 0; } } diff --git a/source/dub/dub.d b/source/dub/dub.d index 896327a..3c64c0b 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -338,8 +338,15 @@ string getDefaultConfiguration(BuildPlatform platform, bool allow_non_library_configs = true) const { return m_project.getDefaultConfiguration(platform, allow_non_library_configs); } /** Attempts to upgrade the dependency selection of the loaded project. + + Params: + options = Flags that control how the upgrade is carried out + packages_to_upgrade = Optional list of packages. If this list + contains one or more packages, only those packages will + be upgraded. Otherwise, all packages will be upgraded at + once. */ - void upgrade(UpgradeOptions options) + void upgrade(UpgradeOptions options, string[] packages_to_upgrade = null) { // clear non-existent version selections if (!(options & UpgradeOptions.upgrade)) { @@ -371,11 +378,13 @@ } Dependency[string] versions; - if ((options & UpgradeOptions.useCachedResult) && m_project.isUpgradeCacheUpToDate()) { + if ((options & UpgradeOptions.useCachedResult) && m_project.isUpgradeCacheUpToDate() && !packages_to_upgrade.length) { logDiagnostic("Using cached upgrade results..."); versions = m_project.getUpgradeCache(); } else { auto resolver = new DependencyVersionResolver(this, options); + foreach (p; packages_to_upgrade) + resolver.addPackageToUpgrade(p); versions = resolver.resolve(m_project.rootPackage, m_project.selections); if (options & UpgradeOptions.useCachedResult) { logDiagnostic("Caching upgrade results..."); @@ -1176,6 +1185,7 @@ Package[string] m_remotePackages; SelectedVersions m_selectedVersions; Package m_rootPackage; + bool[string] m_packagesToUpgrade; } @@ -1185,6 +1195,11 @@ m_options = options; } + void addPackageToUpgrade(string name) + { + m_packagesToUpgrade[name] = true; + } + Dependency[string] resolve(Package root, SelectedVersions selected_versions) { m_rootPackage = root; @@ -1192,12 +1207,17 @@ return super.resolve(TreeNode(root.name, Dependency(root.version_)), (m_options & UpgradeOptions.printUpgradesOnly) == 0); } + protected bool isFixedPackage(string pack) + { + return m_packagesToUpgrade !is null && pack !in m_packagesToUpgrade; + } + protected override Dependency[] getAllConfigs(string pack) { if (auto pvers = pack in m_packageVersions) return *pvers; - if (!(m_options & UpgradeOptions.upgrade) && m_selectedVersions.hasSelectedVersion(pack)) { + if ((!(m_options & UpgradeOptions.upgrade) || isFixedPackage(pack)) && m_selectedVersions.hasSelectedVersion(pack)) { auto ret = [m_selectedVersions.getSelectedVersion(pack)]; logDiagnostic("Using fixed selection %s %s", pack, ret[0]); m_packageVersions[pack] = ret; diff --git a/test/issue1024-selective-upgrade.sh b/test/issue1024-selective-upgrade.sh new file mode 100755 index 0000000..a159216 --- /dev/null +++ b/test/issue1024-selective-upgrade.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +cd ${CURR_DIR}/issue1024-selective-upgrade +echo "{\"fileVersion\": 1,\"versions\": {\"a\": \"1.0.0\", \"b\": \"1.0.0\"}}" > main/dub.selections.json +$DUB upgrade --bare --root=main a || exit 1 + +if ! grep -c -e "\"a\": \"1.0.1\"" main/dub.selections.json; then + echo "Specified dependency was not upgraded." + exit 1 +fi + +if grep -c -e "\"b\": \"1.0.1\"" main/dub.selections.json; then + echo "Non-specified dependency got upgraded." + exit 1 +fi diff --git a/test/issue1024-selective-upgrade/.no_build b/test/issue1024-selective-upgrade/.no_build new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/issue1024-selective-upgrade/.no_build diff --git a/test/issue1024-selective-upgrade/a-1.0.0/dub.sdl b/test/issue1024-selective-upgrade/a-1.0.0/dub.sdl new file mode 100644 index 0000000..7ff9fa1 --- /dev/null +++ b/test/issue1024-selective-upgrade/a-1.0.0/dub.sdl @@ -0,0 +1,2 @@ +name "a" +version "1.0.0" diff --git a/test/issue1024-selective-upgrade/a-1.0.1/dub.sdl b/test/issue1024-selective-upgrade/a-1.0.1/dub.sdl new file mode 100644 index 0000000..5c8a407 --- /dev/null +++ b/test/issue1024-selective-upgrade/a-1.0.1/dub.sdl @@ -0,0 +1,2 @@ +name "a" +version "1.0.1" diff --git a/test/issue1024-selective-upgrade/b-1.0.0/dub.sdl b/test/issue1024-selective-upgrade/b-1.0.0/dub.sdl new file mode 100644 index 0000000..5597559 --- /dev/null +++ b/test/issue1024-selective-upgrade/b-1.0.0/dub.sdl @@ -0,0 +1,2 @@ +name "b" +version "1.0.0" diff --git a/test/issue1024-selective-upgrade/b-1.0.1/dub.sdl b/test/issue1024-selective-upgrade/b-1.0.1/dub.sdl new file mode 100644 index 0000000..5e0c01a --- /dev/null +++ b/test/issue1024-selective-upgrade/b-1.0.1/dub.sdl @@ -0,0 +1,2 @@ +name "b" +version "1.0.1" diff --git a/test/issue1024-selective-upgrade/main/dub.sdl b/test/issue1024-selective-upgrade/main/dub.sdl new file mode 100644 index 0000000..a9da177 --- /dev/null +++ b/test/issue1024-selective-upgrade/main/dub.sdl @@ -0,0 +1,3 @@ +name "test" +dependency "a" version="~>1.0.0" +dependency "b" version="~>1.0.0"