public async Task TestFolderNuGetProjectInstall() { // Arrange var packageIdentity = new PackageIdentity("packageA", new NuGetVersion("1.0.0")); var randomTestSourcePath = TestFilesystemUtility.CreateRandomTestFolder(); var packageFileInfo = TestPackages.GetLegacyTestPackage(randomTestSourcePath, packageIdentity.Id, packageIdentity.Version.ToNormalizedString()); var randomTestDestinationPath = TestFilesystemUtility.CreateRandomTestFolder(); var folderNuGetProject = new FolderNuGetProject(randomTestDestinationPath); var packagePathResolver = new PackagePathResolver(randomTestDestinationPath); var packageInstallPath = packagePathResolver.GetInstallPath(packageIdentity); var nupkgFilePath = Path.Combine(packageInstallPath, packagePathResolver.GetPackageFileName(packageIdentity)); var testNuGetProjectContext = new TestNuGetProjectContext(); var token = CancellationToken.None; using(var packageStream = packageFileInfo.OpenRead()) { // Act await folderNuGetProject.InstallPackageAsync(packageIdentity, packageStream, testNuGetProjectContext, token); } // Assert Assert.True(File.Exists(nupkgFilePath)); Assert.True(File.Exists(Path.Combine(packageInstallPath, "lib/test.dll"))); using(var packageStream = File.OpenRead(nupkgFilePath)) { var zipArchive = new ZipArchive(packageStream); Assert.Equal(5, zipArchive.Entries.Count); } // Clean-up TestFilesystemUtility.DeleteRandomTestFolders(randomTestSourcePath, randomTestDestinationPath); }
public static async Task <IEnumerable <string> > ExtractPackageAsync( string source, PackageReaderBase packageReader, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, CancellationToken token, Guid parentId = default(Guid)) { if (packageReader == null) { throw new ArgumentNullException(nameof(packageReader)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } token.ThrowIfCancellationRequested(); var packageSaveMode = packageExtractionContext.PackageSaveMode; var extractionId = Guid.NewGuid(); var filesAdded = new List <string>(); using (var telemetry = TelemetryActivity.CreateTelemetryActivityWithNewOperationId(parentId)) { var packageIdentityFromNuspec = await packageReader.GetIdentityAsync(token); 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 packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentityFromNuspec)); var packageDirectory = packageDirectoryInfo.FullName; var packageFiles = await packageReader.GetPackageFilesAsync(packageSaveMode, token); var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(await packageReader.CopyFilesAsync( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); if (packageSaveMode.HasFlag(PackageSaveMode.Nupkg)) { var nupkgFilePath = Path.Combine(packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); var filePath = await packageReader.CopyNupkgAsync(nupkgFilePath, token); if (!string.IsNullOrEmpty(filePath)) { filesAdded.Add(filePath); } } // 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 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 async Task <IEnumerable <string> > ExtractPackageAsync( string source, PackageReaderBase packageReader, Stream packageStream, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, CancellationToken token, Guid parentId = default(Guid)) { if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } var packageSaveMode = packageExtractionContext.PackageSaveMode; var extractionId = Guid.NewGuid(); var nupkgStartPosition = packageStream.Position; var filesAdded = new List <string>(); using (var telemetry = TelemetryActivity.CreateTelemetryActivityWithNewOperationId(parentId)) { var packageIdentityFromNuspec = await packageReader.GetIdentityAsync(token); 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 packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentityFromNuspec)); var packageDirectory = packageDirectoryInfo.FullName; var packageFiles = await packageReader.GetPackageFilesAsync(packageSaveMode, token); var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(await packageReader.CopyFilesAsync( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); var nupkgFilePath = Path.Combine(packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); if (packageSaveMode.HasFlag(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 if (packageStream.Position != 0) { if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } packageStream.Position = 0; } 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); }
public static IEnumerable <string> ExtractPackage( PackageReaderBase packageReader, Stream packageStream, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, CancellationToken token) { if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } var packageSaveMode = packageExtractionContext.PackageSaveMode; var nupkgStartPosition = packageStream.Position; var filesAdded = new List <string>(); var packageIdentityFromNuspec = packageReader.GetIdentity(); var packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentityFromNuspec)); var packageDirectory = packageDirectoryInfo.FullName; var packageFiles = packageReader.GetPackageFiles(packageSaveMode); var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(packageReader.CopyFiles( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); var nupkgFilePath = Path.Combine(packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); if (packageSaveMode.HasFlag(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 if (packageStream.Position != 0) { if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } packageStream.Position = 0; } 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); }
public static async Task <IEnumerable <string> > ExtractPackageAsync( PackageReaderBase packageReader, PackagePathResolver packagePathResolver, 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)); } token.ThrowIfCancellationRequested(); var packageSaveMode = packageExtractionContext.PackageSaveMode; var filesAdded = new List <string>(); var packageIdentityFromNuspec = await packageReader.GetIdentityAsync(token); var packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentityFromNuspec)); var packageDirectory = packageDirectoryInfo.FullName; var packageFiles = await packageReader.GetPackageFilesAsync(packageSaveMode, token); var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(await packageReader.CopyFilesAsync( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); if (packageSaveMode.HasFlag(PackageSaveMode.Nupkg)) { var nupkgFilePath = Path.Combine(packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); var filePath = await packageReader.CopyNupkgAsync(nupkgFilePath, token); if (!string.IsNullOrEmpty(filePath)) { filesAdded.Add(filePath); } } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext.CopySatelliteFiles) { filesAdded.AddRange(await CopySatelliteFilesAsync( packageReader, packagePathResolver, packageSaveMode, packageExtractionContext, token)); } return(filesAdded); }
public static async Task <IEnumerable <string> > ExtractPackageAsync(Stream packageStream, PackageIdentity packageIdentity, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, PackageSaveModes packageSaveMode, CancellationToken token) { List <string> filesAdded = new List <string>(); if (packageStream == null) { throw new ArgumentNullException("packageStream"); } if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } if (packageIdentity == null) { throw new ArgumentNullException("packageIdentity"); } if (packagePathResolver == null) { throw new ArgumentNullException("packagePathResolver"); } // TODO: Need to handle PackageSaveMode // TODO: Support overwriting files also? long nupkgStartPosition = packageStream.Position; var zipArchive = new ZipArchive(packageStream); // default to non-legacy paths bool useLegacyPaths = packageExtractionContext == null ? false : packageExtractionContext.UseLegacyPackageInstallPath; var packageReader = new PackageReader(zipArchive); var nuspecReader = new NuspecReader(packageReader.GetNuspec()); NuGetVersion packageVersionFromNuspec = nuspecReader.GetVersion(); var packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(new PackageIdentity(packageIdentity.Id, packageVersionFromNuspec), useLegacyPaths)); string packageDirectory = packageDirectoryInfo.FullName; filesAdded.AddRange(await PackageHelper.CreatePackageFiles(zipArchive.Entries, packageDirectory, packageSaveMode, token)); string 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 to the nupkgStartPosition packageStream.Seek(nupkgStartPosition, SeekOrigin.Begin); filesAdded.Add(await PackageHelper.CreatePackageFile(nupkgFilePath, packageStream, token)); } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext == null || packageExtractionContext.CopySatelliteFiles) { filesAdded.AddRange(await CopySatelliteFilesAsync(packageIdentity, packagePathResolver, packageSaveMode, token)); } return(filesAdded); }
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; }
public static async Task<IEnumerable<string>> ExtractPackageAsync( Stream packageStream, PackageIdentity packageIdentity, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, PackageSaveModes packageSaveMode, CancellationToken token) { var filesAdded = new List<string>(); if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } 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 zipArchive = new ZipArchive(packageStream); var packageReader = new PackageReader(zipArchive); var nuspecReader = new NuspecReader(packageReader.GetNuspec()); packageIdentity = nuspecReader.GetIdentity(); var packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentity)); var packageDirectory = packageDirectoryInfo.FullName; filesAdded.AddRange(await PackageHelper.CreatePackageFiles(zipArchive.Entries, packageDirectory, packageSaveMode, token)); 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 packageStream.Seek(0, SeekOrigin.Begin); filesAdded.Add(await PackageHelper.CreatePackageFile(nupkgFilePath, packageStream, token)); } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext == null || packageExtractionContext.CopySatelliteFiles) { filesAdded.AddRange(await CopySatelliteFilesAsync(packageIdentity, packagePathResolver, packageSaveMode, token)); } return filesAdded; }
public async Task TestFolderNuGetProjectDeletePackage() { // Arrange var packageIdentity = new PackageIdentity("packageA", new NuGetVersion("1.0.0")); var randomTestSourcePath = TestFilesystemUtility.CreateRandomTestFolder(); var packageFileInfo = TestPackages.GetLegacyContentPackage(randomTestSourcePath, packageIdentity.Id, packageIdentity.Version.ToNormalizedString()); var randomTestDestinationPath = TestFilesystemUtility.CreateRandomTestFolder(); var folderNuGetProject = new FolderNuGetProject(randomTestDestinationPath); var packagePathResolver = new PackagePathResolver(randomTestDestinationPath); var packageInstallPath = packagePathResolver.GetInstallPath(packageIdentity); var nupkgFilePath = Path.Combine(packageInstallPath, packagePathResolver.GetPackageFileName(packageIdentity)); var testNuGetProjectContext = new TestNuGetProjectContext(); var token = CancellationToken.None; using (var packageStream = packageFileInfo.OpenRead()) { // Act await folderNuGetProject.InstallPackageAsync(packageIdentity, packageStream, testNuGetProjectContext, token); } var unNormalizedPackageIdentity = new PackageIdentity(packageIdentity.Id, new NuGetVersion(packageIdentity.Version + ".0")); // Assert Assert.True(File.Exists(nupkgFilePath)); Assert.True(File.Exists(Path.Combine(packageInstallPath, "Content/Scripts/test1.js"))); using (var packageStream = File.OpenRead(nupkgFilePath)) { var zipArchive = new ZipArchive(packageStream); Assert.Equal(6, zipArchive.Entries.Count); } Assert.True(folderNuGetProject.PackageExists(packageIdentity)); var packageDirectoryPath = folderNuGetProject.GetInstalledPath(unNormalizedPackageIdentity); Assert.True(!String.IsNullOrEmpty(packageDirectoryPath)); Assert.True(Directory.Exists(packageDirectoryPath)); // Main Act await folderNuGetProject.DeletePackage(packageIdentity, testNuGetProjectContext, CancellationToken.None); // Assert Assert.False(folderNuGetProject.PackageExists(unNormalizedPackageIdentity)); // Check that the package directories are deleted Assert.False(Directory.Exists(packageDirectoryPath)); // Clean-up TestFilesystemUtility.DeleteRandomTestFolders(randomTestSourcePath, randomTestDestinationPath); }
public async Task TestPacManOpenReadmeFile() { // Arrange var sourceRepositoryProvider = TestSourceRepositoryUtility.CreateV3OnlySourceRepositoryProvider(); var testSolutionManager = new TestSolutionManager(); var testSettings = new NullSettings(); var token = CancellationToken.None; var nuGetPackageManager = new NuGetPackageManager(sourceRepositoryProvider, testSettings, testSolutionManager); var packagesFolderPath = PackagesFolderPathUtility.GetPackagesFolderPath(testSolutionManager, testSettings); var packagePathResolver = new PackagePathResolver(packagesFolderPath); var randomPackagesConfigFolderPath = TestFilesystemUtility.CreateRandomTestFolder(); var randomPackagesConfigPath = Path.Combine(randomPackagesConfigFolderPath, "packages.config"); var testNuGetProjectContext = new TestNuGetProjectContext(); var projectTargetFramework = NuGetFramework.Parse("net45"); var msBuildNuGetProjectSystem = new TestMSBuildNuGetProjectSystem(projectTargetFramework, testNuGetProjectContext); var msBuildNuGetProject = new MSBuildNuGetProject(msBuildNuGetProjectSystem, packagesFolderPath, randomPackagesConfigPath); var packageIdentity = new PackageIdentity("elmah", new NuGetVersion("1.2.2")); // Pre-Assert // Check that the packages.config file does not exist Assert.False(File.Exists(randomPackagesConfigPath)); // Check that there are no packages returned by PackagesConfigProject var packagesInPackagesConfig = (await msBuildNuGetProject.PackagesConfigNuGetProject.GetInstalledPackagesAsync(token)).ToList(); Assert.Equal(0, packagesInPackagesConfig.Count); Assert.Equal(0, msBuildNuGetProjectSystem.References.Count); // Act // Set the direct install on the execution context of INuGetProjectContext before installing a package testNuGetProjectContext.TestExecutionContext = new TestExecutionContext(packageIdentity); await nuGetPackageManager.InstallPackageAsync(msBuildNuGetProject, packageIdentity, new ResolutionContext(), testNuGetProjectContext, sourceRepositoryProvider.GetRepositories().First(), null, token); // Assert // Check that the packages.config file exists after the installation Assert.True(File.Exists(randomPackagesConfigPath)); // Check the number of packages and packages returned by PackagesConfigProject after the installation packagesInPackagesConfig = (await msBuildNuGetProject.PackagesConfigNuGetProject.GetInstalledPackagesAsync(token)).ToList(); Assert.Equal(2, packagesInPackagesConfig.Count); Assert.Equal(packageIdentity, packagesInPackagesConfig[0].PackageIdentity); Assert.Equal(projectTargetFramework, packagesInPackagesConfig[0].TargetFramework); Assert.Equal(1, testNuGetProjectContext.TestExecutionContext.FilesOpened.Count); Assert.True(String.Equals(Path.Combine(packagePathResolver.GetInstallPath(packageIdentity), "ReadMe.txt"), testNuGetProjectContext.TestExecutionContext.FilesOpened.First(), StringComparison.OrdinalIgnoreCase)); // Clean-up TestFilesystemUtility.DeleteRandomTestFolders(testSolutionManager.SolutionDirectory, randomPackagesConfigFolderPath); }
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); }