private async Task PushPackageToFileSystem(Uri sourceUri,
                                                   string pathToPackage,
                                                   ILogger log,
                                                   CancellationToken token)
        {
            var             root            = sourceUri.LocalPath;
            PackageIdentity packageIdentity = null;

            using (var reader = new PackageArchiveReader(pathToPackage))
            {
                packageIdentity = reader.GetIdentity();
            }

            if (IsV2LocalRepository(root))
            {
                var pathResolver    = new PackagePathResolver(root, useSideBySidePaths: true);
                var packageFileName = pathResolver.GetPackageFileName(packageIdentity);

                var fullPath = Path.Combine(root, packageFileName);
                File.Copy(pathToPackage, fullPath, overwrite: true);
            }
            else
            {
                var context = new OfflineFeedAddContext(pathToPackage,
                                                        root,
                                                        log,
                                                        throwIfSourcePackageIsInvalid: true,
                                                        throwIfPackageExistsAndInvalid: false,
                                                        throwIfPackageExists: false,
                                                        expand: true);
                await OfflineFeedUtility.AddPackageToSource(context, token);
            }
        }
Beispiel #2
0
        private async Task PushPackageToFileSystem(Uri sourceUri,
                                                   string pathToPackage,
                                                   bool skipDuplicate,
                                                   ILogger log,
                                                   CancellationToken token)
        {
            var             root            = sourceUri.LocalPath;
            PackageIdentity packageIdentity = null;

            using (var reader = new PackageArchiveReader(pathToPackage))
            {
                packageIdentity = reader.GetIdentity();
            }

            if (IsV2LocalRepository(root))
            {
                var pathResolver    = new PackagePathResolver(sourceUri.AbsolutePath, useSideBySidePaths: true);
                var packageFileName = pathResolver.GetPackageFileName(packageIdentity);

                var fullPath = Path.Combine(root, packageFileName);
                File.Copy(pathToPackage, fullPath, overwrite: true);

                //Indicate that SkipDuplicate is currently not supported in this scenario.
                if (skipDuplicate)
                {
                    log?.LogWarning(Strings.PushCommandSkipDuplicateNotImplemented);
                }
            }
            else
            {
                var packageExtractionContext = new PackageExtractionContext(
                    PackageSaveMode.Defaultv3,
                    PackageExtractionBehavior.XmlDocFileSaveMode,
                    ClientPolicyContext.GetClientPolicy(Settings, log),
                    log);

                var context = new OfflineFeedAddContext(pathToPackage,
                                                        root,
                                                        log,
                                                        throwIfSourcePackageIsInvalid: true,
                                                        throwIfPackageExistsAndInvalid: !skipDuplicate,
                                                        throwIfPackageExists: !skipDuplicate,
                                                        extractionContext: packageExtractionContext);

                await OfflineFeedUtility.AddPackageToSource(context, token);
            }
        }
        private async Task PushPackageToFileSystem(Uri sourceUri,
                                                   string pathToPackage,
                                                   ILogger log,
                                                   CancellationToken token)
        {
            var             root            = sourceUri.LocalPath;
            PackageIdentity packageIdentity = null;

            using (var reader = new PackageArchiveReader(pathToPackage))
            {
                packageIdentity = reader.GetIdentity();
            }

            if (IsV2LocalRepository(root))
            {
                var pathResolver    = new PackagePathResolver(root, useSideBySidePaths: true);
                var packageFileName = pathResolver.GetPackageFileName(packageIdentity);

                var fullPath = Path.Combine(root, packageFileName);
                File.Copy(pathToPackage, fullPath, overwrite: true);
            }
            else
            {
                var signedPackageVerifier = new PackageSignatureVerifier(SignatureVerificationProviderFactory.GetSignatureVerificationProviders());

                var packageExtractionContext = new PackageExtractionContext(
                    PackageSaveMode.Defaultv3,
                    PackageExtractionBehavior.XmlDocFileSaveMode,
                    log,
                    signedPackageVerifier,
                    SignedPackageVerifierSettings.GetClientPolicy(Settings, log));

                var context = new OfflineFeedAddContext(pathToPackage,
                                                        root,
                                                        log,
                                                        throwIfSourcePackageIsInvalid: true,
                                                        throwIfPackageExistsAndInvalid: false,
                                                        throwIfPackageExists: false,
                                                        extractionContext: packageExtractionContext);

                await OfflineFeedUtility.AddPackageToSource(context, token);
            }
        }
