private static void CreatePart(ZipArchive package, string path, Stream sourceStream) { if (PackageHelper.IsManifest(path) || ProjectJsonPathUtilities.IsProjectConfig(path)) { return; } string entryName = CreatePartEntryName(path); var entry = package.CreateEntry(entryName, CompressionLevel.Optimal); using (var stream = entry.Open()) { sourceStream.CopyTo(stream); } }
protected static string GetNuspecFile(IEnumerable <string> files) { // Find all nuspecs in the root folder. var nuspecPaths = files .Where(entryPath => PackageHelper.IsManifest(entryPath)) .ToList(); if (nuspecPaths.Count == 0) { throw new PackagingException(NuGetLogCode.NU5037, Strings.Error_MissingNuspecFile); } else if (nuspecPaths.Count > 1) { throw new PackagingException(Strings.MultipleNuspecFiles); } return(nuspecPaths.Single()); }
public virtual string GetNuspecFile() { // Find all nuspecs in the root folder. var nuspecPaths = GetFiles() .Where(entryPath => PackageHelper.IsManifest(entryPath)) .ToList(); if (nuspecPaths.Count == 0) { throw new PackagingException(Strings.MissingNuspec); } else if (nuspecPaths.Count > 1) { throw new PackagingException(Strings.MultipleNuspecFiles); } return(nuspecPaths.Single()); }
public static async Task <IEnumerable <string> > ExtractPackageAsync( string source, Stream packageStream, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, CancellationToken token, Guid parentId = default(Guid)) { if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } var packageSaveMode = packageExtractionContext.PackageSaveMode; var filesAdded = new List <string>(); var nupkgStartPosition = packageStream.Position; using (var telemetry = TelemetryActivity.CreateTelemetryActivityWithNewOperationId(parentId)) { using (var packageReader = new PackageArchiveReader(packageStream, leaveStreamOpen: true)) { var packageIdentityFromNuspec = await packageReader.GetIdentityAsync(CancellationToken.None); var installPath = packagePathResolver.GetInstallPath(packageIdentityFromNuspec); var packageDirectoryInfo = Directory.CreateDirectory(installPath); var packageDirectory = packageDirectoryInfo.FullName; try { telemetry.StartIntervalMeasure(); await VerifyPackageSignatureAsync( source, telemetry.OperationId, packageIdentityFromNuspec, packageExtractionContext, packageReader, token); telemetry.EndIntervalMeasure(PackagingConstants.PackageVerifyDurationName); } catch (SignatureException) { telemetry.TelemetryEvent = new PackageExtractionTelemetryEvent( packageExtractionContext.PackageSaveMode, NuGetOperationStatus.Failed, ExtractionSource.NuGetFolderProject, packageIdentityFromNuspec); throw; } var packageFiles = await packageReader.GetPackageFilesAsync(packageSaveMode, token); if ((packageSaveMode & PackageSaveMode.Nuspec) == PackageSaveMode.Nuspec) { var sourceNuspecFile = packageFiles.Single(p => PackageHelper.IsManifest(p)); var targetNuspecPath = Path.Combine( packageDirectory, packagePathResolver.GetManifestFileName(packageIdentityFromNuspec)); // Extract the .nuspec file with a well known file name. filesAdded.Add(packageReader.ExtractFile( sourceNuspecFile, targetNuspecPath, packageExtractionContext.Logger)); packageFiles = packageFiles.Except(new[] { sourceNuspecFile }); } var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(await packageReader.CopyFilesAsync( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); if ((packageSaveMode & PackageSaveMode.Nupkg) == PackageSaveMode.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 to the nupkgStartPosition packageStream.Seek(nupkgStartPosition, SeekOrigin.Begin); var nupkgFilePath = Path.Combine( packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); filesAdded.Add(packageStream.CopyToFile(nupkgFilePath)); } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext.CopySatelliteFiles) { filesAdded.AddRange(await CopySatelliteFilesAsync( packageReader, packagePathResolver, packageSaveMode, packageExtractionContext, token)); } telemetry.TelemetryEvent = new PackageExtractionTelemetryEvent( packageExtractionContext.PackageSaveMode, NuGetOperationStatus.Succeeded, ExtractionSource.NuGetFolderProject, packageIdentityFromNuspec); } return(filesAdded); } }
public static IEnumerable <string> ExtractPackage( Stream packageStream, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, CancellationToken token) { if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } var packageSaveMode = packageExtractionContext.PackageSaveMode; var filesAdded = new List <string>(); var nupkgStartPosition = packageStream.Position; using (var packageReader = new PackageArchiveReader(packageStream, leaveStreamOpen: true)) { var packageIdentityFromNuspec = packageReader.GetIdentity(); var installPath = packagePathResolver.GetInstallPath(packageIdentityFromNuspec); var packageDirectoryInfo = Directory.CreateDirectory(installPath); var packageDirectory = packageDirectoryInfo.FullName; var packageFiles = packageReader.GetPackageFiles(packageSaveMode); if ((packageSaveMode & PackageSaveMode.Nuspec) == PackageSaveMode.Nuspec) { var sourceNuspecFile = packageFiles.Single(p => PackageHelper.IsManifest(p)); var targetNuspecPath = Path.Combine( packageDirectory, packagePathResolver.GetManifestFileName(packageIdentityFromNuspec)); // Extract the .nuspec file with a well known file name. filesAdded.Add(packageReader.ExtractFile( sourceNuspecFile, targetNuspecPath, packageExtractionContext.Logger)); packageFiles = packageFiles.Except(new[] { sourceNuspecFile }); } var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(packageReader.CopyFiles( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); if ((packageSaveMode & PackageSaveMode.Nupkg) == PackageSaveMode.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 to the nupkgStartPosition packageStream.Seek(nupkgStartPosition, SeekOrigin.Begin); var nupkgFilePath = Path.Combine( packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); filesAdded.Add(packageStream.CopyToFile(nupkgFilePath)); } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext.CopySatelliteFiles) { filesAdded.AddRange(CopySatelliteFiles( packageReader, packagePathResolver, packageSaveMode, packageExtractionContext, token)); } } return(filesAdded); }