Example #1
0
        /// <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);
        }