Пример #1
0
        /// <summary>
        /// Asynchronously copies satellite files.
        /// </summary>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="nuGetProjectContext">A NuGet project context.</param>
        /// <param name="token">A cancellation token.</param>
        /// <returns>A task that represents the asynchronous operation.
        /// The task result (<see cref="Task{TResult}.Result" />) returns a <see cref="bool" />
        /// indication successfulness of the operation.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="nuGetProjectContext" />
        /// is <c>null</c>.</exception>
        /// <exception cref="OperationCanceledException">Thrown if <paramref name="token" />
        /// is cancelled.</exception>
        public async Task <bool> CopySatelliteFilesAsync(
            PackageIdentity packageIdentity,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

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

            token.ThrowIfCancellationRequested();

            var copiedSatelliteFiles = await PackageExtractor.CopySatelliteFilesAsync(
                packageIdentity,
                PackagePathResolver,
                GetPackageSaveMode(nuGetProjectContext),
                nuGetProjectContext.PackageExtractionContext,
                token);

            FileSystemUtility.PendAddFiles(copiedSatelliteFiles, Root, nuGetProjectContext);

            return(copiedSatelliteFiles.Any());
        }
Пример #2
0
        public async Task <bool> CopySatelliteFilesAsync(PackageIdentity packageIdentity,
                                                         INuGetProjectContext nuGetProjectContext, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();
            var copiedSatelliteFiles = await PackageExtractor.CopySatelliteFilesAsync(packageIdentity, PackagePathResolver, PackageSaveMode, token);

            FileSystemUtility.PendAddFiles(copiedSatelliteFiles, Root, nuGetProjectContext);

            return(copiedSatelliteFiles.Any());
        }
Пример #3
0
        public async override Task <bool> InstallPackageAsync(PackageIdentity packageIdentity, Stream packageStream,
                                                              INuGetProjectContext nuGetProjectContext, CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException("packageIdentity");
            }

            if (packageStream == null)
            {
                throw new ArgumentNullException("packageStream");
            }

            if (nuGetProjectContext == null)
            {
                throw new ArgumentNullException("nuGetProjectContext");
            }

            if (!packageStream.CanSeek)
            {
                throw new ArgumentException(Strings.PackageStreamShouldBeSeekable);
            }

            // 1. Check if the Package already exists at root, if so, return false
            if (PackageExists(packageIdentity))
            {
                nuGetProjectContext.Log(MessageLevel.Warning, Strings.PackageAlreadyExistsInFolder, packageIdentity, Root);
                return(false);
            }

            nuGetProjectContext.Log(MessageLevel.Info, Strings.AddingPackageToFolder, packageIdentity, Root);
            // 2. Call PackageExtractor to extract the package into the root directory of this FileSystemNuGetProject
            packageStream.Seek(0, SeekOrigin.Begin);
            var addedPackageFilesList = new List <string>(await PackageExtractor.ExtractPackageAsync(packageStream, packageIdentity, PackagePathResolver, nuGetProjectContext.PackageExtractionContext,
                                                                                                     PackageSaveMode, token));

            if (PackageSaveMode.HasFlag(PackageSaveModes.Nupkg))
            {
                var packageFilePath = GetInstalledPackageFilePath(packageIdentity);
                if (File.Exists(packageFilePath))
                {
                    addedPackageFilesList.Add(packageFilePath);
                }
            }

            // Pend all the package files including the nupkg file
            FileSystemUtility.PendAddFiles(addedPackageFilesList, Root, nuGetProjectContext);

            nuGetProjectContext.Log(MessageLevel.Info, Strings.AddedPackageToFolder, packageIdentity, Root);
            return(true);
        }
Пример #4
0
        /// <summary>
        /// Asynchronously copies satellite files.
        /// </summary>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="nuGetProjectContext">A NuGet project context.</param>
        /// <param name="token">A cancellation token.</param>
        /// <returns>A task that represents the asynchronous operation.
        /// The task result (<see cref="Task{TResult}.Result" />) returns a <see cref="bool" />
        /// indication successfulness of the operation.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="nuGetProjectContext" />
        /// is <c>null</c>.</exception>
        /// <exception cref="OperationCanceledException">Thrown if <paramref name="token" />
        /// is cancelled.</exception>
        public async Task <bool> CopySatelliteFilesAsync(
            PackageIdentity packageIdentity,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

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

            token.ThrowIfCancellationRequested();

            var packageExtractionContext = nuGetProjectContext.PackageExtractionContext;

            if (packageExtractionContext == null)
            {
                var signedPackageVerifier = new PackageSignatureVerifier(
                    SignatureVerificationProviderFactory.GetSignatureVerificationProviders(),
                    SignedPackageVerifierSettings.Default);

                packageExtractionContext = new PackageExtractionContext(
                    PackageSaveMode.Defaultv2,
                    PackageExtractionBehavior.XmlDocFileSaveMode,
                    new LoggerAdapter(nuGetProjectContext),
                    signedPackageVerifier);
            }

            var copiedSatelliteFiles = await PackageExtractor.CopySatelliteFilesAsync(
                packageIdentity,
                PackagePathResolver,
                GetPackageSaveMode(nuGetProjectContext),
                packageExtractionContext,
                token);

            FileSystemUtility.PendAddFiles(copiedSatelliteFiles, Root, nuGetProjectContext);

            return(copiedSatelliteFiles.Any());
        }
