public static async Task <IEnumerable <string> > GetPackageFilesAsync( this IAsyncPackageCoreReader packageReader, PackageSaveMode packageSaveMode, CancellationToken cancellationToken) { return((await packageReader .GetFilesAsync(cancellationToken)) .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode))); }
private static async Task <IEnumerable <string> > CopySatelliteFilesAsync( PackageReaderBase packageReader, PackagePathResolver packagePathResolver, PackageSaveMode packageSaveMode, PackageExtractionContext packageExtractionContext, CancellationToken token) { if (packageReader == null) { throw new ArgumentNullException(nameof(packageReader)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } await VerifyPackageSignatureAsync(packageReader.GetIdentity(), packageExtractionContext, packageReader, token); var satelliteFilesCopied = Enumerable.Empty <string>(); var result = await PackageHelper.GetSatelliteFilesAsync(packageReader, packagePathResolver, token); var runtimePackageDirectory = result.Item1; var satelliteFiles = result.Item2 .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode)) .ToList(); if (satelliteFiles.Count > 0) { var packageFileExtractor = new PackageFileExtractor(satelliteFiles, packageExtractionContext.XmlDocFileSaveMode); // Now, add all the satellite files collected from the package to the runtime package folder(s) satelliteFilesCopied = await packageReader.CopyFilesAsync( runtimePackageDirectory, satelliteFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token); } return(satelliteFilesCopied); }
private static IEnumerable <string> CopySatelliteFiles( PackageReaderBase packageReader, PackagePathResolver packagePathResolver, PackageSaveMode packageSaveMode, PackageExtractionContext packageExtractionContext, CancellationToken token) { if (packageReader == null) { throw new ArgumentNullException(nameof(packageReader)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } var satelliteFilesCopied = Enumerable.Empty <string>(); string runtimePackageDirectory; var satelliteFiles = PackageHelper .GetSatelliteFiles(packageReader, packagePathResolver, out runtimePackageDirectory) .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode)) .ToList(); if (satelliteFiles.Count > 0) { var packageFileExtractor = new PackageFileExtractor(satelliteFiles, packageExtractionContext.XmlDocFileSaveMode); // Now, add all the satellite files collected from the package to the runtime package folder(s) satelliteFilesCopied = packageReader.CopyFiles( runtimePackageDirectory, satelliteFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token); } return(satelliteFilesCopied); }
public static Task <IEnumerable <ZipFilePair> > GetPackageFiles(IEnumerable <ZipArchiveEntry> packageFiles, string packageDirectory, PackageSaveModes packageSaveMode, CancellationToken token) { List <ZipFilePair> effectivePackageFiles = new List <ZipFilePair>(); foreach (var entry in packageFiles) { string path = ZipArchiveHelper.UnescapePath(entry.FullName); if (PackageHelper.IsPackageFile(path, packageSaveMode)) { var packageFileFullPath = Path.Combine(packageDirectory, path); effectivePackageFiles.Add(new ZipFilePair(packageFileFullPath, entry)); } } return(Task.FromResult <IEnumerable <ZipFilePair> >(effectivePackageFiles)); }
public static IEnumerable <string> GetPackageFiles(this IPackageCoreReader packageReader, PackageSaveMode packageSaveMode) { return(packageReader.GetFiles().Where(file => PackageHelper.IsPackageFile(file, packageSaveMode))); }
public static async Task <IEnumerable <string> > ExtractPackageAsync( PackageReaderBase packageReader, Stream packageStream, PackageIdentity packageIdentity, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, PackageSaveModes packageSaveMode, CancellationToken token) { if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (packageIdentity == null) { throw new ArgumentNullException(nameof(packageIdentity)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } // TODO: Need to handle PackageSaveMode // TODO: Support overwriting files also? var filesAdded = new List <string>(); var nuspecReader = new NuspecReader(packageReader.GetNuspec()); packageIdentity = nuspecReader.GetIdentity(); var packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentity)); var packageDirectory = packageDirectoryInfo.FullName; foreach (var file in packageReader.GetFiles().Where(file => PackageHelper.IsPackageFile(file, packageSaveMode))) { token.ThrowIfCancellationRequested(); var targetPath = Path.Combine(packageDirectory, file); Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); using (var sourceStream = packageReader.GetStream(file)) { using (var targetStream = new FileStream(targetPath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 1024, useAsync: true)) { await sourceStream.CopyToAsync(targetStream); } } filesAdded.Add(file); } var nupkgFilePath = Path.Combine(packageDirectory, packagePathResolver.GetPackageFileName(packageIdentity)); if (packageSaveMode.HasFlag(PackageSaveModes.Nupkg)) { // During package extraction, nupkg is the last file to be created // Since all the packages are already created, the package stream is likely positioned at its end // Reset it if (packageStream.Position != 0) { if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } packageStream.Position = 0; } filesAdded.Add(await PackageHelper.CreatePackageFile(nupkgFilePath, packageStream, token)); } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext == null || packageExtractionContext.CopySatelliteFiles) { PackageIdentity runtimeIdentity; string packageLanguage; var isSatellitePackage = PackageHelper.IsSatellitePackage(nuspecReader, out runtimeIdentity, out packageLanguage); // Short-circuit this if the package is not a satellite package. if (isSatellitePackage) { filesAdded.AddRange(await CopySatelliteFilesAsync(packageIdentity, packagePathResolver, packageSaveMode, token)); } } return(filesAdded); }