public static IEnumerable <PreviewResult> CreatePreview( IEnumerable <NuGet.Client.Resolution.PackageAction> actions, Installation.InstallationTarget target) { var previewResults = new List <PreviewResult>(); foreach (var targetProject in target.GetAllTargetsRecursively()) { var result = CalculatePreviewForProject(actions, targetProject); if (result != null) { previewResults.Add(result); } } return(previewResults); }
public static void ExecutePowerShellScriptIfPresent(string scriptName, InstallationTarget target, IPackage package, string installPath, IExecutionContext context) { Debug.Assert(context != null); // If we don't have a project, we're at solution level // The <Solution> string is only for tracing so it probably doesn't need to be loc'ed string projectName = target.Name; var targetFramework = target.GetSupportedFrameworks().FirstOrDefault(); // Get the install script var scriptFile = FindScript( package, scriptName, targetFramework); // If there is a script to run if (scriptFile != null) { NuGetTraceSources.ActionExecutor.Info( "executingps1", "[{0}] Running {2} for {1}", projectName, package.GetFullName(), scriptFile.Path); context.ExecuteScript(installPath, scriptFile.Path, package, target); } else { NuGetTraceSources.ActionExecutor.Info( "nops1", "[{0}] No {2} script for {1}.", projectName, package.GetFullName(), scriptName); } }
// Calulates the prevew result for the target project and returns the result. private static PreviewResult CalculatePreviewForProject( IEnumerable <NuGet.Client.Resolution.PackageAction> actions, Installation.InstallationTarget targetProject) { var existingPackages = targetProject.InstalledPackages.GetInstalledPackages() .Select(p => p.Identity) .ToList(); var installed = new Dictionary <string, PackageIdentity>(StringComparer.OrdinalIgnoreCase); var uninstalled = new Dictionary <string, PackageIdentity>(StringComparer.OrdinalIgnoreCase); foreach (var action in actions.Where(a => targetProject.Equals(a.Target))) { if (action.ActionType == PackageActionType.Install) { installed[action.PackageIdentity.Id] = action.PackageIdentity; } else if (action.ActionType == PackageActionType.Uninstall) { uninstalled[action.PackageIdentity.Id] = action.PackageIdentity; } } var addedPackages = new List <PackageIdentity>(); var deletedPackages = new List <PackageIdentity>(); var unchangedPackages = new List <PackageIdentity>(); var updatedPackges = new List <UpdatePreviewResult>(); // process existing packages to get updatedPackages, deletedPackages // and unchangedPackages foreach (var package in existingPackages) { var isInstalled = installed.ContainsKey(package.Id); var isUninstalled = uninstalled.ContainsKey(package.Id); if (isInstalled && isUninstalled) { // the package is updated updatedPackges.Add(new UpdatePreviewResult(package, installed[package.Id])); installed.Remove(package.Id); } else if (isInstalled && !isUninstalled) { // this can't happen Debug.Assert(false, "We should never reach here"); } else if (!isInstalled && isUninstalled) { // the package is uninstalled deletedPackages.Add(package); } else if (!isInstalled && !isUninstalled) { // the package is unchanged unchangedPackages.Add(package); } } // now calculate addedPackages foreach (var package in installed.Values) { if (!existingPackages.Contains(package)) { addedPackages.Add(package); } } if (addedPackages.Any() || deletedPackages.Any() || updatedPackges.Any()) { return(new PreviewResult( targetProject.Name, added: addedPackages, deleted: deletedPackages, unchanged: unchangedPackages, updated: updatedPackges)); } else { return(null); } }
// The type of parameter package should be IPackage but we use object instead since we // don't want to expose IPackage. public abstract void ExecuteScript(string packageInstallPath, string scriptRelativePath, object package, InstallationTarget target, IExecutionLogger logger);