Beispiel #4
0
        public static async Task AddPackageToSource(
            OfflineFeedAddContext offlineFeedAddContext,
            CancellationToken token)
        {
            var packagePath = offlineFeedAddContext.PackagePath;
            var source      = offlineFeedAddContext.Source;
            var logger      = offlineFeedAddContext.Logger;

            using (var packageStream = File.OpenRead(packagePath))
            {
                try
                {
                    var packageReader   = new PackageArchiveReader(packageStream, leaveStreamOpen: true);
                    var packageIdentity = packageReader.GetIdentity();

                    bool isValidPackage;
                    if (PackageExists(packageIdentity, source, out isValidPackage))
                    {
                        // Package already exists. Verify if it is valid
                        if (isValidPackage)
                        {
                            var message = string.Format(
                                CultureInfo.CurrentCulture,
                                Strings.AddPackage_PackageAlreadyExists,
                                packageIdentity,
                                source);

                            if (offlineFeedAddContext.ThrowIfPackageExists)
                            {
                                throw new ArgumentException(message);
                            }
                            else
                            {
                                logger.LogMinimal(message);
                            }
                        }
                        else
                        {
                            var message = string.Format(CultureInfo.CurrentCulture,
                                                        Strings.AddPackage_ExistingPackageInvalid,
                                                        packageIdentity,
                                                        source);

                            if (offlineFeedAddContext.ThrowIfPackageExistsAndInvalid)
                            {
                                throw new ArgumentException(message);
                            }
                            else
                            {
                                logger.LogWarning(message);
                            }
                        }
                    }
                    else
                    {
                        packageStream.Seek(0, SeekOrigin.Begin);
                        var packageSaveMode = offlineFeedAddContext.Expand
                            ? PackageSaveMode.Defaultv3
                            : PackageSaveMode.Nuspec | PackageSaveMode.Nupkg;

                        var versionFolderPathContext = new VersionFolderPathContext(
                            packageIdentity,
                            source,
                            logger,
                            packageSaveMode: packageSaveMode,
                            xmlDocFileSaveMode: PackageExtractionBehavior.XmlDocFileSaveMode);

                        await PackageExtractor.InstallFromSourceAsync(
                            stream => packageStream.CopyToAsync(stream),
                            versionFolderPathContext,
                            token);

                        var message = string.Format(
                            CultureInfo.CurrentCulture,
                            Strings.AddPackage_SuccessfullyAdded,
                            packagePath,
                            source);

                        logger.LogMinimal(message);
                    }
                }
                // Mono will throw ArchiveException when package is invalid.
                // Reading Nuspec in invalid package on Mono will get PackagingException
                catch (Exception ex) when(ex is InvalidDataException ||
                                          (RuntimeEnvironmentHelper.IsMono &&
                                           (ex.GetType().FullName.Equals("SharpCompress.Common.ArchiveException") ||
                                            ex is PackagingException)))
                {
                    var message = string.Format(
                        CultureInfo.CurrentCulture,
                        Strings.NupkgPath_Invalid,
                        packagePath);

                    if (offlineFeedAddContext.ThrowIfSourcePackageIsInvalid)
                    {
                        throw new ArgumentException(message);
                    }
                    else
                    {
                        logger.LogWarning(message);
                    }
                }
            }
        }
        public static async Task AddPackageToSource(
            OfflineFeedAddContext offlineFeedAddContext,
            CancellationToken token)
        {
            if (offlineFeedAddContext == null)
            {
                throw new ArgumentNullException(nameof(offlineFeedAddContext));
            }

            token.ThrowIfCancellationRequested();

            var packagePath = offlineFeedAddContext.PackagePath;
            var source      = offlineFeedAddContext.Source;
            var logger      = offlineFeedAddContext.Logger;

            using (var packageStream = File.OpenRead(packagePath))
            {
                try
                {
                    var packageReader   = new PackageArchiveReader(packageStream, leaveStreamOpen: true);
                    var packageIdentity = packageReader.GetIdentity();

                    bool isValidPackage;
                    if (PackageExists(packageIdentity, source, out isValidPackage))
                    {
                        // Package already exists. Verify if it is valid
                        if (isValidPackage)
                        {
                            var message = string.Format(
                                CultureInfo.CurrentCulture,
                                Strings.AddPackage_PackageAlreadyExists,
                                packageIdentity,
                                source);

                            if (offlineFeedAddContext.ThrowIfPackageExists)
                            {
                                throw new ArgumentException(message);
                            }
                            else
                            {
                                logger.LogMinimal(message);
                            }
                        }
                        else
                        {
                            var message = string.Format(CultureInfo.CurrentCulture,
                                                        Strings.AddPackage_ExistingPackageInvalid,
                                                        packageIdentity,
                                                        source);

                            if (offlineFeedAddContext.ThrowIfPackageExistsAndInvalid)
                            {
                                throw new ArgumentException(message);
                            }
                            else
                            {
                                logger.LogWarning(message);
                            }
                        }
                    }
                    else
                    {
                        var packageSaveMode = offlineFeedAddContext.Expand
                            ? PackageSaveMode.Defaultv3
                            : PackageSaveMode.Nuspec | PackageSaveMode.Nupkg;

                        var signedPackageVerifier = new PackageSignatureVerifier(
                            SignatureVerificationProviderFactory.GetSignatureVerificationProviders(),
                            SignedPackageVerifierSettings.Default);

                        var packageExtractionContext = new PackageExtractionContext(
                            packageSaveMode,
                            PackageExtractionBehavior.XmlDocFileSaveMode,
                            logger,
                            signedPackageVerifier);

                        var versionFolderPathResolver = new VersionFolderPathResolver(source);

                        using (var packageDownloader = new LocalPackageArchiveDownloader(
                                   packagePath,
                                   packageIdentity,
                                   logger))
                        {
                            // Set Empty parentId here.
                            await PackageExtractor.InstallFromSourceAsync(
                                packageIdentity,
                                packageDownloader,
                                versionFolderPathResolver,
                                packageExtractionContext,
                                token,
                                Guid.Empty);
                        }

                        var message = string.Format(
                            CultureInfo.CurrentCulture,
                            Strings.AddPackage_SuccessfullyAdded,
                            packagePath,
                            source);

                        logger.LogMinimal(message);
                    }
                }
                // Mono will throw ArchiveException when package is invalid.
                // Reading Nuspec in invalid package on Mono will get PackagingException
                catch (Exception ex) when(ex is InvalidDataException ||
                                          (RuntimeEnvironmentHelper.IsMono &&
                                           (ex.GetType().FullName.Equals("SharpCompress.Common.ArchiveException") ||
                                            ex is PackagingException)))
                {
                    var message = string.Format(
                        CultureInfo.CurrentCulture,
                        Strings.NupkgPath_Invalid,
                        packagePath);

                    if (offlineFeedAddContext.ThrowIfSourcePackageIsInvalid)
                    {
                        throw new ArgumentException(message);
                    }
                    else
                    {
                        logger.LogWarning(message);
                    }
                }
            }
        }
        public static async Task AddPackageToSource(
            OfflineFeedAddContext offlineFeedAddContext,
            CancellationToken token)
        {
            var packagePath = offlineFeedAddContext.PackagePath;
            var source      = offlineFeedAddContext.Source;
            var logger      = offlineFeedAddContext.Logger;

            using (var packageStream = File.OpenRead(packagePath))
            {
                try
                {
                    var packageReader   = new PackageArchiveReader(packageStream, leaveStreamOpen: true);
                    var packageIdentity = packageReader.GetIdentity();

                    bool isValidPackage;
                    if (PackageExists(packageIdentity, source, out isValidPackage))
                    {
                        // Package already exists. Verify if it is valid
                        if (isValidPackage)
                        {
                            var message = string.Format(
                                CultureInfo.CurrentCulture,
                                Strings.AddPackage_PackageAlreadyExists,
                                packageIdentity,
                                source);

                            if (offlineFeedAddContext.ThrowIfPackageExists)
                            {
                                throw new ArgumentException(message);
                            }
                            else
                            {
                                logger.LogMinimal(message);
                            }
                        }
                        else
                        {
                            var message = string.Format(CultureInfo.CurrentCulture,
                                                        Strings.AddPackage_ExistingPackageInvalid,
                                                        packageIdentity,
                                                        source);

                            if (offlineFeedAddContext.ThrowIfPackageExistsAndInvalid)
                            {
                                throw new ArgumentException(message);
                            }
                            else
                            {
                                logger.LogWarning(message);
                            }
                        }
                    }
                    else
                    {
                        packageStream.Seek(0, SeekOrigin.Begin);
                        var packageSaveMode = offlineFeedAddContext.Expand
                            ? PackageSaveMode.Defaultv3
                            : PackageSaveMode.Nuspec | PackageSaveMode.Nupkg;

                        var versionFolderPathContext = new VersionFolderPathContext(
                            packageIdentity,
                            source,
                            logger,
                            fixNuspecIdCasing: false,
                            packageSaveMode: packageSaveMode,
                            normalizeFileNames: true,
                            xmlDocFileSaveMode: PackageExtractionBehavior.XmlDocFileSaveMode);

                        await PackageExtractor.InstallFromSourceAsync(
                            stream => packageStream.CopyToAsync(stream),
                            versionFolderPathContext,
                            token);

                        var message = string.Format(
                            CultureInfo.CurrentCulture,
                            Strings.AddPackage_SuccessfullyAdded,
                            packagePath,
                            source);

                        logger.LogMinimal(message);
                    }
                }
                catch (InvalidDataException)
                {
                    var message = string.Format(
                        CultureInfo.CurrentCulture,
                        Strings.NupkgPath_Invalid,
                        packagePath);

                    if (offlineFeedAddContext.ThrowIfSourcePackageIsInvalid)
                    {
                        throw new ArgumentException(message);
                    }
                    else
                    {
                        logger.LogWarning(message);
                    }
                }
            }
        }