Skip to content

Commit

Permalink
(#1443) Reset config via action after every package upgrade
Browse files Browse the repository at this point in the history
This adds a extra parameter to the upgrade_run method, which
is used to pass an action which resets the configuration in the
function that calls upgrade_run.

This fixes a bug when useRememberedArguments is enabled that causes
arguments to be reused in the chocolateyInstall.ps1 when multiple
packages are upgraded. It happens because OptionSet.parse() sets the
configuration via the actions specified in the UpgradeCommand optionSet
setup (and likewise in configuration builder as well). It only sets
options that are saved, so if a later package does not have an option,
it is not set, and the previous option is reused.

This fixes the bug because it resets the configuration at the
ChocolateyPackageService level, which is enough to reset the
configuration for action that runs the PowerShell as well.
  • Loading branch information
TheCakeIsNaOH committed Jun 27, 2022
1 parent 6f3fc15 commit 49fec9b
Show file tree
Hide file tree
Showing 8 changed files with 17 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,8 @@ public virtual ConcurrentDictionary<string, PackageResult> upgrade_run(Chocolate

try
{
var resetConfigAction = new Action<ChocolateyConfiguration>(newConfig => config = newConfig.deep_copy());

Action<PackageResult> action = null;
if (config.SourceType == SourceType.normal)
{
Expand All @@ -796,7 +798,7 @@ public virtual ConcurrentDictionary<string, PackageResult> upgrade_run(Chocolate
get_environment_before(config, allowLogging: true);

var beforeUpgradeAction = new Action<PackageResult>(packageResult => before_package_modify(packageResult, config));
var results = perform_source_runner_function(config, r => r.upgrade_run(config, action, beforeUpgradeAction));
var results = perform_source_runner_function(config, r => r.upgrade_run(config, action, resetConfigAction, beforeUpgradeAction));

foreach (var result in results)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ public ConcurrentDictionary<string, PackageResult> upgrade_noop(ChocolateyConfig
return new ConcurrentDictionary<string, PackageResult>(StringComparer.InvariantCultureIgnoreCase);
}

public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null)
public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
throw new NotImplementedException("{0} does not implement upgrade".format_with(APP_NAME));
}
Expand Down
3 changes: 2 additions & 1 deletion src/chocolatey/infrastructure.app/services/ISourceRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,10 @@ public interface ISourceRunner
/// </summary>
/// <param name="config">The configuration.</param>
/// <param name="continueAction">The action to continue with when upgrade is successful.</param>
/// <param name="resetConfigAction">The action that can be used to reset the configuration in the caller</param>
/// <param name="beforeUpgradeAction">The action (if any) to run on any currently installed package before triggering the upgrade.</param>
/// <returns>results of installs</returns>
ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null);
ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null);

/// <summary>
/// Run uninstall in noop mode
Expand Down
11 changes: 7 additions & 4 deletions src/chocolatey/infrastructure.app/services/NugetService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -586,15 +586,16 @@ public virtual void remove_rollback_directory_if_exists(string packageName)
public ConcurrentDictionary<string, PackageResult> upgrade_noop(ChocolateyConfiguration config, Action<PackageResult> continueAction)
{
config.Force = false;
return upgrade_run(config, continueAction, performAction: false);
var resetConfigAction = new Action<ChocolateyConfiguration>(newConfig => { });
return upgrade_run(config, continueAction, false, resetConfigAction);
}

public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null)
public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
return upgrade_run(config, continueAction, performAction: true, beforeUpgradeAction: beforeUpgradeAction);
return upgrade_run(config, continueAction, true, resetConfigAction, beforeUpgradeAction);
}

public virtual ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, bool performAction, Action<PackageResult> beforeUpgradeAction = null)
public virtual ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, bool performAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
_fileSystem.create_directory_if_not_exists(ApplicationParameters.PackagesLocation);
var packageInstalls = new ConcurrentDictionary<string, PackageResult>(StringComparer.InvariantCultureIgnoreCase);
Expand Down Expand Up @@ -877,6 +878,7 @@ public virtual ConcurrentDictionary<string, PackageResult> upgrade_run(Chocolate
}
}
}
resetConfigAction.Invoke(originalConfig);
}

return packageInstalls;
Expand Down Expand Up @@ -951,6 +953,7 @@ public virtual ConcurrentDictionary<string, PackageResult> get_outdated(Chocolat
packageResult.Messages.Add(new ResultMessage(ResultType.Note, logMessage));

this.Log().Info("{0}|{1}|{2}|{3}".format_with(installedPackage.Id, installedPackage.Version, latestPackage.Version, isPinned.to_string().to_lower()));

}

return outdatedPackages;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ public ConcurrentDictionary<string, PackageResult> upgrade_noop(ChocolateyConfig
return new ConcurrentDictionary<string, PackageResult>(StringComparer.InvariantCultureIgnoreCase);
}

public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null)
public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
if (config.PackageNames.is_equal_to(ApplicationParameters.AllPackages))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ public ConcurrentDictionary<string, PackageResult> upgrade_noop(ChocolateyConfig
return new ConcurrentDictionary<string, PackageResult>(StringComparer.InvariantCultureIgnoreCase);
}

public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null)
public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
throw new NotImplementedException("{0} does not implement upgrade".format_with(APP_NAME));
}
Expand Down
2 changes: 1 addition & 1 deletion src/chocolatey/infrastructure.app/services/WebPiService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ public ConcurrentDictionary<string, PackageResult> upgrade_noop(ChocolateyConfig
return new ConcurrentDictionary<string, PackageResult>(StringComparer.InvariantCultureIgnoreCase);
}

public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null)
public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
throw new NotImplementedException("{0} does not implement upgrade".format_with(APP_NAME));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ public ConcurrentDictionary<string, PackageResult> upgrade_noop(ChocolateyConfig
return new ConcurrentDictionary<string, PackageResult>(StringComparer.InvariantCultureIgnoreCase);
}

public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<PackageResult> beforeUpgradeAction = null)
public ConcurrentDictionary<string, PackageResult> upgrade_run(ChocolateyConfiguration config, Action<PackageResult> continueAction, Action<ChocolateyConfiguration> resetConfigAction, Action<PackageResult> beforeUpgradeAction = null)
{
set_executable_path_if_not_set();
throw new NotImplementedException("{0} does not implement upgrade".format_with(APP_NAME));
Expand Down

0 comments on commit 49fec9b

Please sign in to comment.