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);