/// <summary> /// Returns artifact info for packages in a packages.config that match the given set of properties. /// </summary> /// <param name="configPath">Path to packages.config</param> /// <param name="properties">Property values to filter on</param> /// <returns>Artifacts matching the property filters.</returns> public static IEnumerable<NuGetArtifactInfo> GetArtifactInfo(string configPath, IEnumerable<string> propertyKeys) { if (configPath == null) { throw new ArgumentNullException("configPath"); } if (propertyKeys == null) { throw new ArgumentNullException("propertyKeys"); } FileInfo file = new FileInfo(configPath); if (!file.Exists) { throw new FileNotFoundException(configPath); } List<NuGetArtifactInfo> results = new List<NuGetArtifactInfo>(); using (FileStream stream = file.OpenRead()) { ConfigReader configReader = new ConfigReader(stream); foreach (PackageIdentity package in configReader.GetPackages()) { // TODO: find the real path string packageName = package.Id + "." + package.Version.ToString(); FileInfo nupkgPath = new FileInfo(Path.Combine(file.Directory.Parent.FullName, "packages", packageName, packageName + ".nupkg")); if (!nupkgPath.Exists) { throw new FileNotFoundException(nupkgPath.FullName); } NuGetPackageId id = new NuGetPackageId(package.Id, package.Version, nupkgPath.Directory.FullName); ZipFileSystem zip = new ZipFileSystem(nupkgPath.OpenRead()); using (PackageReader packageReader = new PackageReader(zip)) { ComponentTree tree = null; // TODO: add a better check for this if (packageReader.GetPackedManifest() == null) { using (LegacyPackageReader legacyReader = new LegacyPackageReader(zip)) { throw new NotImplementedException(); //var packed = PackedManifestCreator.FromLegacy(legacyReader); //tree = packed.ComponentTree; } } else { tree = packageReader.GetComponentTree(); } List<NuGetArtifactGroup> groups = new List<NuGetArtifactGroup>(); // TODO: use propertyKeys // TODO: get full paths foreach (var path in tree.GetPaths()) { var props = path.Properties.Select(p => (KeyValueTreeProperty)p).Select(p => new KeyValuePair<string, string>(p.Key, p.Value)); var items = path.Items.Select(i => (NuGetTreeItem)i).Select(i => new NuGetArtifact(i.Type, i.Data.Where(p => p.Key == "path").Select(p => p.Value).Single())); groups.Add(new NuGetArtifactGroup(props, items)); } NuGetArtifactInfo info = new NuGetArtifactInfo(id, groups.ToArray()); results.Add(info); } } } return results; }