示例#1
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 static bool IsExactVersion(VersionConstraints versionConstraints)
 {
     return
         (versionConstraints.HasFlag(VersionConstraints.ExactMajor)
          &&
          versionConstraints.HasFlag(VersionConstraints.ExactMinor)
          &&
          versionConstraints.HasFlag(VersionConstraints.ExactPatch)
          &&
          versionConstraints.HasFlag(VersionConstraints.ExactRelease));
 }
 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));
 }
示例#4
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())
 {
 }
示例#5
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;
        }
示例#6
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);
 }
示例#7
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;
            }));
        }
示例#8
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;
            }));
        }
 private static bool MeetsVersionConstraints(NuGetVersion newVersion, NuGetVersion existingVersion, VersionConstraints versionConstraints)
 {
     return
         ((!versionConstraints.HasFlag(VersionConstraints.ExactMajor) || newVersion.Major == existingVersion.Major)
          &&
          (!versionConstraints.HasFlag(VersionConstraints.ExactMinor) || newVersion.Minor == existingVersion.Minor)
          &&
          (!versionConstraints.HasFlag(VersionConstraints.ExactPatch) || newVersion.Patch == existingVersion.Patch)
          &&
          (!versionConstraints.HasFlag(VersionConstraints.ExactRelease) || newVersion.Release.Equals(existingVersion.Release, StringComparison.OrdinalIgnoreCase)));
 }
        public static IEnumerable <SourcePackageDependencyInfo> PruneByUpdateConstraints(IEnumerable <SourcePackageDependencyInfo> packages, IEnumerable <NuGet.Packaging.PackageReference> packageReferences, VersionConstraints versionConstraints)
        {
            var installed = new Dictionary <string, NuGetVersion>(StringComparer.OrdinalIgnoreCase);

            foreach (var packageReference in packageReferences)
            {
                installed[packageReference.PackageIdentity.Id] = packageReference.PackageIdentity.Version;
            }

            return(packages.Where(p => !installed.ContainsKey(p.Id) || MeetsVersionConstraints(p.Version, installed[p.Id], versionConstraints)));
        }
示例#11
0
 public static IEnumerable <SourcePackageDependencyInfo> PruneByUpdateConstraints(IEnumerable <SourcePackageDependencyInfo> packages, NuGetVersion existingVersion, VersionConstraints versionConstraints)
 {
     return(packages.Where(p => MeetsVersionConstraints(p.Version, existingVersion, versionConstraints)));
 }
示例#12
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);

            var primarySources   = new List <SourceRepository>();
            var secondarySources = new List <SourceRepository>();

            ISourceRepositoryProvider sourceRepositoryProvider = await _sharedState.SourceRepositoryProvider.GetValueAsync(cancellationToken);

            IEnumerable <SourceRepository> sourceRepositories = 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.GetInstanceAsync <INuGetProjectContext>();

            var projects = new List <NuGetProject>();

            foreach (string projectId in projectIds)
            {
                (bool success, NuGetProject? project) = await TryGetNuGetProjectMatchingProjectIdAsync(projectId);

                Assumes.True(success);
                Assumes.NotNull(project);

                projects.Add(project);
            }

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

            NuGetPackageManager packageManager = await _sharedState.PackageManager.GetValueAsync(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)
            {
                string projectId      = action.Project.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);
                var    resolvedAction = new ResolvedAction(action.Project, action);
                var    projectAction  = new ProjectAction(
                    CreateProjectActionId(),
                    projectId,
                    action.PackageIdentity,
                    action.NuGetProjectActionType,
                    implicitActions: null);

                _state.ResolvedActions[projectAction.Id] = resolvedAction;

                projectActions.Add(projectAction);
            }

            return(projectActions);
        }
示例#13
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();

            _state.PackageIdentity = packageIdentity;

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

            Assumes.NotNullOrEmpty(sourceRepositories);

            INuGetProjectContext projectContext = await ServiceLocator.GetInstanceAsync <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.PackageManager.GetValueAsync(cancellationToken);

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

            var projectActions = new List <ProjectAction>();

            foreach (ResolvedAction resolvedAction in resolvedActions)
            {
                List <ImplicitProjectAction>?implicitActions = null;

                if (resolvedAction.Action is BuildIntegratedProjectAction buildIntegratedAction)
                {
                    implicitActions = new List <ImplicitProjectAction>();

                    foreach (NuGetProjectAction?buildAction in buildIntegratedAction.GetProjectActions())
                    {
                        var implicitAction = new ImplicitProjectAction(
                            CreateProjectActionId(),
                            buildAction.PackageIdentity,
                            buildAction.NuGetProjectActionType);

                        implicitActions.Add(implicitAction);
                    }
                }

                string projectId     = resolvedAction.Project.GetMetadata <string>(NuGetProjectMetadataKeys.ProjectId);
                var    projectAction = new ProjectAction(
                    CreateProjectActionId(),
                    projectId,
                    resolvedAction.Action.PackageIdentity,
                    resolvedAction.Action.NuGetProjectActionType,
                    implicitActions);

                _state.ResolvedActions[projectAction.Id] = resolvedAction;

                projectActions.Add(projectAction);
            }

            return(projectActions);
        }