Example #1
0
        public static async Task <InstallPackageResult> InstallPackageAsync(
            this Project project,
            string packageId,
            string packageVersion,
            DependencyBehavior dependencyBehaviour,
            bool allowPrerelease,
            FileConflictAction?conflictAction,
            IEnumerable <SourceRepository> sources,
            CancellationToken token)
        {
            var message = new InstallPackageParams {
                ProjectFileName    = project.FileName,
                PackageId          = packageId,
                PackageVersion     = packageVersion,
                FileConflictAction = conflictAction?.ToString(),
                DependencyBehavior = dependencyBehaviour.ToString(),
                AllowPrerelease    = allowPrerelease,
                PackageSources     = GetPackageSourceInfo(sources).ToArray()
            };

            return(await JsonRpcProvider.Rpc.InvokeWithParameterObjectAsync <InstallPackageResult> (
                       Methods.ProjectInstallPackage,
                       new[] { message },
                       token));
        }
Example #2
0
        private static DependencyVersion MapDependencyBehavior(DependencyBehavior behavior)
        {
            // Ignore is checked before calling this.
            Debug.Assert(behavior != DependencyBehavior.Ignore);

            switch (behavior)
            {
            case DependencyBehavior.Lowest:
                return(DependencyVersion.Lowest);

            case DependencyBehavior.HighestPatch:
                return(DependencyVersion.HighestPatch);

            case DependencyBehavior.HighestMinor:
                return(DependencyVersion.HighestMinor);

            case DependencyBehavior.Highest:
                return(DependencyVersion.Highest);

            default:
                throw new ArgumentException(
                          String.Format(
                              CultureInfo.CurrentCulture,
                              Strings.ActionResolver_UnsupportedDependencyBehavior,
                              behavior),
                          "behavior");
            }
        }
        async Task <NuGetVersion> GetLatestPackageVersion(
            IEnumerable <SourceRepository> repositories,
            DependencyBehavior dependencyBehavior,
            SourceCacheContext sourceCacheContext,
            CancellationToken token)
        {
            var latestVersionContext = new ResolutionContext(
                dependencyBehavior,
                message.AllowPrerelease,
                false,
                VersionConstraints.None,
                new GatherCache(),
                sourceCacheContext
                );

            ResolvedPackage resolvedPackage = await packageManager.GetLatestVersionAsync(
                message.PackageId,
                nugetProject,
                latestVersionContext,
                repositories,
                new ProjectContextLogger (projectContext),
                token);

            if (resolvedPackage?.LatestVersion == null)
            {
                throw new InvalidOperationException(GettextCatalog.GetString("Unable to find package '{0}", message.PackageId));
            }

            return(resolvedPackage?.LatestVersion);
        }
Example #4
0
        /// <summary>
        /// Core install method. All installs from the VS API and template wizard end up here.
        /// This does not check for already installed packages
        /// </summary>
        internal async Task InstallInternalCoreAsync(
            NuGetPackageManager packageManager,
            GatherCache gatherCache,
            NuGetProject nuGetProject,
            PackageIdentity package,
            IEnumerable <SourceRepository> sources,
            VSAPIProjectContext projectContext,
            bool includePrerelease,
            bool ignoreDependencies,
            CancellationToken token)
        {
            await TaskScheduler.Default;

            DependencyBehavior depBehavior = ignoreDependencies ? DependencyBehavior.Ignore : DependencyBehavior.Lowest;

            ResolutionContext resolution = new ResolutionContext(
                depBehavior,
                includePrerelease,
                includeUnlisted: false,
                versionConstraints: VersionConstraints.None,
                gatherCache: gatherCache);

            // install the package
            if (package.Version == null)
            {
                await packageManager.InstallPackageAsync(nuGetProject, package.Id, resolution, projectContext, sources, Enumerable.Empty <SourceRepository>(), token);
            }
            else
            {
                await packageManager.InstallPackageAsync(nuGetProject, package, resolution, projectContext, sources, Enumerable.Empty <SourceRepository>(), token);
            }
        }
Example #5
0
        public static async Task <UpdatePackageResult> UpdatePackageAsync(
            this IEnumerable <Project> projects,
            string packageId,
            string packageVersion,
            DependencyBehavior dependencyBehaviour,
            bool allowPrerelease,
            VersionConstraints versionConstraints,
            FileConflictAction?conflictAction,
            IEnumerable <SourceRepository> sources,
            CancellationToken token)
        {
            var message = new UpdatePackageParams {
                ProjectFileNames   = projects.Select(project => project.FileName).ToArray(),
                PackageId          = packageId,
                PackageVersion     = packageVersion,
                DependencyBehavior = dependencyBehaviour.ToString(),
                FileConflictAction = conflictAction?.ToString(),
                VersionConstraints = versionConstraints.ToString(),
                AllowPrerelease    = allowPrerelease,
                PackageSources     = GetPackageSourceInfo(sources).ToArray()
            };

            return(await JsonRpcProvider.Rpc.InvokeWithParameterObjectAsync <UpdatePackageResult> (
                       Methods.ProjectUpdatePackage,
                       message,
                       token));
        }
 public InstallCommand()
     : base(MachineCache.Default)
 {
     // On mono, parallel builds are broken for some reason. See https://gist.github.com/4201936 for the errors
     // That are thrown.
     DisableParallelProcessing = EnvironmentUtility.IsMonoRuntime;
     DependencyBehavior        = Client.DependencyBehavior.Lowest;
 }
