/// <summary> /// Creates a new <see cref="NugetPackage"/> from the given <see cref="NuspecFile"/>. /// </summary> /// <param name="nuspec">The <see cref="NuspecFile"/> to use to create the <see cref="NugetPackage"/>.</param> /// <returns>The newly created <see cref="NugetPackage"/>.</returns> public static NugetPackage FromNuspec(NuspecFile nuspec) { var package = new NugetPackage { Id = nuspec.Id, Version = nuspec.Version, Title = nuspec.Title, Description = nuspec.Description, ReleaseNotes = nuspec.ReleaseNotes, LicenseUrl = nuspec.LicenseUrl, ProjectUrl = nuspec.ProjectUrl, Authors = nuspec.Authors, Summary = nuspec.Summary }; if (!string.IsNullOrEmpty(nuspec.IconUrl)) { SystemProxy.DownloadAndSetIcon(package, nuspec.IconUrl); } package.RepositoryUrl = nuspec.RepositoryUrl; try { package.RepositoryType = (RepositoryType)Enum.Parse(typeof(RepositoryType), nuspec.RepositoryType, true); } catch (Exception) { } package.RepositoryBranch = nuspec.RepositoryBranch; package.RepositoryCommit = nuspec.RepositoryCommit; // if there is no title, just use the ID as the title if (string.IsNullOrEmpty(package.Title)) { package.Title = package.Id; } package.Dependencies = nuspec.Dependencies; return(package); }
/// <summary> /// Parses the given <see cref="XDocument"/> and returns the list of <see cref="NugetPackage"/>s contained within. /// </summary> /// <param name="document">The <see cref="XDocument"/> that is the OData XML response from the NuGet server.</param> /// <returns>The list of <see cref="NugetPackage"/>s read from the given XML.</returns> public static List <NugetPackage> Parse(XDocument document) { var packages = new List <NugetPackage>(); IEnumerable <XElement> packageEntries; if (document.Root.Name.Equals(XName.Get("entry", AtomNamespace))) { packageEntries = Enumerable.Repeat(document.Root, 1); } else { packageEntries = document.Root.Elements(XName.Get("entry", AtomNamespace)); } foreach (var entry in packageEntries) { var package = new NugetPackage { Id = entry.GetAtomElement("title").Value, DownloadUrl = entry.GetAtomElement("content").Attribute("src").Value }; var entryProperties = entry.Element(XName.Get("properties", MetaDataNamespace)); package.Title = entryProperties.GetProperty("Title"); package.Version = entryProperties.GetProperty("Version"); package.Description = entryProperties.GetProperty("Description"); package.Summary = entryProperties.GetProperty("Summary"); package.ReleaseNotes = entryProperties.GetProperty("ReleaseNotes"); package.LicenseUrl = entryProperties.GetProperty("LicenseUrl"); package.ProjectUrl = entryProperties.GetProperty("ProjectUrl"); package.Authors = entryProperties.GetProperty("Authors"); package.DownloadCount = int.Parse(entryProperties.GetProperty("DownloadCount")); var iconUrl = entryProperties.GetProperty("IconUrl"); if (!string.IsNullOrEmpty(iconUrl)) { SystemProxy.DownloadAndSetIcon(package, iconUrl); } // if there is no title, just use the ID as the title if (string.IsNullOrEmpty(package.Title)) { package.Title = package.Id; } // Get dependencies var rawDependencies = entryProperties.GetProperty("Dependencies"); if (!string.IsNullOrEmpty(rawDependencies)) { var dependencyGroups = new Dictionary <string, NugetFrameworkGroup>(); var dependencies = rawDependencies.Split('|'); foreach (var dependencyString in dependencies) { var details = dependencyString.Split(':'); var framework = string.Empty; if (details.Length > 2) { framework = details[2]; } if (!dependencyGroups.TryGetValue(framework, out var group)) { group = new NugetFrameworkGroup { TargetFramework = framework }; dependencyGroups.Add(framework, group); } var dependency = new NugetPackageIdentifier(details[0], details[1]); // some packages (ex: FSharp.Data - 2.1.0) have improper "semi-empty" dependencies such as: // "Zlib.Portable:1.10.0:portable-net40+sl50+wp80+win80|::net40" // so we need to only add valid dependencies and skip invalid ones if (!string.IsNullOrEmpty(dependency.Id) && !string.IsNullOrEmpty(dependency.Version) && dependency.Id != "NETStandard.Library") { group.Dependencies.Add(dependency); } } foreach (var group in dependencyGroups.Values) { if (group.Dependencies.Count > 0) { package.Dependencies.Add(group); } } } packages.Add(package); } return(packages); }