From 470f83ef1bf475943922d0308c4eef353d6c31d2 Mon Sep 17 00:00:00 2001 From: ahall Date: Mon, 20 Mar 2017 17:37:38 -0400 Subject: [PATCH] (GH-962) Upgrade outdated package on install When install command is called on a pacakge, upgrade that package if already installed and a higher version is specifiied on the commmand line --- .../services/ChocolateyPackageService.cs | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs b/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs index 74feb21431..109df22a45 100644 --- a/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs +++ b/src/chocolatey/infrastructure.app/services/ChocolateyPackageService.cs @@ -504,6 +504,8 @@ public ConcurrentDictionary install_run(ChocolateyConfigu foreach (var packageConfig in set_config_from_package_names_and_packages_config(config, packageInstalls).or_empty_list_if_null()) { + upgrade_outdated_packages_and_remove_from_config(packageConfig); + Action action = null; if (packageConfig.SourceType == SourceType.normal) { @@ -1299,5 +1301,42 @@ private void get_log_environment_changes(ChocolateyConfiguration config, IEnumer } } } + + private void upgrade_outdated_packages_and_remove_from_config(ChocolateyConfiguration config) + { + if (string.IsNullOrEmpty(config.Version)) return; + + var notifyOnlyUpgrade = config.UpgradeCommand.NotifyOnlyAvailableUpgrades; + config.UpgradeCommand.NotifyOnlyAvailableUpgrades = true; + var output = config.RegularOutput; + config.RegularOutput = false; + var outdatedPackages = _nugetService.upgrade_noop(config, null); + config.RegularOutput = output; + config.UpgradeCommand.NotifyOnlyAvailableUpgrades = notifyOnlyUpgrade; + + var configVersion = new SemanticVersion(config.Version); + var packageIdsToUpdate = outdatedPackages + .Where(p => p.Value.Package != null && p.Value.Success && !p.Value.Inconclusive + && configVersion >= p.Value.Package.Version + && !_packageInfoService.get_package_information(p.Value.Package).IsSideBySide) + .Select(p => p.Value.Package.Id).ToArray(); + + if (packageIdsToUpdate.Length == 0) return; + + // Remove the package names that are going to be upgraded from original config + var optionalPacakgeSeparator = ApplicationParameters.PackageNamesSeparator + "?"; + config.PackageNames = System.Text.RegularExpressions.Regex.Replace( + config.PackageNames, + "(" + string.Join(optionalPacakgeSeparator + "|", packageIdsToUpdate) + optionalPacakgeSeparator + ")", + ""); + + var updateConfig = config.deep_copy(); + updateConfig.PackageNames = string.Join(ApplicationParameters.PackageNamesSeparator, packageIdsToUpdate); + + this.Log().Warn("{0}{1} already installed. Performing upgrade instead.{0}" + .format_with(Environment.NewLine, updateConfig.PackageNames.Replace(ApplicationParameters.PackageNamesSeparator, ", "))); + + upgrade_run(updateConfig); + } } -} +} \ No newline at end of file