Example #7
0
        private static PackageResolverContext CreatePackageResolverContext(DependencyBehavior behavior,
                                                                           PackageIdentity target,
                                                                           IEnumerable <ResolverPackage> availablePackages)
        {
            var targets = new PackageIdentity[] { target };

            return(CreatePackageResolverContext(behavior, targets, availablePackages));
        }
Example #8
0
 public InstallCommand()
     : base(MachineCache.Default)
 {
     // On mono, parallel builds are broken for some reason. See https://gist.github.com/4201936 for the errors
     // That are thrown.
     DisableParallelProcessing = EnvironmentUtility.IsMonoRuntime;
     DependencyBehavior = Client.DependencyBehavior.Lowest;
 }
 /// <summary>
 /// The only public constructor to create the resolution context
 /// </summary>
 public ResolutionContext(
     DependencyBehavior dependencyBehavior = Resolver.DependencyBehavior.Lowest,
     bool includePrelease = false,
     bool includeUnlisted = true)
 {
     DependencyBehavior = dependencyBehavior;
     IncludePrerelease = includePrelease;
     IncludeUnlisted = includeUnlisted;
 }
Example #10
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ScannerBase" /> class.
 /// </summary>
 /// <param name="scannerName">The name of this scanner.</param>
 /// <param name="isRepeated">A value indicating whether this scan is repeated.</param>
 /// <param name="dependencyBehavior">The object defining task dependencies.</param>
 public ScannerBase(String scannerName, Boolean isRepeated, DependencyBehavior dependencyBehavior) : base(
         taskName: scannerName,
         isRepeated: isRepeated,
         trackProgress: true,
         dependencyBehavior: dependencyBehavior)
 {
     this.ScannerName    = scannerName;
     this.UpdateInterval = SettingsViewModel.GetInstance().RescanInterval;
 }
 /// <summary>
 /// The only public constructor to create the resolution context
 /// </summary>
 public ResolutionContext(
     DependencyBehavior dependencyBehavior = Resolver.DependencyBehavior.Lowest,
     bool includePrelease = false,
     bool includeUnlisted = true)
 {
     DependencyBehavior = dependencyBehavior;
     IncludePrerelease  = includePrelease;
     IncludeUnlisted    = includeUnlisted;
 }
Example #12
0
        private void SetSelectedDepencyBehavior(DependencyBehavior dependencyBehavior)
        {
            var selectedDependencyBehavior = _detailModel.Options.DependencyBehaviors
                                             .FirstOrDefault(d => d.Behavior == dependencyBehavior);

            if (selectedDependencyBehavior != null)
            {
                _detailModel.Options.SelectedDependencyBehavior = selectedDependencyBehavior;
            }
        }
Example #13
0
 private static PackageResolverContext CreatePackageResolverContext(DependencyBehavior behavior,
                                                                    IEnumerable <PackageIdentity> targets,
                                                                    IEnumerable <ResolverPackage> availablePackages)
 {
     return(new PackageResolverContext(behavior,
                                       targets.Select(p => p.Id), Enumerable.Empty <string>(),
                                       Enumerable.Empty <PackageReference>(),
                                       targets,
                                       availablePackages));
 }
 public async ValueTask <IReadOnlyList <ProjectAction> > GetInstallActionsAsync(
     IReadOnlyCollection <string> projectIds,
     PackageIdentity packageIdentity,
     VersionConstraints versionConstraints,
     bool includePrerelease,
     DependencyBehavior dependencyBehavior,
     IReadOnlyList <string> packageSourceNames,
     CancellationToken cancellationToken)
 {
     return(await GetInstallActionsAsync(projectIds, packageIdentity, versionConstraints, includePrerelease, dependencyBehavior, packageSourceNames, versionRange : null, cancellationToken));
 }
