diff --git a/NOTICE b/NOTICE index adcca1f..b43df7e 100644 --- a/NOTICE +++ b/NOTICE @@ -1,2 +1,2 @@ Net-Project-Package-Extractor -Copyright 2022-2024 Starion Group S.A. \ No newline at end of file +Copyright 2022-2025 Starion Group S.A. \ No newline at end of file diff --git a/NetProjectPackageExtractor.Tests/Commands/ExtractCommandTestFixture.cs b/NetProjectPackageExtractor.Tests/Commands/ExtractCommandTestFixture.cs index 9b82350..7e48608 100644 --- a/NetProjectPackageExtractor.Tests/Commands/ExtractCommandTestFixture.cs +++ b/NetProjectPackageExtractor.Tests/Commands/ExtractCommandTestFixture.cs @@ -92,7 +92,7 @@ public async Task Verify_that_InvokeAsync_returns_0() this.projectFileExtractor.Verify(x => x.QueryProjectFiles(It.IsAny()), Times.Once); - this.projectFileParser.Verify(x => x.Parse(It.IsAny>() + this.projectFileParser.Verify(x => x.Parse(It.IsAny>(), It.IsAny() ), Times.Once); Assert.That(result, Is.EqualTo(0)); diff --git a/NetProjectPackageExtractor.Tests/NetProjectPackageExtractor.Tests.csproj b/NetProjectPackageExtractor.Tests/NetProjectPackageExtractor.Tests.csproj index 7b4a9d5..3449235 100644 --- a/NetProjectPackageExtractor.Tests/NetProjectPackageExtractor.Tests.csproj +++ b/NetProjectPackageExtractor.Tests/NetProjectPackageExtractor.Tests.csproj @@ -5,17 +5,17 @@ enable false Starion Group S.A. - Sam Gerené, Alexander van Delft - Copyright 2022-2024 Starion Group S.A. + Sam Gerené, Alexander van Delft, Anh Toan Bui Long + Copyright 2022-2025 Starion Group S.A. - + - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -28,12 +28,26 @@ + Always + + Always + + + Always + + + Always + + + Always + + Always diff --git a/NetProjectPackageExtractor.Tests/Resources/ResourceLoaderTestFixture.cs b/NetProjectPackageExtractor.Tests/Resources/ResourceLoaderTestFixture.cs index b3ee4dd..eda52e2 100644 --- a/NetProjectPackageExtractor.Tests/Resources/ResourceLoaderTestFixture.cs +++ b/NetProjectPackageExtractor.Tests/Resources/ResourceLoaderTestFixture.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/Directory.Packages.props b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/Directory.Packages.props new file mode 100644 index 0000000..ac8699c --- /dev/null +++ b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/Directory.Packages.props @@ -0,0 +1,9 @@ + + + true + false + + + + + \ No newline at end of file diff --git a/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubFolder1.2.csproj b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubFolder1.2.csproj new file mode 100644 index 0000000..3268d81 --- /dev/null +++ b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubFolder1.2.csproj @@ -0,0 +1,15 @@ + + + + Exe + netstandard2.0 + disable + SubFolder1.2 Project + SubFolder1.2-Project + + + + + + + \ No newline at end of file diff --git a/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubsubFolder1.2.1/SubSubFolder1.2.1.csproj b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubsubFolder1.2.1/SubSubFolder1.2.1.csproj new file mode 100644 index 0000000..bc06385 --- /dev/null +++ b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubsubFolder1.2.1/SubSubFolder1.2.1.csproj @@ -0,0 +1,15 @@ + + + + Exe + netstandard2.0 + disable + SubFolder1.2 Project + SubFolder1.2-Project + + + + + + + \ No newline at end of file diff --git a/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubsubFolder1.2.1/SubSubSubFolder1.2.1.1/SubSubSubFolder1.2.1.1.csproj b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubsubFolder1.2.1/SubSubSubFolder1.2.1.1/SubSubSubFolder1.2.1.1.csproj new file mode 100644 index 0000000..2c5a4d0 --- /dev/null +++ b/NetProjectPackageExtractor.Tests/Root/SubFolder1/Subfolder1.2/SubsubFolder1.2.1/SubSubSubFolder1.2.1.1/SubSubSubFolder1.2.1.1.csproj @@ -0,0 +1,15 @@ + + + + Exe + netstandard2.0 + disable + SubFolder1.2 Project + SubFolder1.2-Project + + + + + + + \ No newline at end of file diff --git a/NetProjectPackageExtractor.Tests/Services/DirectoryPackageParserTestFixture.cs b/NetProjectPackageExtractor.Tests/Services/DirectoryPackageParserTestFixture.cs new file mode 100644 index 0000000..37324d5 --- /dev/null +++ b/NetProjectPackageExtractor.Tests/Services/DirectoryPackageParserTestFixture.cs @@ -0,0 +1,113 @@ +// ------------------------------------------------------------------------------------------------- +// +// +// Copyright 2022-2025 Starion Group S.A. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// ------------------------------------------------------------------------------------------------ + + +namespace NetProjectPackageExtractor.Tests.Services +{ + using System; + using System.IO; + using System.Collections.Generic; + + using NetProjectPackageExtractor; + using NetProjectPackageExtractor.Services; + + using NUnit.Framework; + + /// + /// Suite of tests for the class. + /// + [TestFixture] + + public class DirectoryPackageParserTestFixture + { + private DirectoryPackageParser directoryPackageParser; + + private List packages; + + private DirectoryInfo rootFolder; + + [SetUp] + public void SetUp() + { + this.rootFolder = new DirectoryInfo(Path.Combine(TestContext.CurrentContext.TestDirectory, "Root")); + } + + /// + /// This tests if it is able to find the package management in the parent folders + /// + [Test] + [Category("DirectoryPackageParser")] + public void Verify_that_Parser_returns_packages() + { + var targetProjectFile = new FileInfo(Path.Combine(this.rootFolder.FullName, "SubFolder1", "Subfolder1.2", "SubsubFolder1.2.1", "SubSubSubFolder1.2.1.1", "SubSubSubFolder1.2.1.1.csproj")); + var dictionnary = DirectoryPackageParser.SearchAndParse(targetProjectFile, this.rootFolder); + Assert.That(dictionnary["NUnit3TestAdapter"], Is.EqualTo("4.3.0")); + } + + /// + /// This tests if it is able to find the package management in the parent folders + /// + [Test] + [Category("DirectoryPackageParser")] + public void Verify_that_Parser_returns_packages_from_subfolder() + { + var targetProjectFile = new FileInfo(Path.Combine(this.rootFolder.FullName, "SubFolder1", "Subfolder1.2", "SubsubFolder1.2.1", "SubSubFolder1.2.1.csproj")); + var dictionnary = DirectoryPackageParser.SearchAndParse(targetProjectFile, this.rootFolder); + Assert.That(dictionnary["NUnit3TestAdapter"], Is.EqualTo("4.3.0")); + } + + /// + /// This tests if it is able to find the package management in the same folder + /// + [Test] + [Category("DirectoryPackageParser")] + public void Verify_that_Parser_returns_packages_in_same_folder() + { + var targetProjectFile = new FileInfo(Path.Combine(this.rootFolder.FullName, "SubFolder1", "Subfolder1.2", "SubFolder1.2.csproj")); + var dictionnary = DirectoryPackageParser.SearchAndParse(targetProjectFile, this.rootFolder); + Assert.That(dictionnary["NUnit3TestAdapter"], Is.EqualTo("4.3.0")); + } + + /// + /// This tests if the project file has no directory.packages.props files in the parent folders + /// + [Test] + [Category("DirectoryPackageParser")] + public void Verify_that_Parser_returns_nothing() + { + var targetProjectFile = new FileInfo(Path.Combine(this.rootFolder.FullName, "root.csproj")); + var dictionary = DirectoryPackageParser.SearchAndParse(targetProjectFile, this.rootFolder); + Assert.That(dictionary.Count, Is.EqualTo(0)); + } + + /// + /// This tests if the project file is in a parent folder of the target folder + /// + [Test] + [Category("DirectoryPackageParser")] + public void Verify_that_Parser_returns_exception() + { + var targetProjectFile = new FileInfo(Path.Combine(this.rootFolder.FullName, "root.csproj")); + var targetFolderFile = new DirectoryInfo(Path.Combine(this.rootFolder.FullName, "SubFolder1")); + + Assert.Throws(() => DirectoryPackageParser.SearchAndParse(targetProjectFile, targetFolderFile)); + } + } +} diff --git a/NetProjectPackageExtractor.Tests/Services/NuGetReaderTestFixture.cs b/NetProjectPackageExtractor.Tests/Services/NuGetReaderTestFixture.cs index 3567ee5..412c56e 100644 --- a/NetProjectPackageExtractor.Tests/Services/NuGetReaderTestFixture.cs +++ b/NetProjectPackageExtractor.Tests/Services/NuGetReaderTestFixture.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor.Tests/Services/PackageToExcelWriterTestFixture.cs b/NetProjectPackageExtractor.Tests/Services/PackageToExcelWriterTestFixture.cs index 1aa0569..f68e08e 100644 --- a/NetProjectPackageExtractor.Tests/Services/PackageToExcelWriterTestFixture.cs +++ b/NetProjectPackageExtractor.Tests/Services/PackageToExcelWriterTestFixture.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor.Tests/Services/ProjectFileExtractorTestFixture.cs b/NetProjectPackageExtractor.Tests/Services/ProjectFileExtractorTestFixture.cs index 0f23167..7cef20d 100644 --- a/NetProjectPackageExtractor.Tests/Services/ProjectFileExtractorTestFixture.cs +++ b/NetProjectPackageExtractor.Tests/Services/ProjectFileExtractorTestFixture.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -50,7 +50,7 @@ public void Verify_that_The_project_files_are_found() { var files = this.projectFileExtractor.QueryProjectFiles(rootFolder); - Assert.That(files.Count(), Is.EqualTo(3)); + Assert.That(files.Count(), Is.EqualTo(6)); } } } diff --git a/NetProjectPackageExtractor.Tests/Services/ProjectFileParserTestFixture.cs b/NetProjectPackageExtractor.Tests/Services/ProjectFileParserTestFixture.cs index 54718bc..6680534 100644 --- a/NetProjectPackageExtractor.Tests/Services/ProjectFileParserTestFixture.cs +++ b/NetProjectPackageExtractor.Tests/Services/ProjectFileParserTestFixture.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -38,12 +38,16 @@ public class ProjectFileParserTestFixture private List projectFiles; + private DirectoryInfo rootFolder; + [SetUp] public void Setup() { - var projectFile = Path.Combine(TestContext.CurrentContext.TestDirectory, "Root", "root.csproj"); + var projectFile = Path.Combine(TestContext.CurrentContext.TestDirectory, "Root", "root.csproj"); + + this.rootFolder = new DirectoryInfo(Path.GetDirectoryName(projectFile)); - this.projectFiles = new List() { new FileInfo(projectFile) }; + this.projectFiles = [new FileInfo(projectFile)]; this.projectFileParser = new ProjectFileParser(); } @@ -51,7 +55,7 @@ public void Setup() [Test] public void Verify_that_Parser_returns_packages() { - var package = this.projectFileParser.Parse(projectFiles).Single(); + var package = this.projectFileParser.Parse(projectFiles, rootFolder).Single(); Assert.That(package.ProjectTitle, Is.EqualTo("Root project")); Assert.That(package.ProjectVersion, Is.EqualTo("0.0.1")); diff --git a/NetProjectPackageExtractor.sln.DotSettings b/NetProjectPackageExtractor.sln.DotSettings index 542dd4c..f29d880 100644 --- a/NetProjectPackageExtractor.sln.DotSettings +++ b/NetProjectPackageExtractor.sln.DotSettings @@ -1,3 +1,6 @@  <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> + <Policy><Descriptor Staticness="Instance" AccessRightKinds="Private" Description="Instance fields (private)"><ElementKinds><Kind Name="FIELD" /><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /></Policy> + <Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static fields (private)"><ElementKinds><Kind Name="FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" WarnAboutPrefixesAndSuffixes="False" Prefix="" Suffix="" Style="aaBb" /></Policy> + True \ No newline at end of file diff --git a/NetProjectPackageExtractor/Commands/ExtractCommand.cs b/NetProjectPackageExtractor/Commands/ExtractCommand.cs index b52fd39..4d23fea 100644 --- a/NetProjectPackageExtractor/Commands/ExtractCommand.cs +++ b/NetProjectPackageExtractor/Commands/ExtractCommand.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -89,10 +89,10 @@ public ExtractCommand() : base("Package Extractor") /// /// The (injected) used to recursively iterate through a directory - /// tree and return all the .csproj files in this directory tree as an List of objects + /// tree and return all the .csproj files in this directory tree as a List of objects /// private readonly IProjectFileExtractor projectFileExtractor; - + /// /// The (injected) used to parses a project file and extract the /// referenced nuget packages @@ -194,8 +194,8 @@ await AnsiConsole.Status() Thread.Sleep(1500); var csprojFiles = this.projectFileExtractor.QueryProjectFiles(this.RootDirectory); - - var packages = projectFileParser.Parse(csprojFiles).ToList(); + + var packages = projectFileParser.Parse(csprojFiles, this.RootDirectory).ToList(); AnsiConsole.MarkupLine($"[grey]LOG:[/] A total of [bold]{packages.Count}[/] packages were read"); ctx.Status("Updating Package information at Warp 7..."); diff --git a/NetProjectPackageExtractor/Model/Package.cs b/NetProjectPackageExtractor/Model/Package.cs index a07bedf..3f96e11 100644 --- a/NetProjectPackageExtractor/Model/Package.cs +++ b/NetProjectPackageExtractor/Model/Package.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/NetProjectPackageExtractor.csproj b/NetProjectPackageExtractor/NetProjectPackageExtractor.csproj index 5870e3e..035fc03 100644 --- a/NetProjectPackageExtractor/NetProjectPackageExtractor.csproj +++ b/NetProjectPackageExtractor/NetProjectPackageExtractor.csproj @@ -9,7 +9,7 @@ nppe nppe ./nupkg - 4.0.0 + 4.1.0 disable README.md starion-s-symbol-main1-rgb.png @@ -20,8 +20,8 @@ Starion Group S.A. - Copyright 2022-2024 Starion Group S.A. - Sam Gerené, Alexander van Delft + Copyright 2022-2025 Starion Group S.A. + Sam Gerené, Alexander van Delft, Anh Toan Bui Long Apache-2.0 true diff --git a/NetProjectPackageExtractor/Program.cs b/NetProjectPackageExtractor/Program.cs index 085679d..f0a4075 100644 --- a/NetProjectPackageExtractor/Program.cs +++ b/NetProjectPackageExtractor/Program.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Properties/launchSettings.json b/NetProjectPackageExtractor/Properties/launchSettings.json new file mode 100644 index 0000000..d923faa --- /dev/null +++ b/NetProjectPackageExtractor/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "NetProjectPackageExtractor": { + "commandName": "Project", + "commandLineArgs": "--root-directory C:\\Users\\along\\source\\repos\\PASaaS\\pasaas_framework --output-report srf-report.xlsx" + } + } +} \ No newline at end of file diff --git a/NetProjectPackageExtractor/Resources/ResourceLoader.cs b/NetProjectPackageExtractor/Resources/ResourceLoader.cs index a5cdbc3..0b67597 100644 --- a/NetProjectPackageExtractor/Resources/ResourceLoader.cs +++ b/NetProjectPackageExtractor/Resources/ResourceLoader.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Resources/ascii-art.txt b/NetProjectPackageExtractor/Resources/ascii-art.txt index 029cbec..05a03d0 100644 --- a/NetProjectPackageExtractor/Resources/ascii-art.txt +++ b/NetProjectPackageExtractor/Resources/ascii-art.txt @@ -14,7 +14,7 @@ ███████╗██╔╝ ██╗ ██║ ██║ ██║██║ ██║╚██████╗ ██║ ╚██████╔╝██║ ██║ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ - copyright 2022-2024 Starion Group S.A. https://www.stariongroup.eu + copyright 2022-2025 Starion Group S.A. https://www.stariongroup.eu email: info@stariongroup.eu NET PROJECT EXTRACTOR version: NetProjectExtractorVersion diff --git a/NetProjectPackageExtractor/Services/DirectoryPackageParser.cs b/NetProjectPackageExtractor/Services/DirectoryPackageParser.cs new file mode 100644 index 0000000..a191be7 --- /dev/null +++ b/NetProjectPackageExtractor/Services/DirectoryPackageParser.cs @@ -0,0 +1,88 @@ +// ------------------------------------------------------------------------------------------------- +// +// +// Copyright 2022-2025 Starion Group S.A. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// ------------------------------------------------------------------------------------------------ + +namespace NetProjectPackageExtractor.Services +{ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Xml; + + public class DirectoryPackageParser : IDirectoryPackageParser + { + /// + /// Search for the closest Directory.Packages.props file in the directory structure from the csproj file. + /// + /// The location of the csproj file + /// The source directory provided by the user in the command line + /// A dictionary where the key is the package name, and the value the version number + public static Dictionary SearchAndParse(FileInfo projectFile, DirectoryInfo sourceDirectory) + { + var subDirectory = projectFile.Directory; + if (sourceDirectory.FullName.Contains(projectFile.DirectoryName) && sourceDirectory.FullName != projectFile.DirectoryName) + { + throw new ArgumentException("The source directory must be a parent of the project file"); + } + + FileInfo directoryPackagesFile = null; + while (subDirectory.FullName.Contains(sourceDirectory.FullName)) + { + var directoryPackagesFiles = subDirectory.EnumerateFiles("Directory.Packages.props", SearchOption.TopDirectoryOnly); + if (directoryPackagesFiles.Any()) + { + directoryPackagesFile = directoryPackagesFiles.First(); + break; + } + subDirectory = subDirectory.Parent; + } + return ParseDirectoryPackage(directoryPackagesFile); + } + + /// + /// Parses the directory file for the version + /// + /// The xml file containing the Package version. + /// A dictionary where the key is the package name, and the value the version number + private static Dictionary ParseDirectoryPackage(FileInfo directoryFile) + { + if (directoryFile == null) + { + return new Dictionary(); + } + var document = new XmlDocument(); + + var reader = directoryFile.OpenRead(); + document.Load(reader); + + var packageReferenceElements = document.GetElementsByTagName("PackageVersion"); + + var dictionnary = new Dictionary(); + foreach (XmlNode element in packageReferenceElements) + { + var key = element.Attributes["Include"].Value; + var value = element.Attributes["Version"].Value; + dictionnary.Add(key, value); + } + + return dictionnary; + } + } +} diff --git a/NetProjectPackageExtractor/Services/IDirectoryPackageParser.cs b/NetProjectPackageExtractor/Services/IDirectoryPackageParser.cs new file mode 100644 index 0000000..a626bd5 --- /dev/null +++ b/NetProjectPackageExtractor/Services/IDirectoryPackageParser.cs @@ -0,0 +1,27 @@ +// ------------------------------------------------------------------------------------------------- +// +// +// Copyright 2022-2025 Starion Group S.A. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +// ------------------------------------------------------------------------------------------------ + +namespace NetProjectPackageExtractor.Services +{ + public interface IDirectoryPackageParser + { + + } +} diff --git a/NetProjectPackageExtractor/Services/INuGetReader.cs b/NetProjectPackageExtractor/Services/INuGetReader.cs index 5428f9f..e06aa58 100644 --- a/NetProjectPackageExtractor/Services/INuGetReader.cs +++ b/NetProjectPackageExtractor/Services/INuGetReader.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Services/IPackageToExcelWriter.cs b/NetProjectPackageExtractor/Services/IPackageToExcelWriter.cs index 51cea6a..fdfde74 100644 --- a/NetProjectPackageExtractor/Services/IPackageToExcelWriter.cs +++ b/NetProjectPackageExtractor/Services/IPackageToExcelWriter.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Services/IProjectFileExtractor.cs b/NetProjectPackageExtractor/Services/IProjectFileExtractor.cs index f2bd76a..390d62e 100644 --- a/NetProjectPackageExtractor/Services/IProjectFileExtractor.cs +++ b/NetProjectPackageExtractor/Services/IProjectFileExtractor.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Services/IProjectFileParser.cs b/NetProjectPackageExtractor/Services/IProjectFileParser.cs index 9a0f2c7..339d067 100644 --- a/NetProjectPackageExtractor/Services/IProjectFileParser.cs +++ b/NetProjectPackageExtractor/Services/IProjectFileParser.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -38,6 +38,6 @@ public interface IProjectFileParser /// /// An /// - IEnumerable Parse(IEnumerable projectFiles); + IEnumerable Parse(IEnumerable projectFiles, DirectoryInfo rootDirectory); } } diff --git a/NetProjectPackageExtractor/Services/NuGetReader.cs b/NetProjectPackageExtractor/Services/NuGetReader.cs index 275572e..3de2a8e 100644 --- a/NetProjectPackageExtractor/Services/NuGetReader.cs +++ b/NetProjectPackageExtractor/Services/NuGetReader.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Services/PackageToExcelWriter.cs b/NetProjectPackageExtractor/Services/PackageToExcelWriter.cs index fdccd26..59c93f5 100644 --- a/NetProjectPackageExtractor/Services/PackageToExcelWriter.cs +++ b/NetProjectPackageExtractor/Services/PackageToExcelWriter.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Services/ProjectFileExtractor.cs b/NetProjectPackageExtractor/Services/ProjectFileExtractor.cs index fd67a58..cd8f962 100644 --- a/NetProjectPackageExtractor/Services/ProjectFileExtractor.cs +++ b/NetProjectPackageExtractor/Services/ProjectFileExtractor.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/NetProjectPackageExtractor/Services/ProjectFileParser.cs b/NetProjectPackageExtractor/Services/ProjectFileParser.cs index d0e0d49..96605da 100644 --- a/NetProjectPackageExtractor/Services/ProjectFileParser.cs +++ b/NetProjectPackageExtractor/Services/ProjectFileParser.cs @@ -1,7 +1,7 @@ // ------------------------------------------------------------------------------------------------- // // -// Copyright 2022-2024 Starion Group S.A. +// Copyright 2022-2025 Starion Group S.A. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -18,8 +18,10 @@ // // ------------------------------------------------------------------------------------------------ + namespace NetProjectPackageExtractor.Services { + using System; using System.Collections.Generic; using System.IO; using System.Xml; @@ -38,13 +40,13 @@ public class ProjectFileParser : IProjectFileParser /// /// An /// - public IEnumerable Parse(IEnumerable projectFiles) + public IEnumerable Parse(IEnumerable projectFiles, DirectoryInfo rootDirectory) { var result = new List(); - + foreach (var projectFile in projectFiles) { - var packages = ParseProjectFile(projectFile); + var packages = ParseProjectFile(projectFile, rootDirectory); result.AddRange(packages); } @@ -53,17 +55,20 @@ public IEnumerable Parse(IEnumerable projectFiles) /// /// Parses the provided Project file + /// Eventually searches for a Directory.Build.props file and parses it (if it exists) for Central Package Management (CPM) + /// See also https://learn.microsoft.com/en-us/nuget/consume-packages/central-package-management for more information /// /// /// The subject project file (encapsulated by a object). /// + /// The root directory of the solution (which should contain the Directory.Build.props file if using CPM) /// /// An /// - private static IEnumerable ParseProjectFile(FileInfo projectFile) + private static IEnumerable ParseProjectFile(FileInfo projectFile, DirectoryInfo rootDirectory) { var document = new XmlDocument(); - + var reader = projectFile.OpenRead(); document.Load(reader); @@ -92,16 +97,22 @@ private static IEnumerable ParseProjectFile(FileInfo projectFile) var packageReferenceElements = document.GetElementsByTagName("PackageReference"); + var dictionary = DirectoryPackageParser.SearchAndParse(projectFile, rootDirectory); + foreach (var element in packageReferenceElements) { var xmlElement = (XmlNode)element; - - var package = new Package + var name = xmlElement.Attributes["Include"]?.Value; + + var package = new Package { ProjectTitle = projectTitle, ProjectVersion = projectVersion, - Name = xmlElement.Attributes["Include"]?.Value, - Version = xmlElement.Attributes["Version"]?.Value, + Name = name, + Version = (xmlElement.Attributes["Version"]?.Value ?? + xmlElement.Attributes["VersionOverride"]?.Value ?? + dictionary[name] ?? + String.Empty), }; yield return package;