Пример #5
0
        public Task <bool> CopySatelliteFilesAsync(PackageIdentity packageIdentity,
                                                   INuGetProjectContext nuGetProjectContext, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            PackageExtractionContext packageExtractionContext = nuGetProjectContext.PackageExtractionContext;

            if (packageExtractionContext == null)
            {
                packageExtractionContext = new PackageExtractionContext(new LoggerAdapter(nuGetProjectContext));
            }

            var copiedSatelliteFiles = PackageExtractor.CopySatelliteFiles(
                packageIdentity,
                PackagePathResolver,
                GetPackageSaveMode(nuGetProjectContext),
                packageExtractionContext,
                token);

            FileSystemUtility.PendAddFiles(copiedSatelliteFiles, Root, nuGetProjectContext);

            return(Task.FromResult(copiedSatelliteFiles.Any()));
        }
Пример #6
0
        public override Task <bool> InstallPackageAsync(
            PackageIdentity packageIdentity,
            DownloadResourceResult downloadResourceResult,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

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

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

            if (!downloadResourceResult.PackageStream.CanSeek)
            {
                throw new ArgumentException(Strings.PackageStreamShouldBeSeekable);
            }
            var packageFile = PackagePathResolver.GetInstallPath(packageIdentity);

            return(ConcurrencyUtilities.ExecuteWithFileLockedAsync(packageFile,
                                                                   action: cancellationToken =>
            {
                // 1. Set a default package extraction context, if necessary.
                PackageExtractionContext packageExtractionContext = nuGetProjectContext.PackageExtractionContext;
                if (packageExtractionContext == null)
                {
                    packageExtractionContext = new PackageExtractionContext(new LoggerAdapter(nuGetProjectContext));
                }

                // 2. Check if the Package already exists at root, if so, return false
                if (PackageExists(packageIdentity, packageExtractionContext.PackageSaveMode))
                {
                    nuGetProjectContext.Log(MessageLevel.Info, Strings.PackageAlreadyExistsInFolder, packageIdentity, Root);
                    return Task.FromResult(false);
                }

                nuGetProjectContext.Log(MessageLevel.Info, Strings.AddingPackageToFolder, packageIdentity, Path.GetFullPath(Root));

                // 3. Call PackageExtractor to extract the package into the root directory of this FileSystemNuGetProject
                downloadResourceResult.PackageStream.Seek(0, SeekOrigin.Begin);
                var addedPackageFilesList = new List <string>();

                if (downloadResourceResult.PackageReader != null)
                {
                    addedPackageFilesList.AddRange(
                        PackageExtractor.ExtractPackage(
                            downloadResourceResult.PackageReader,
                            downloadResourceResult.PackageStream,
                            PackagePathResolver,
                            packageExtractionContext,
                            cancellationToken));
                }
                else
                {
                    addedPackageFilesList.AddRange(
                        PackageExtractor.ExtractPackage(
                            downloadResourceResult.PackageStream,
                            PackagePathResolver,
                            packageExtractionContext,
                            cancellationToken));
                }

                var packageSaveMode = GetPackageSaveMode(nuGetProjectContext);
                if (packageSaveMode.HasFlag(PackageSaveMode.Nupkg))
                {
                    var packageFilePath = GetInstalledPackageFilePath(packageIdentity);
                    if (File.Exists(packageFilePath))
                    {
                        addedPackageFilesList.Add(packageFilePath);
                    }
                }

                // Pend all the package files including the nupkg file
                FileSystemUtility.PendAddFiles(addedPackageFilesList, Root, nuGetProjectContext);

                nuGetProjectContext.Log(MessageLevel.Info, Strings.AddedPackageToFolder, packageIdentity, Path.GetFullPath(Root));
                return Task.FromResult(true);
            },
                                                                   token: token));
        }