Example #15
0
        /// <summary>
        /// Resolver context
        /// </summary>
        /// <param name="dependencyBehavior">behavior for non-target packages</param>
        /// <param name="targetIds">packages to install or update</param>
        /// <param name="requiredPackageIds">packages required in the solution</param>
        /// <param name="packagesConfig">existing packages</param>
        /// <param name="preferredVersions">preferred package versions or the installed version of a package</param>
        /// <param name="availablePackages">all packages from the gather stage</param>
        public PackageResolverContext(DependencyBehavior dependencyBehavior,
                                      IEnumerable <string> targetIds,
                                      IEnumerable <string> requiredPackageIds,
                                      IEnumerable <Packaging.PackageReference> packagesConfig,
                                      IEnumerable <PackageIdentity> preferredVersions,
                                      IEnumerable <SourcePackageDependencyInfo> availablePackages,
                                      IEnumerable <PackageSource> packageSources,
                                      Common.ILogger log)
        {
            if (targetIds == null)
            {
                throw new ArgumentNullException(nameof(targetIds));
            }

            if (requiredPackageIds == null)
            {
                throw new ArgumentNullException(nameof(requiredPackageIds));
            }

            if (packagesConfig == null)
            {
                throw new ArgumentNullException(nameof(packagesConfig));
            }

            if (preferredVersions == null)
            {
                throw new ArgumentNullException(nameof(preferredVersions));
            }

            if (availablePackages == null)
            {
                throw new ArgumentNullException(nameof(availablePackages));
            }

            if (packageSources == null)
            {
                throw new ArgumentNullException(nameof(packageSources));
            }

            DependencyBehavior = dependencyBehavior;
            TargetIds          = new HashSet <string>(targetIds, StringComparer.OrdinalIgnoreCase);

            RequiredPackageIds = new HashSet <string>(requiredPackageIds, StringComparer.OrdinalIgnoreCase);
            RequiredPackageIds.UnionWith(targetIds);

            PackagesConfig    = packagesConfig;
            PreferredVersions = new HashSet <PackageIdentity>(preferredVersions, PackageIdentity.Comparer);
            AvailablePackages = availablePackages;
            PackageSources    = packageSources;
            Log = log;
            Debug.Assert(PreferredVersions.GroupBy(p => p.Id, StringComparer.OrdinalIgnoreCase)
                         .All(group => group.Count() == 1), "duplicate preferred ids");
        }
Example #16
0
 /// <summary>
 /// Public constructor to create the resolution context
 /// </summary>
 public ResolutionContext(
     DependencyBehavior dependencyBehavior,
     bool includePrelease,
     bool includeUnlisted,
     VersionConstraints versionConstraints)
     : this(dependencyBehavior,
            includePrelease,
            includeUnlisted,
            versionConstraints,
            new GatherCache())
 {
 }
        /// <summary>
        /// Install package by Id
        /// </summary>
        protected async Task InstallPackageByIdAsync(
            Project project,
            string packageId,
            DependencyBehavior dependencyBehavior,
            bool allowPrerelease,
            bool isPreview)
        {
            //if (!ShouldContinueDueToDotnetDeprecation (actions, isPreview)) {
            //	return;
            //}

            if (isPreview)
            {
                var actionsList = await project.PreviewInstallPackageAsync(
                    packageId,
                    null,
                    dependencyBehavior,
                    allowPrerelease,
                    PrimarySourceRepositories,
                    Token);

                if (actionsList.IsPackageAlreadyInstalled)
                {
                    LogPackageAlreadyInstalled(packageId, project);
                }
                else
                {
                    PreviewNuGetPackageActions(actionsList.Actions);
                }
            }
            else
            {
                var result = await project.InstallPackageAsync(
                    packageId,
                    null,
                    dependencyBehavior,
                    allowPrerelease,
                    ConflictAction,
                    PrimarySourceRepositories,
                    Token);

                if (result.IsPackageAlreadyInstalled)
                {
                    LogPackageAlreadyInstalled(packageId, project);
                }
            }
        }
Example #18
0
        /// <summary>
        /// Resolver context
        /// </summary>
        /// <param name="dependencyBehavior">behavior for non-target packages</param>
        /// <param name="targetIds">packages to install or update</param>
        /// <param name="requiredPackageIds">packages required in the solution</param>
        /// <param name="packagesConfig">existing packages</param>
        /// <param name="preferredVersions">preferred package versions or the installed version of a package</param>
        /// <param name="availablePackages">all packages from the gather stage</param>
        public PackageResolverContext(DependencyBehavior dependencyBehavior,
            IEnumerable<string> targetIds,
            IEnumerable<string> requiredPackageIds,
            IEnumerable<Packaging.PackageReference> packagesConfig,
            IEnumerable<PackageIdentity> preferredVersions,
            IEnumerable<SourcePackageDependencyInfo> availablePackages)
        {
            if (targetIds == null)
            {
                throw new ArgumentNullException(nameof(targetIds));
            }

            if (requiredPackageIds == null)
            {
                throw new ArgumentNullException(nameof(requiredPackageIds));
            }

            if (packagesConfig == null)
            {
                throw new ArgumentNullException(nameof(packagesConfig));
            }

            if (preferredVersions == null)
            {
                throw new ArgumentNullException(nameof(preferredVersions));
            }

            if (availablePackages == null)
            {
                throw new ArgumentNullException(nameof(availablePackages));
            }

            DependencyBehavior = dependencyBehavior;
            TargetIds = new HashSet<string>(targetIds, StringComparer.OrdinalIgnoreCase);

            RequiredPackageIds = new HashSet<string>(requiredPackageIds, StringComparer.OrdinalIgnoreCase);
            RequiredPackageIds.UnionWith(targetIds);

            PackagesConfig = packagesConfig;
            PreferredVersions = new HashSet<PackageIdentity>(preferredVersions, PackageIdentity.Comparer);
            AvailablePackages = availablePackages;

            Debug.Assert(PreferredVersions.GroupBy(p => p.Id, StringComparer.OrdinalIgnoreCase)
                .All(group => group.Count() == 1), "duplicate preferred ids");
        }
