/// <inheritdoc/>
        public void Scan(IAggregator aggregator, Dictionary <string, PackageDeclaration> output)
        {
            if (aggregator == null || aggregator.RootPath == null)
            {
                throw new ArgumentNullException($"{nameof(aggregator)} or one of its property must not be null.");
            }

            if (output == null)
            {
                throw new ArgumentNullException($"{nameof(output)} must not be null.");
            }

            var nugetFiles = Directory.EnumerateFiles(
                aggregator.RootPath,
                "*.nuspec",
                SearchOption.AllDirectories).ToArray();

            var xmlNsResolver = new NsResolver(
                new Dictionary <string, string>()
            {
                { "n", "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" },
            });

            foreach (var nugetFile in nugetFiles)
            {
                var nuspecFileName = Path.GetFileNameWithoutExtension(nugetFile);
                var nugetName      = nuspecFileName;

                using var nugetFileStream = File.OpenRead(nugetFile);
                using var xmlReader       = XmlReader.Create(nugetFileStream);
                var xmlProj = XDocument.Load(xmlReader);

                var packageId = xmlProj.XPathSelectElements(
                    "/n:package/n:metadata/n:id",
                    xmlNsResolver)
                                .SingleOrDefault();

                if (packageId != null)
                {
                    nugetName = packageId.Value;
                }

                // match with the project name
                var prj = aggregator.AllProjects.Where(p => p.Name == nugetName || p.Name == nuspecFileName).FirstOrDefault();
                if (prj != null && !output.ContainsKey(nugetName))
                {
                    var version = xmlProj.XPathSelectElements(
                        "/n:package/n:metadata/n:version",
                        xmlNsResolver)
                                  .SingleOrDefault();

                    output.Add(nugetName, new PackageDeclaration(nugetFile, nugetName, version?.Value, new[] { prj }));
                }
            }
        }
Exemple #2
0
        /// <inheritdoc/>
        public void Scan(IAggregator aggregator, Dictionary <string, PackageDeclaration> output)
        {
            if (aggregator == null || aggregator.RootPath == null)
            {
                throw new ArgumentNullException($"{nameof(aggregator)} or one of its property must not be null.");
            }

            if (output == null)
            {
                throw new ArgumentNullException($"{nameof(output)} must not be null.");
            }

            var nugetFiles = Directory.EnumerateFiles(
                aggregator.RootPath,
                "*.nuspec",
                SearchOption.AllDirectories).ToArray();

            var xmlNsResolver = new NsResolver(
                new Dictionary <string, string>()
            {
                { "n", "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd" },
            });

            foreach (var nugetFile in nugetFiles)
            {
                var nuspecFileName = Path.GetFileNameWithoutExtension(nugetFile);
                var nugetName      = nuspecFileName;

                using var nugetFileStream = File.OpenRead(nugetFile);
                using var xmlReader       = XmlReader.Create(nugetFileStream);
                var xmlProj = XDocument.Load(xmlReader);

                var packageId = xmlProj.XPathSelectElements(
                    "/n:package/n:metadata/n:id",
                    xmlNsResolver)
                                .SingleOrDefault();

                if (packageId != null)
                {
                    nugetName = packageId.Value;
                }

                // match with the project name
                var prj = aggregator.AllProjects.Where(p => p.Name == nugetName || p.Name == nuspecFileName).FirstOrDefault();
                if (prj != null && !output.ContainsKey(nugetName))
                {
                    var version = xmlProj.XPathSelectElements(
                        "/n:package/n:metadata/n:version",
                        xmlNsResolver)
                                  .SingleOrDefault();

                    output.Add(nugetName, new PackageDeclaration(nugetFile, nugetName, version?.Value, new[] { prj }));
                }
                else
                {
                    // Scan files elements.
                    var fileElements = xmlProj.XPathSelectElements(
                        "/n:package/n:files/n:file",
                        xmlNsResolver);

                    var projects = new List <Project>();

                    foreach (var fileElement in fileElements)
                    {
                        var srcAttribute    = fileElement.Attributes().SingleOrDefault(a => a.Name.LocalName == "src");
                        var targetAttribute = fileElement.Attributes().SingleOrDefault(a => a.Name.LocalName == "target");
                        if (srcAttribute != null && targetAttribute != null)
                        {
                            var src    = srcAttribute.Value;
                            var target = targetAttribute.Value;
                            if (target.StartsWith("lib", StringComparison.InvariantCultureIgnoreCase) &&
                                src.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase))
                            {
                                src = src.Replace("\\", "/", StringComparison.InvariantCulture);
                                var assemblyName = Path.GetFileNameWithoutExtension(src);
                                var assemblyPrj  = aggregator.AllProjects.Where(p => p.Name == assemblyName).FirstOrDefault();
                                if (assemblyPrj != null)
                                {
                                    projects.Add(assemblyPrj);
                                }
                            }
                        }
                    }

                    if (projects.Any() && !output.ContainsKey(nugetName))
                    {
                        var version = xmlProj.XPathSelectElements(
                            "/n:package/n:metadata/n:version",
                            xmlNsResolver)
                                      .SingleOrDefault();

                        output.Add(nugetName, new PackageDeclaration(nugetFile, nugetName, version?.Value, projects));
                    }
                }
            }
        }