Пример #7
0
        /// <summary>
        /// Asynchronously installs a package.
        /// </summary>
        /// <param name="packageIdentity">A package identity.</param>
        /// <param name="downloadResourceResult">A download resource result.</param>
        /// <param name="nuGetProjectContext">A NuGet project context.</param>
        /// <param name="token">A cancellation token.</param>
        /// <returns>A task that represents the asynchronous operation.
        /// The task result (<see cref="Task{TResult}.Result" />) returns a <see cref="bool" />
        /// indication successfulness of the operation.</returns>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="packageIdentity" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="downloadResourceResult" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentNullException">Thrown if <paramref name="nuGetProjectContext" />
        /// is <c>null</c>.</exception>
        /// <exception cref="ArgumentException">Thrown if the package stream for
        /// <paramref name="downloadResourceResult" /> is not seekable.</exception>
        public override Task <bool> InstallPackageAsync(
            PackageIdentity packageIdentity,
            DownloadResourceResult downloadResourceResult,
            INuGetProjectContext nuGetProjectContext,
            CancellationToken token)
        {
            if (packageIdentity == null)
            {
                throw new ArgumentNullException(nameof(packageIdentity));
            }

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

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

            if (downloadResourceResult.Status == DownloadResourceResultStatus.Available &&
                !downloadResourceResult.PackageStream.CanSeek)
            {
                throw new ArgumentException(Strings.PackageStreamShouldBeSeekable, nameof(downloadResourceResult));
            }

            var packageDirectory = PackagePathResolver.GetInstallPath(packageIdentity);

            return(ConcurrencyUtilities.ExecuteWithFileLockedAsync(
                       packageDirectory,
                       action: async cancellationToken =>
            {
                var packageExtractionContext = nuGetProjectContext.PackageExtractionContext;

                // 1. Check if the Package already exists at root, if so, return false
                if (PackageExists(packageIdentity, packageExtractionContext.PackageSaveMode))
                {
                    nuGetProjectContext.Log(MessageLevel.Info, Strings.PackageAlreadyExistsInFolder, packageIdentity, Root);
                    return false;
                }

                nuGetProjectContext.Log(MessageLevel.Info, Strings.AddingPackageToFolder, packageIdentity, Path.GetFullPath(Root));

                // 2. Call PackageExtractor to extract the package into the root directory of this FileSystemNuGetProject
                if (downloadResourceResult.Status == DownloadResourceResultStatus.Available)
                {
                    downloadResourceResult.PackageStream.Seek(0, SeekOrigin.Begin);
                }
                var addedPackageFilesList = new List <string>();

                if (downloadResourceResult.PackageReader != null)
                {
                    if (downloadResourceResult.Status == DownloadResourceResultStatus.AvailableWithoutStream)
                    {
                        addedPackageFilesList.AddRange(
                            await PackageExtractor.ExtractPackageAsync(
                                downloadResourceResult.PackageSource,
                                downloadResourceResult.PackageReader,
                                PackagePathResolver,
                                packageExtractionContext,
                                cancellationToken,
                                nuGetProjectContext.OperationId));
                    }
                    else
                    {
                        addedPackageFilesList.AddRange(
                            await PackageExtractor.ExtractPackageAsync(
                                downloadResourceResult.PackageSource,
                                downloadResourceResult.PackageReader,
                                downloadResourceResult.PackageStream,
                                PackagePathResolver,
                                packageExtractionContext,
                                cancellationToken,
                                nuGetProjectContext.OperationId));
                    }
                }
                else
                {
                    addedPackageFilesList.AddRange(
                        await PackageExtractor.ExtractPackageAsync(
                            downloadResourceResult.PackageSource,
                            downloadResourceResult.PackageStream,
                            PackagePathResolver,
                            packageExtractionContext,
                            cancellationToken,
                            nuGetProjectContext.OperationId));
                }

                var packageSaveMode = GetPackageSaveMode(nuGetProjectContext);
                if (packageSaveMode.HasFlag(PackageSaveMode.Nupkg))
                {
                    var packageFilePath = GetInstalledPackageFilePath(packageIdentity);
                    if (File.Exists(packageFilePath))
                    {
                        addedPackageFilesList.Add(packageFilePath);
                    }
                }

                // Pend all the package files including the nupkg file
                FileSystemUtility.PendAddFiles(addedPackageFilesList, Root, nuGetProjectContext);

                nuGetProjectContext.Log(MessageLevel.Info, Strings.AddedPackageToFolder, packageIdentity, Path.GetFullPath(Root));

                // Extra logging with source for verbosity detailed
                // Used by external tool CoreXT to track package provenance
                if (!string.IsNullOrEmpty(downloadResourceResult.PackageSource))
                {
                    nuGetProjectContext.Log(MessageLevel.Debug, Strings.AddedPackageToFolderFromSource, packageIdentity, Path.GetFullPath(Root), downloadResourceResult.PackageSource);
                }

                return true;
            },
                       token: token));
        }