Example #19
0
        /// <summary>
        /// Public constructor to create the resolution context
        /// </summary>
        public ResolutionContext(
            DependencyBehavior dependencyBehavior,
            bool includePrelease,
            bool includeUnlisted,
            VersionConstraints versionConstraints,
            GatherCache gatherCache)
        {
            if (gatherCache == null)
            {
                throw new ArgumentNullException(nameof(gatherCache));
            }

            DependencyBehavior = dependencyBehavior;
            IncludePrerelease  = includePrelease;
            IncludeUnlisted    = includeUnlisted;
            VersionConstraints = versionConstraints;
            GatherCache        = gatherCache;
        }
        public static DependencyBehavior GetDependencyBehavior(DependencyBehavior defaultBehavior, string dependencyVersion, Configuration.ISettings settings)
        {
            // Check to see if dependencyVersion parameter is set. Else check for dependencyVersion in .config.
            if (!string.IsNullOrEmpty(dependencyVersion))
            {
                return(TryGetDependencyBehavior(dependencyVersion));
            }

            // If the dependencyVersion wasn't provided , try to get the dependencyBehavior from the .config.
            string settingsDependencyVersion =
                SettingsUtility.GetConfigValue(settings, ConfigurationConstants.DependencyVersion);

            if (!string.IsNullOrEmpty(settingsDependencyVersion))
            {
                return(TryGetDependencyBehavior(settingsDependencyVersion));
            }

            return(defaultBehavior);
        }
        /// <summary>
        /// Install package by Identity
        /// </summary>
        protected async Task InstallPackageByIdentityAsync(
            Project project,
            PackageIdentity identity,
            DependencyBehavior dependencyBehavior,
            bool allowPrerelease,
            bool isPreview)
        {
            if (isPreview)
            {
                var actionsList = await project.PreviewInstallPackageAsync(
                    identity.Id,
                    identity.Version.ToNormalizedString(),
                    dependencyBehavior,
                    allowPrerelease,
                    PrimarySourceRepositories,
                    Token);

                if (actionsList.IsPackageAlreadyInstalled)
                {
                    LogPackageAlreadyInstalled(identity, project);
                }
                else
                {
                    PreviewNuGetPackageActions(actionsList.Actions);
                }
            }
            else
            {
                var result = await project.InstallPackageAsync(
                    identity.Id,
                    identity.Version.ToNormalizedString(),
                    dependencyBehavior,
                    allowPrerelease,
                    ConflictAction,
                    PrimarySourceRepositories,
                    Token);

                if (result.IsPackageAlreadyInstalled)
                {
                    LogPackageAlreadyInstalled(identity, project);
                }
            }
        }
Example #22
0
        /// <summary>
        /// Core install method. All installs from the VS API and template wizard end up here.
        /// </summary>
        internal async Task InstallInternal(Project project, List <PackageIdentity> packages, ISourceRepositoryProvider repoProvider, VSAPIProjectContext projectContext, bool ignoreDependencies, CancellationToken token)
        {
            // store expanded node state
            IDictionary <string, ISet <VsHierarchyItem> > expandedNodes = VsHierarchyHelper.GetAllExpandedNodes(_solutionManager);

            try
            {
                DependencyBehavior depBehavior = ignoreDependencies ? DependencyBehavior.Ignore : DependencyBehavior.Lowest;

                bool includePrerelease = false;

                ResolutionContext resolution = new ResolutionContext(depBehavior, includePrerelease, false);

                NuGetPackageManager packageManager = new NuGetPackageManager(repoProvider, _settings, _solutionManager);

                // find the project
                NuGetProject nuGetProject = PackageManagementHelpers.GetProject(_solutionManager, project, projectContext);

                // install the package
                foreach (PackageIdentity package in packages)
                {
                    if (package.Version == null)
                    {
                        if (!_packageServices.IsPackageInstalled(project, package.Id))
                        {
                            await packageManager.InstallPackageAsync(nuGetProject, package.Id, resolution, projectContext, repoProvider.GetRepositories(), Enumerable.Empty <SourceRepository>(), token);
                        }
                    }
                    else
                    {
                        if (!_packageServices.IsPackageInstalledEx(project, package.Id, package.Version.ToString()))
                        {
                            await packageManager.InstallPackageAsync(nuGetProject, package, resolution, projectContext, repoProvider.GetRepositories(), Enumerable.Empty <SourceRepository>(), token);
                        }
                    }
                }
            }
            finally
            {
                // collapse nodes
                VsHierarchyHelper.CollapseAllNodes(_solutionManager, expandedNodes);
            }
        }
