public static bool GetSatelliteFiles(Stream packageStream, PackageIdentity packageIdentity, PackagePathResolver packagePathResolver, out string language, out string runtimePackageDirectory, out IEnumerable <ZipArchiveEntry> satelliteFiles) { var zipArchive = new ZipArchive(packageStream); var packageReader = new PackageReader(zipArchive); var nuspecReader = new NuspecReader(packageReader.GetNuspec()); PackageIdentity runtimePackageIdentity = null; string packageLanguage = null; if (PackageHelper.IsSatellitePackage(nuspecReader, out runtimePackageIdentity, out packageLanguage)) { // Now, we know that the package is a satellite package and that the runtime package is 'runtimePackageId' // Check, if the runtimePackage is installed and get the folder to copy over files string runtimePackageFilePath = packagePathResolver.GetInstalledPackageFilePath(runtimePackageIdentity); if (File.Exists(runtimePackageFilePath)) { runtimePackageDirectory = Path.GetDirectoryName(runtimePackageFilePath); // Existence of the package file is the validation that the package exists var libItemGroups = packageReader.GetLibItems(); List <ZipArchiveEntry> satelliteFileEntries = new List <ZipArchiveEntry>(); foreach (var libItemGroup in libItemGroups) { var satelliteFilesInGroup = libItemGroup.Items.Where(item => Path.GetDirectoryName(item).Split(Path.DirectorySeparatorChar) .Contains(packageLanguage, StringComparer.OrdinalIgnoreCase)); foreach (var satelliteFile in satelliteFilesInGroup) { var zipArchiveEntry = zipArchive.GetEntry(satelliteFile); if (zipArchiveEntry != null) { satelliteFileEntries.Add(zipArchiveEntry); } } } if (satelliteFileEntries.Count > 0) { language = packageLanguage; satelliteFiles = satelliteFileEntries; return(true); } } } language = null; runtimePackageDirectory = null; satelliteFiles = null; return(false); }
public static void CheckMinClientVersion(Stream packageStream, PackageIdentity packageIdentity) { var packageZipArchive = new ZipArchive(packageStream); var packageReader = new PackageReader(packageZipArchive); var nuspecReader = new NuspecReader(packageReader.GetNuspec()); var packageMinClientVersion = nuspecReader.GetMinClientVersion(); // validate that the current version of NuGet satisfies the minVersion attribute specified in the .nuspec if (Constants.NuGetSemanticVersion < packageMinClientVersion) { throw new NuGetVersionNotSatisfiedException( String.Format(CultureInfo.CurrentCulture, Strings.PackageMinVersionNotSatisfied, packageIdentity, packageMinClientVersion.ToNormalizedString(), Constants.NuGetSemanticVersion.ToNormalizedString())); } }
public static IVsPackageMetadata CreateMetadata(string nupkgPath, PackageIdentity package) { IEnumerable<string> authors = Enumerable.Empty<string>(); string description = string.Empty; string title = package.Id; string installPath = string.Empty; try { // installPath is the nupkg path FileInfo file = new FileInfo(nupkgPath); installPath = file.Directory.FullName; PackageReader reader = new PackageReader(file.OpenRead()); using (var nuspecStream = reader.GetNuspec()) { NuspecReader nuspec = new NuspecReader(nuspecStream); var metadata = nuspec.GetMetadata(); authors = GetNuspecValue(metadata, "authors").Split(',').ToArray(); title = GetNuspecValue(metadata, "title"); description = GetNuspecValue(metadata, "description"); } } catch (Exception ex) { // ignore errors from reading the extra fields Debug.Fail(ex.ToString()); } if (String.IsNullOrEmpty(title)) { title = package.Id; } return new VsPackageMetadata(package, title, authors, description, installPath); }
public static bool GetSatelliteFiles(Stream packageStream, PackageIdentity packageIdentity, PackagePathResolver packagePathResolver, out string language, out string runtimePackageDirectory, out IEnumerable<ZipArchiveEntry> satelliteFiles) { var zipArchive = new ZipArchive(packageStream); var packageReader = new PackageReader(zipArchive); var nuspecReader = new NuspecReader(packageReader.GetNuspec()); PackageIdentity runtimePackageIdentity = null; string packageLanguage = null; if (IsSatellitePackage(nuspecReader, out runtimePackageIdentity, out packageLanguage)) { // Now, we know that the package is a satellite package and that the runtime package is 'runtimePackageId' // Check, if the runtimePackage is installed and get the folder to copy over files var runtimePackageFilePath = packagePathResolver.GetInstalledPackageFilePath(runtimePackageIdentity); if (File.Exists(runtimePackageFilePath)) { runtimePackageDirectory = Path.GetDirectoryName(runtimePackageFilePath); // Existence of the package file is the validation that the package exists var libItemGroups = packageReader.GetLibItems(); var satelliteFileEntries = new List<ZipArchiveEntry>(); foreach (var libItemGroup in libItemGroups) { var satelliteFilesInGroup = libItemGroup.Items.Where(item => Path.GetDirectoryName(item).Split(Path.DirectorySeparatorChar) .Contains(packageLanguage, StringComparer.OrdinalIgnoreCase)); foreach (var satelliteFile in satelliteFilesInGroup) { var zipArchiveEntry = zipArchive.GetEntry(satelliteFile); if (zipArchiveEntry != null) { satelliteFileEntries.Add(zipArchiveEntry); } } } if (satelliteFileEntries.Count > 0) { language = packageLanguage; satelliteFiles = satelliteFileEntries; return true; } } } language = null; runtimePackageDirectory = null; satelliteFiles = null; return false; }
public static NuGetDependencyInfo GetDependencyInfo(FileInfo nupkgPath) { if (!nupkgPath.Exists) { throw new FileNotFoundException(nupkgPath.FullName); } using (var stream =nupkgPath.OpenRead()) { ZipFileSystem zip = new ZipFileSystem(stream); using (PackageReader packageReader = new PackageReader(zip)) { using (var nuspecStream = packageReader.GetNuspec()) { NuspecReader reader = new NuspecReader(nuspecStream); NuGetPackageId package = CreateIdentity(reader, nupkgPath.FullName); List<NuGetDependencyGroup> dependencyGroups = new List<NuGetDependencyGroup>(); foreach (var depGroup in reader.GetDependencyGroups()) { FrameworkName framework = Utilities.GetFrameworkName(depGroup.TargetFramework); NuGetDependency[] dependencies = depGroup.Packages.Select(d => new NuGetDependency(d.Id, VersionRange.Parse(d.VersionRange))).ToArray(); dependencyGroups.Add(new NuGetDependencyGroup(framework, dependencies)); } return new NuGetDependencyInfo(package, dependencyGroups); } } } }
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( 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; }
private List<CachedPackageInfo> GetPackageInfos(string id) { List<CachedPackageInfo> cachedPackageInfos; if (_packageInfoCache.TryGetValue(id, out cachedPackageInfos)) { cachedPackageInfos = cachedPackageInfos.ToList(); } var result = new List<CachedPackageInfo>(); // packages\{packageId}.{version}.nupkg foreach (var nupkgInfo in GetNupkgFiles(_source, id)) { var cachedPackageInfo = cachedPackageInfos?.FirstOrDefault(package => string.Equals(package.Path, nupkgInfo.FullName, StringComparison.OrdinalIgnoreCase)); if (cachedPackageInfo != null && cachedPackageInfo.LastWriteTimeUtc == nupkgInfo.LastWriteTimeUtc) { result.Add(cachedPackageInfo); } using (var stream = nupkgInfo.OpenRead()) { var packageReader = new PackageReader(stream); NuspecReader reader; try { reader = new NuspecReader(packageReader.GetNuspec()); } catch (XmlException ex) { var message = string.Format(CultureInfo.CurrentCulture, Strings.Protocol_PackageMetadataError, nupkgInfo.Name, _source); throw new NuGetProtocolException(message, ex); } catch (PackagingException ex) { var message = string.Format(CultureInfo.CurrentCulture, Strings.Protocol_PackageMetadataError, nupkgInfo.Name, _source); throw new NuGetProtocolException(message, ex); } if (string.Equals(reader.GetId(), id, StringComparison.Ordinal)) { result.Add(new CachedPackageInfo { Path = nupkgInfo.FullName, Reader = reader }); } } } _packageInfoCache.TryAdd(id, result); return result; }