/// <summary>
 /// This is the runner which dequeues package references from <paramref name="packageReferencesQueue" />, and
 /// performs copying of satellite files
 /// Note that this method should only Dequeue from the concurrent queue and not Enqueue
 /// </summary>
 private static async Task CopySatelliteFilesRunnerAsync(ConcurrentQueue <Packaging.PackageReference> packageReferencesQueue,
                                                         PackageRestoreContext packageRestoreContext,
                                                         INuGetProjectContext nuGetProjectContext)
 {
     Packaging.PackageReference currentPackageReference = null;
     while (packageReferencesQueue.TryDequeue(out currentPackageReference))
     {
         var result = await packageRestoreContext.PackageManager.CopySatelliteFilesAsync(currentPackageReference.PackageIdentity, nuGetProjectContext, packageRestoreContext.Token);
     }
 }
        /// <summary>
        /// This is the runner which dequeues package references from <paramref name="packageReferencesQueue" />, and
        /// performs package restore
        /// Note that this method should only Dequeue from the concurrent queue and not Enqueue
        /// </summary>
        private static async Task <bool> PackageRestoreRunnerAsync(ConcurrentQueue <Packaging.PackageReference> packageReferencesQueue,
                                                                   PackageRestoreContext packageRestoreContext,
                                                                   INuGetProjectContext nuGetProjectContext)
        {
            Packaging.PackageReference currentPackageReference = null;
            var restoreResult = true;

            while (packageReferencesQueue.TryDequeue(out currentPackageReference))
            {
                var result = await RestorePackageAsync(currentPackageReference, packageRestoreContext, nuGetProjectContext);

                restoreResult &= result;
            }

            return(restoreResult);
        }
Пример #3
0
        public PackageRestoreData(Packaging.PackageReference packageReference, IEnumerable <string> projectNames, bool isMissing)
        {
            if (packageReference == null)
            {
                throw new ArgumentNullException(nameof(packageReference));
            }

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

            PackageReference = packageReference;
            ProjectNames     = projectNames;
            IsMissing        = isMissing;
        }
        /// <summary>
        /// Marks the packages to be reinstalled on the projects' packages.config
        /// </summary>
        public static async Task MarkPackagesForReinstallation(NuGetProject project, IList <PackageIdentity> packagesToBeReinstalled)
        {
            Debug.Assert(project != null);
            Debug.Assert(packagesToBeReinstalled != null);

            var installedPackageReferences         = (await project.GetInstalledPackagesAsync(CancellationToken.None)).ToList();
            var packageReferencesToUpdateReinstall = new Dictionary <Packaging.PackageReference, Packaging.PackageReference>();

            if (installedPackageReferences != null && installedPackageReferences.Any())
            {
                foreach (var packageReference in installedPackageReferences)
                {
                    bool markForReinstall = packagesToBeReinstalled.Any(p => p.Equals(packageReference.PackageIdentity));

                    // Determine if requireReinstallation attribute needs to be updated.
                    if (packageReference.RequireReinstallation ^ markForReinstall)
                    {
                        var newPackageReference = new Packaging.PackageReference(packageReference.PackageIdentity, packageReference.TargetFramework,
                                                                                 packageReference.IsUserInstalled, packageReference.IsDevelopmentDependency, markForReinstall);

                        packageReferencesToUpdateReinstall.Add(packageReference, newPackageReference);
                    }
                }

                var projectFullPath        = project.GetMetadata <string>(NuGetProjectMetadataKeys.FullPath);
                var packagesConfigFullPath = Path.Combine(projectFullPath ?? string.Empty, ProjectManagement.Constants.PackageReferenceFile);

                // Create new file or overwrite existing file
                if (File.Exists(packagesConfigFullPath))
                {
                    try
                    {
                        using (var writer = new PackagesConfigWriter(packagesConfigFullPath, createNew: false))
                        {
                            foreach (var entry in packageReferencesToUpdateReinstall)
                            {
                                writer.UpdatePackageEntry(entry.Key, entry.Value);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        ExceptionHelper.WriteErrorToActivityLog(ex);
                    }
                }
            }
        }
        private static async Task <bool> RestorePackageAsync(Packaging.PackageReference packageReference,
                                                             PackageRestoreContext packageRestoreContext,
                                                             INuGetProjectContext nuGetProjectContext)
        {
            Exception exception = null;
            var       restored  = false;

            try
            {
                restored = await packageRestoreContext.PackageManager.RestorePackageAsync(packageReference.PackageIdentity, nuGetProjectContext,
                                                                                          packageRestoreContext.SourceRepositories, packageRestoreContext.Token);
            }
            catch (Exception ex)
            {
                exception = ex;
            }

            if (packageRestoreContext.PackageRestoredEvent != null)
            {
                packageRestoreContext.PackageRestoredEvent(null, new PackageRestoredEventArgs(packageReference.PackageIdentity, restored));
            }

            // PackageReferences cannot be null here
            if (exception != null)
            {
                nuGetProjectContext.Log(ProjectManagement.MessageLevel.Warning, exception.Message);
                if (packageRestoreContext.PackageRestoreFailedEvent != null)
                {
                    var packageReferenceComparer = new PackageReferenceComparer();

                    var packageRestoreData = packageRestoreContext.Packages
                                             .Where(p => packageReferenceComparer.Equals(p.PackageReference, packageReference))
                                             .SingleOrDefault();

                    if (packageRestoreData != null)
                    {
                        Debug.Assert(packageRestoreData.ProjectNames != null);
                        packageRestoreContext.PackageRestoreFailedEvent(null, new PackageRestoreFailedEventArgs(packageReference,
                                                                                                                exception,
                                                                                                                packageRestoreData.ProjectNames));
                    }
                }
            }

            return(restored);
        }
        public PackageRestoreFailedEventArgs(Packaging.PackageReference restoredFailedPackageReference, Exception exception, IEnumerable <string> projectNames)
        {
            if (restoredFailedPackageReference == null)
            {
                throw new ArgumentNullException(nameof(restoredFailedPackageReference));
            }

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

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

            RestoreFailedPackageReference = restoredFailedPackageReference;
            Exception    = exception;
            ProjectNames = projectNames;
        }
 // TODO: Consider removing elements from the collection and check if that is better in performance
 public static IEnumerable <SourcePackageDependencyInfo> RemoveDisallowedVersions(IEnumerable <SourcePackageDependencyInfo> packages, Packaging.PackageReference packageReference)
 {
     if (packageReference.AllowedVersions != null)
     {
         return(packages.Where(p => !StringComparer.OrdinalIgnoreCase.Equals(p.Id, packageReference.PackageIdentity.Id) ||
                               packageReference.AllowedVersions.Satisfies(p.Version)));
     }
     return(packages);
 }