Example #23
0
        private static void GetPackageDependencies(PackageIdentity package,
                                                   NuGetFramework framework,
                                                   SourceCacheContext cacheContext,
                                                   ILogger logger,
                                                   IEnumerable <SourceRepository> repositories,
                                                   ISet <SourcePackageDependencyInfo> availablePackages,
                                                   DependencyBehavior dependencyBehavior,
                                                   IEnumerable <SourceRepository> primaryRepositories = null)
        {
            if (availablePackages.Contains(package))
            {
                return;
            }

            foreach (var sourceRepository in primaryRepositories ?? repositories)
            {
                var dependencyInfoResource = sourceRepository.GetResourceAsync <DependencyInfoResource>().GetAwaiter().GetResult();
                var dependencyInfo         = dependencyInfoResource.ResolvePackage(package, framework, cacheContext, logger, CancellationToken.None).GetAwaiter().GetResult();

                if (dependencyInfo == null)
                {
                    continue;
                }

                availablePackages.Add(dependencyInfo);

                // No need to resolve dependencies if the dependency behavior is ignore.
                if (dependencyBehavior == DependencyBehavior.Ignore)
                {
                    return;
                }

                foreach (var dependency in dependencyInfo.Dependencies)
                {
                    GetPackageDependencies(
                        new PackageIdentity(dependency.Id, dependency.VersionRange.MinVersion),
                        framework, cacheContext, logger, repositories, availablePackages, dependencyBehavior);
                }

                // If we have already found package we can return here. No need to enumerate the other sources.
                return;
            }
        }
Example #24
0
        public async Task <IEnumerable <PackageIdentity> > ResolveAsync(PackageIdentity package, NuGetFramework targetFramework, bool includePrelease = true, bool ignoreMissingPackages = true)
        {
            DependencyBehavior dependencyBehavior = DependencyBehavior.Lowest;

            //gathered dependencies
            var availabePackageStorage = new HashSet <SourcePackageDependencyInfo>(PackageIdentityComparer.Default);

            //gathering resource from available sources
            var getDependencyResourcesTasks = repositories.Select(repo => repo.GetResourceAsync <DependencyInfoResource>());

            var dependencyResources = (await getDependencyResourcesTasks.WhenAllOrException()).Where(x => x.IsSuccess && x.Result != null)
                                      .Select(x => x.Result).ToArray();

            var dependencyInfoResources = new DependencyInfoResourceCollection(dependencyResources);

            //recursively collect all dependencies
            dependencyBehavior = await ResolveDependenciesRecursivelyAsync(package, targetFramework, dependencyInfoResources, NullSourceCacheContext.Instance,
                                                                           availabePackageStorage, ignoreMissingPackages, default);

            return(availabePackageStorage.ToList());
        }
Example #25
0
 public static async Task UpdateAllPackagesAsync(
     this IEnumerable <Project> projects,
     DependencyBehavior dependencyBehaviour,
     bool allowPrerelease,
     VersionConstraints versionConstraints,
     FileConflictAction?conflictAction,
     IEnumerable <SourceRepository> sources,
     CancellationToken token)
 {
     var message = new UpdatePackageParams {
         ProjectFileNames   = projects.Select(project => project.FileName).ToArray(),
         DependencyBehavior = dependencyBehaviour.ToString(),
         FileConflictAction = conflictAction?.ToString(),
         VersionConstraints = versionConstraints.ToString(),
         AllowPrerelease    = allowPrerelease,
         PackageSources     = GetPackageSourceInfo(sources).ToArray()
     };
     await JsonRpcProvider.Rpc.InvokeWithCancellationAsync(
         Methods.ProjectUpdateAllPackages,
         new [] { message },
         token);
 }
Example #26
0
 /// <summary>
 /// Parse user input for -Version switch
 /// </summary>
 private void ParseUserInputForVersion()
 {
     if (!string.IsNullOrEmpty(Version))
     {
         DependencyBehavior updateVersion;
         IsVersionEnum = Enum.TryParse <DependencyBehavior>(Version, true, out updateVersion);
         if (IsVersionEnum)
         {
             _updateVersionEnum = updateVersion;
         }
         // If Version is prerelease, automatically allow prerelease (i.e. append -Prerelease switch).
         else
         {
             _nugetVersion = PowerShellCmdletsUtility.GetNuGetVersionFromString(Version);
             if (_nugetVersion.IsPrerelease)
             {
                 _versionSpecifiedPrerelease = true;
             }
         }
     }
     _allowPrerelease = IncludePrerelease.IsPresent || _versionSpecifiedPrerelease;
 }
        public ResolverComparer(DependencyBehavior dependencyBehavior,
                                HashSet <PackageIdentity> preferredVersions,
                                HashSet <string> targetIds)
        {
            _dependencyBehavior = dependencyBehavior;
            _preferredVersions  = preferredVersions;
            _targetIds          = targetIds;
            _versionComparer    = VersionComparer.Default;
            _identityComparer   = PackageIdentity.Comparer;

            _installedVersions = new Dictionary <string, NuGetVersion>();

            if (_installedVersions != null)
            {
                foreach (var package in _preferredVersions)
                {
                    if (package.Version != null)
                    {
                        _installedVersions.Add(package.Id, package.Version);
                    }
                }
            }
        }
Example #28
0
        public async ValueTask <IReadOnlyList <ProjectAction> > GetInstallActionsAsync(
            IReadOnlyCollection <string> projectIds,
            PackageIdentity packageIdentity,
            VersionConstraints versionConstraints,
            bool includePrelease,
            DependencyBehavior dependencyBehavior,
            IReadOnlyList <string> packageSourceNames,
            CancellationToken cancellationToken)
        {
            Assumes.NotNullOrEmpty(projectIds);
            Assumes.NotNull(packageIdentity);
            Assumes.NotNullOrEmpty(packageSourceNames);
            Assumes.Null(_state.PackageIdentity);
            Assumes.True(_state.ResolvedActions.Count == 0);
            Assumes.NotNull(_state.SourceCacheContext);

            cancellationToken.ThrowIfCancellationRequested();

            return(await CatchAndRethrowExceptionAsync(async() =>
            {
                _state.PackageIdentity = packageIdentity;

                IReadOnlyList <SourceRepository> sourceRepositories = GetSourceRepositories(
                    packageSourceNames,
                    cancellationToken);

                Assumes.NotNullOrEmpty(sourceRepositories);

                INuGetProjectContext projectContext = await ServiceLocator.GetComponentModelServiceAsync <INuGetProjectContext>();
                IReadOnlyList <NuGetProject> projects = await GetProjectsAsync(projectIds, cancellationToken);

                var resolutionContext = new ResolutionContext(
                    dependencyBehavior,
                    includePrelease,
                    includeUnlisted: false,
                    versionConstraints,
                    new GatherCache(),
                    _state.SourceCacheContext);

                NuGetPackageManager packageManager = await _sharedState.GetPackageManagerAsync(cancellationToken);
                IEnumerable <ResolvedAction> resolvedActions = await packageManager.PreviewProjectsInstallPackageAsync(
                    projects,
                    _state.PackageIdentity,
                    resolutionContext,
                    projectContext,
                    sourceRepositories,
                    cancellationToken);

                var projectActions = new List <ProjectAction>();

                foreach (ResolvedAction resolvedAction in resolvedActions)
                {
                    ProjectAction projectAction = CreateProjectAction(resolvedAction);

                    _state.ResolvedActions[projectAction.Id] = resolvedAction;

                    projectActions.Add(projectAction);
                }

                return projectActions;
            }));
        }
Example #29
0
 private static PackageResolverContext CreatePackageResolverContext(DependencyBehavior behavior,
     IEnumerable<PackageIdentity> targets,
     IEnumerable<ResolverPackage> availablePackages)
 {
     return new PackageResolverContext(behavior,
         targets.Select(p => p.Id), Enumerable.Empty<string>(),
         Enumerable.Empty<PackageReference>(),
         targets,
         availablePackages);
 }
Example #30
0
        /// <summary>
        /// Internal install method. All installs from the VS API and template wizard end up here.
        /// </summary>
        internal async Task InstallInternalAsync(
            Project project,
            List <PackageIdentity> packages,
            ISourceRepositoryProvider repoProvider,
            VSAPIProjectContext projectContext,
            bool includePrerelease,
            bool ignoreDependencies,
            CancellationToken token)
        {
            // Go off the UI thread. This may be called from the UI thread. Only switch to the UI thread where necessary
            // This method installs multiple packages and can likely take more than a few secs
            // So, go off the UI thread explicitly to improve responsiveness
            await TaskScheduler.Default;

            var gatherCache = new GatherCache();
            var sources     = repoProvider.GetRepositories().ToList();

            // store expanded node state
            IDictionary <string, ISet <VsHierarchyItem> > expandedNodes = await VsHierarchyUtility.GetAllExpandedNodesAsync(_solutionManager);

            try
            {
                DependencyBehavior depBehavior = ignoreDependencies ? DependencyBehavior.Ignore : DependencyBehavior.Lowest;

                ResolutionContext resolution = new ResolutionContext(
                    depBehavior,
                    includePrerelease,
                    includeUnlisted: false,
                    versionConstraints: VersionConstraints.None);

                var packageManager = CreatePackageManager(repoProvider);

                // find the project
                var nuGetProject = await _solutionManager.GetOrCreateProjectAsync(project, projectContext);

                // install the package
                foreach (PackageIdentity package in packages)
                {
                    // Check if the package is already installed
                    if (package.Version == null)
                    {
                        if (_packageServices.IsPackageInstalled(project, package.Id))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (_packageServices.IsPackageInstalledEx(project, package.Id, package.Version.ToString()))
                        {
                            continue;
                        }
                    }

                    // Perform the install
                    await InstallInternalCoreAsync(
                        packageManager,
                        gatherCache,
                        nuGetProject,
                        package,
                        sources,
                        projectContext,
                        includePrerelease,
                        ignoreDependencies,
                        token);
                }
            }
            finally
            {
                // collapse nodes
                await VsHierarchyUtility.CollapseAllNodesAsync(_solutionManager, expandedNodes);
            }
        }
Example #31
0
 public ITargetDefinition WhenSkipped(DependencyBehavior dependencyBehavior)
 {
     DependencyBehavior = dependencyBehavior;
     return(this);
 }
Example #32
0
        /// <summary>
        /// Get the update version for Dependent package, based on the specification of Highest, HighestMinor, HighestPatch and Lowest.
        /// </summary>
        /// <param name="sourceRepository"></param>
        /// <param name="identity"></param>
        /// <param name="project"></param>
        /// <param name="updateVersion"></param>
        /// <param name="includePrerelease"></param>
        /// <returns></returns>
        public static PackageIdentity GetUpdateForPackageByDependencyEnum(SourceRepository sourceRepository, PackageIdentity identity, NuGetProject project, DependencyBehavior updateVersion, bool includePrerelease)
        {
            IEnumerable <NuGetVersion> allVersions   = GetAllVersionsForPackageId(sourceRepository, identity.Id, project, includePrerelease);
            PackageIdentity            packageUpdate = null;
            NuGetVersion nVersion = null;

            try
            {
                // Find all versions that are higher than the package's current version
                allVersions = allVersions.Where(p => p > identity.Version).OrderByDescending(v => v);
                if (allVersions != null && allVersions.Any())
                {
                    if (updateVersion == DependencyBehavior.Lowest)
                    {
                        nVersion = allVersions.LastOrDefault();
                    }
                    else if (updateVersion == DependencyBehavior.Highest)
                    {
                        nVersion = allVersions.FirstOrDefault();
                    }
                    else if (updateVersion == DependencyBehavior.HighestPatch)
                    {
                        var groups = from p in allVersions
                                     group p by new { p.Version.Major, p.Version.Minor } into g
                        orderby g.Key.Major, g.Key.Minor
                        select g;
                        nVersion = (from p in groups.First()
                                    orderby p.Version descending
                                    select p).FirstOrDefault();
                    }
                    else if (updateVersion == DependencyBehavior.HighestMinor)
                    {
                        var groups = from p in allVersions
                                     group p by new { p.Version.Major } into g
                        orderby g.Key.Major
                        select g;
                        nVersion = (from p in groups.First()
                                    orderby p.Version descending
                                    select p).FirstOrDefault();
                    }
                }

                if (nVersion != null)
                {
                    packageUpdate = new PackageIdentity(identity.Id, nVersion);
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(
                          String.Format(CultureInfo.CurrentCulture,
                                        Resources.Cmdlets_ErrorFindingUpdateVersion, identity.Id, ex.Message));
            }

            return(packageUpdate);
        }
 public DependencyBehaviorItem(string text, DependencyBehavior dependencyBehavior)
 {
     Text = text;
     Behavior = dependencyBehavior;
 }
 /// <summary>
 /// Parse user input for -Version switch
 /// </summary>
 private void ParseUserInputForVersion()
 {
     if (!string.IsNullOrEmpty(Version))
     {
         DependencyBehavior updateVersion;
         IsVersionEnum = Enum.TryParse<DependencyBehavior>(Version, true, out updateVersion);
         if (IsVersionEnum)
         {
             _updateVersionEnum = updateVersion;
         }
         // If Version is prerelease, automatically allow prerelease (i.e. append -Prerelease switch).
         else
         {
             _nugetVersion = PowerShellCmdletsUtility.GetNuGetVersionFromString(Version);
             if (_nugetVersion.IsPrerelease)
             {
                 _versionSpecifiedPrerelease = true;
             }
         }
     }
     _allowPrerelease = IncludePrerelease.IsPresent || _versionSpecifiedPrerelease;
 }
Example #35
0
        public async ValueTask <IReadOnlyList <ProjectAction> > GetUpdateActionsAsync(
            IReadOnlyCollection <string> projectIds,
            IReadOnlyCollection <PackageIdentity> packageIdentities,
            VersionConstraints versionConstraints,
            bool includePrelease,
            DependencyBehavior dependencyBehavior,
            IReadOnlyList <string> packageSourceNames,
            CancellationToken cancellationToken)
        {
            Assumes.NotNullOrEmpty(projectIds);
            Assumes.NotNullOrEmpty(packageIdentities);
            Assumes.NotNullOrEmpty(packageSourceNames);
            Assumes.NotNull(_state.SourceCacheContext);
            Assumes.NotNull(_state.ResolvedActions);
            Assumes.Null(_state.PackageIdentity);

            return(await CatchAndRethrowExceptionAsync(async() =>
            {
                var primarySources = new List <SourceRepository>();
                var secondarySources = new List <SourceRepository>();

                IEnumerable <SourceRepository> sourceRepositories = _sharedState.SourceRepositoryProvider.GetRepositories();
                var packageSourceNamesSet = new HashSet <string>(packageSourceNames, StringComparer.OrdinalIgnoreCase);

                foreach (SourceRepository sourceRepository in sourceRepositories)
                {
                    if (packageSourceNamesSet.Contains(sourceRepository.PackageSource.Name))
                    {
                        primarySources.Add(sourceRepository);
                    }

                    if (sourceRepository.PackageSource.IsEnabled)
                    {
                        secondarySources.Add(sourceRepository);
                    }
                }

                INuGetProjectContext projectContext = await ServiceLocator.GetComponentModelServiceAsync <INuGetProjectContext>();
                IReadOnlyList <NuGetProject> projects = await GetProjectsAsync(projectIds, cancellationToken);

                var resolutionContext = new ResolutionContext(
                    dependencyBehavior,
                    includePrelease,
                    includeUnlisted: true,
                    versionConstraints,
                    new GatherCache(),
                    _state.SourceCacheContext);

                NuGetPackageManager packageManager = await _sharedState.GetPackageManagerAsync(cancellationToken);
                IEnumerable <NuGetProjectAction> actions = await packageManager.PreviewUpdatePackagesAsync(
                    packageIdentities.ToList(),
                    projects,
                    resolutionContext,
                    projectContext,
                    primarySources,
                    secondarySources,
                    cancellationToken);

                var projectActions = new List <ProjectAction>();

                foreach (NuGetProjectAction action in actions)
                {
                    var resolvedAction = new ResolvedAction(action.Project, action);
                    ProjectAction projectAction = CreateProjectAction(resolvedAction);

                    _state.ResolvedActions[projectAction.Id] = resolvedAction;

                    projectActions.Add(projectAction);
                }

                return projectActions;
            }));
        }
 public InstallCommand()
     : base()
 {
     DependencyBehavior = DependencyBehavior.Lowest;
 }
Example #37
0
        private static DependencyVersion MapDependencyBehavior(DependencyBehavior behavior)
        {
            // Ignore is checked before calling this.
            Debug.Assert(behavior != DependencyBehavior.Ignore);

            switch (behavior)
            {
                case DependencyBehavior.Lowest:
                    return DependencyVersion.Lowest;

                case DependencyBehavior.HighestPatch:
                    return DependencyVersion.HighestPatch;

                case DependencyBehavior.HighestMinor:
                    return DependencyVersion.HighestMinor;

                case DependencyBehavior.Highest:
                    return DependencyVersion.Highest;

                default:
                    throw new ArgumentException(
                        String.Format(
                            CultureInfo.CurrentCulture,
                            Strings.ActionResolver_UnsupportedDependencyBehavior,
                            behavior),
                        "behavior");
            }
        }
        /// <summary>
        /// Get the update version for Dependent package, based on the specification of Highest, HighestMinor, HighestPatch and Lowest.
        /// </summary>
        /// <param name="sourceRepository"></param>
        /// <param name="identity"></param>
        /// <param name="project"></param>
        /// <param name="updateVersion"></param>
        /// <param name="includePrerelease"></param>
        /// <returns></returns>
        public static PackageIdentity GetUpdateForPackageByDependencyEnum(SourceRepository sourceRepository, PackageIdentity identity, NuGetProject project, DependencyBehavior updateVersion, bool includePrerelease)
        {
            IEnumerable<NuGetVersion> allVersions = GetAllVersionsForPackageId(sourceRepository, identity.Id, project, includePrerelease);
            PackageIdentity packageUpdate = null;
            NuGetVersion nVersion = null;

            try
            {
                // Find all versions that are higher than the package's current version
                allVersions = allVersions.Where(p => p > identity.Version).OrderByDescending(v => v);
                if (allVersions != null && allVersions.Any())
                {
                    if (updateVersion == DependencyBehavior.Lowest)
                    {
                        nVersion = allVersions.LastOrDefault();
                    }
                    else if (updateVersion == DependencyBehavior.Highest)
                    {
                        nVersion = allVersions.FirstOrDefault();
                    }
                    else if (updateVersion == DependencyBehavior.HighestPatch)
                    {
                        var groups = from p in allVersions
                                     group p by new { p.Version.Major, p.Version.Minor } into g
                                     orderby g.Key.Major, g.Key.Minor
                                     select g;
                        nVersion = (from p in groups.First()
                                    orderby p.Version descending
                                    select p).FirstOrDefault();
                    }
                    else if (updateVersion == DependencyBehavior.HighestMinor)
                    {
                        var groups = from p in allVersions
                                     group p by new { p.Version.Major } into g
                                     orderby g.Key.Major
                                     select g;
                        nVersion = (from p in groups.First()
                                    orderby p.Version descending
                                    select p).FirstOrDefault();
                    }
                }

                if (nVersion != null)
                {
                    packageUpdate = new PackageIdentity(identity.Id, nVersion);
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(
                    String.Format(CultureInfo.CurrentCulture,
                    Resources.Cmdlets_ErrorFindingUpdateVersion, identity.Id, ex.Message));
            }

            return packageUpdate;
        }
Example #39
0
        private static PackageResolverContext CreatePackageResolverContext(DependencyBehavior behavior,
            PackageIdentity target,
            IEnumerable<ResolverPackage> availablePackages)
        {
            var targets = new PackageIdentity[] { target };

            return CreatePackageResolverContext(behavior, targets, availablePackages);
        }
 public DependencyBehaviorItem(string text, DependencyBehavior dependencyBehavior)
 {
     Text     = text;
     Behavior = dependencyBehavior;
 }
 private void SetSelectedDepencyBehavior(DependencyBehavior dependencyBehavior)
 {
     var selectedDependencyBehavior = _detailModel.Options.DependencyBehaviors
             .FirstOrDefault(d => d.Behavior == dependencyBehavior);
     if (selectedDependencyBehavior != null)
     {
         _detailModel.Options.SelectedDependencyBehavior = selectedDependencyBehavior;
     }
 }