dependabot-nuget 0.240.0 → 0.241.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/build +45 -0
  3. data/helpers/lib/NuGetUpdater/.editorconfig +364 -0
  4. data/helpers/lib/NuGetUpdater/.gitignore +5 -0
  5. data/helpers/lib/NuGetUpdater/Directory.Build.props +10 -0
  6. data/helpers/lib/NuGetUpdater/Directory.Common.props +16 -0
  7. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Build.props +14 -0
  8. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Build.targets +7 -0
  9. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +29 -0
  10. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Build.Tasks/NuGet.Build.Tasks.csproj +27 -0
  11. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/AssemblyMetadataExtractor.cs +203 -0
  12. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/NuGet.CommandLine.csproj +33 -0
  13. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Commands/NuGet.Commands.csproj +26 -0
  14. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Common/NuGet.Common.csproj +21 -0
  15. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Config +6 -0
  16. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Configuration/NuGet.Configuration.csproj +24 -0
  17. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Credentials/NuGet.Credentials.csproj +20 -0
  18. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.DependencyResolver.Core/NuGet.DependencyResolver.Core.csproj +22 -0
  19. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Frameworks/NuGet.Frameworks.csproj +17 -0
  20. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.LibraryModel/NuGet.LibraryModel.csproj +17 -0
  21. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.PackageManagement/NuGet.PackageManagement.csproj +27 -0
  22. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +28 -0
  23. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.ProjectModel/NuGet.ProjectModel.csproj +20 -0
  24. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Protocol/NuGet.Protocol.csproj +21 -0
  25. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Resolver/NuGet.Resolver.csproj +20 -0
  26. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Versioning/NuGet.Versioning.csproj +17 -0
  27. data/helpers/lib/NuGetUpdater/NuGetProjects/README.md +1 -0
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/FrameworkCheckCommand.cs +35 -0
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +43 -0
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/NuGetUpdater.Cli.csproj +20 -0
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Program.cs +31 -0
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.FrameworkCheck.cs +42 -0
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +323 -0
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/NuGetUpdater.Cli.Test.csproj +24 -0
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Dependency.cs +3 -0
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyType.cs +12 -0
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/BuildFile.cs +97 -0
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/DotNetToolsJsonBuildFile.cs +24 -0
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/GlobalJsonBuildFile.cs +25 -0
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +32 -0
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/PackagesConfigBuildFile.cs +31 -0
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/ProjectBuildFile.cs +94 -0
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/XmlBuildFile.cs +14 -0
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +39 -0
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/FrameworkCompatibilityService.cs +73 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/SupportedFrameworks.cs +146 -0
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +27 -0
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +316 -0
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectResolver.cs +87 -0
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/ConfigurationFile.cs +3 -0
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +66 -0
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +48 -0
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +172 -0
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/SdkPackageUpdater.cs +498 -0
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdateResult.cs +7 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +105 -0
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/JsonHelper.cs +222 -0
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/Logger.cs +24 -0
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +443 -0
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +15 -0
  61. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +69 -0
  62. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +66 -0
  63. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/XmlExtensions.cs +124 -0
  64. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/DotNetToolsJsonBuildFileTests.cs +52 -0
  65. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/GlobalJsonBuildFileTests.cs +63 -0
  66. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/PackagesConfigBuildFileTests.cs +63 -0
  67. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/ProjectBuildFileTests.cs +154 -0
  68. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/CompatibilityCheckerFacts.cs +64 -0
  69. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/FrameworkCompatibilityServiceFacts.cs +122 -0
  70. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/SupportedFrameworkFacts.cs +68 -0
  71. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +23 -0
  72. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +36 -0
  73. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestExtensions.cs +15 -0
  74. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +79 -0
  75. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorker.DirsProj.cs +201 -0
  76. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +147 -0
  77. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +225 -0
  78. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +217 -0
  79. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Mixed.cs +94 -0
  80. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +938 -0
  81. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Sdk.cs +2177 -0
  82. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/JsonHelperTests.cs +239 -0
  83. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +394 -0
  84. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/SdkPackageUpdaterHelperTests.cs +179 -0
  85. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/SdkPackageUpdaterTests.cs +238 -0
  86. data/helpers/lib/NuGetUpdater/NuGetUpdater.sln +152 -0
  87. data/helpers/lib/NuGetUpdater/xunit.runner.json +4 -0
  88. data/lib/dependabot/nuget/metadata_finder.rb +4 -4
  89. metadata +91 -5
@@ -0,0 +1,31 @@
1
+ using System;
2
+ using System.CommandLine;
3
+ using System.Threading.Tasks;
4
+
5
+ using NuGetUpdater.Cli.Commands;
6
+
7
+ namespace NuGetUpdater.Cli;
8
+
9
+ internal sealed class Program
10
+ {
11
+ internal static async Task<int> Main(string[] args)
12
+ {
13
+ var exitCode = 0;
14
+ Action<int> setExitCode = (int code) => exitCode = code;
15
+
16
+ var command = new RootCommand()
17
+ {
18
+ FrameworkCheckCommand.GetCommand(setExitCode),
19
+ UpdateCommand.GetCommand(setExitCode),
20
+ };
21
+ command.TreatUnmatchedTokensAsErrors = true;
22
+
23
+ var result = await command.InvokeAsync(args);
24
+ if (result != 0)
25
+ {
26
+ exitCode = result;
27
+ }
28
+
29
+ return exitCode;
30
+ }
31
+ }
@@ -0,0 +1,42 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.Threading.Tasks;
4
+
5
+ using Xunit;
6
+
7
+ namespace NuGetUpdater.Cli.Test;
8
+
9
+ public partial class EntryPointTests
10
+ {
11
+ public class FrameworkCheck
12
+ {
13
+ [Theory]
14
+ [InlineData("net7.0", "net5.0")]
15
+ [InlineData("net7.0 net472", "net5.0 net461")]
16
+ [InlineData("net7.0 net472", "netstandard2.0")]
17
+ public Task Compatible(string projectTfms, string packageTfms)
18
+ => Run(projectTfms, packageTfms, expectedExitCode: 0);
19
+
20
+ [Theory]
21
+ [InlineData("net5.0", "net7.0")]
22
+ [InlineData("net5.0 net461", "net7.0 net472")]
23
+ [InlineData("net5.0 net45", "netstandard2.0")]
24
+ public Task Incompatible(string projectTfms, string packageTfms)
25
+ => Run(projectTfms, packageTfms, expectedExitCode: 1);
26
+
27
+ private static async Task Run(string projectTfms, string packageTfms, int expectedExitCode)
28
+ {
29
+ var args = new List<string>();
30
+ args.Add("framework-check");
31
+ args.Add("--project-tfms");
32
+ args.AddRange(projectTfms.Split(' ', StringSplitOptions.TrimEntries));
33
+ args.Add("--package-tfms");
34
+ args.AddRange(packageTfms.Split(' ', StringSplitOptions.TrimEntries));
35
+ args.Add("--verbose");
36
+
37
+ var actual = await Program.Main(args.ToArray());
38
+
39
+ Assert.Equal(expectedExitCode, actual);
40
+ }
41
+ }
42
+ }
@@ -0,0 +1,323 @@
1
+ using System;
2
+ using System.IO;
3
+ using System.Text;
4
+ using System.Threading.Tasks;
5
+
6
+ using NuGetUpdater.Core.Test.Update;
7
+
8
+ using Xunit;
9
+
10
+ namespace NuGetUpdater.Cli.Test;
11
+
12
+ public partial class EntryPointTests
13
+ {
14
+ public class Update : UpdateWorkerTestBase
15
+ {
16
+ [Fact]
17
+ public async Task WithSolution()
18
+ {
19
+ await Run(path => new[]
20
+ {
21
+ "update",
22
+ "--repo-root",
23
+ path,
24
+ "--solution-or-project",
25
+ Path.Combine(path, "path/to/solution.sln"),
26
+ "--dependency",
27
+ "Newtonsoft.Json",
28
+ "--new-version",
29
+ "13.0.1",
30
+ "--previous-version",
31
+ "7.0.1",
32
+ },
33
+ new[]
34
+ {
35
+ ("path/to/solution.sln", """
36
+ Microsoft Visual Studio Solution File, Format Version 12.00
37
+ # Visual Studio 14
38
+ VisualStudioVersion = 14.0.22705.0
39
+ MinimumVisualStudioVersion = 10.0.40219.1
40
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "my", "my.csproj", "{782E0C0A-10D3-444D-9640-263D03D2B20C}"
41
+ EndProject
42
+ Global
43
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
44
+ Debug|Any CPU = Debug|Any CPU
45
+ Release|Any CPU = Release|Any CPU
46
+ EndGlobalSection
47
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
48
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
49
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.Build.0 = Debug|Any CPU
50
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.ActiveCfg = Release|Any CPU
51
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.Build.0 = Release|Any CPU
52
+ EndGlobalSection
53
+ GlobalSection(SolutionProperties) = preSolution
54
+ HideSolutionNode = FALSE
55
+ EndGlobalSection
56
+ EndGlobal
57
+ """),
58
+ ("path/to/my.csproj", """
59
+ <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
60
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
61
+ <PropertyGroup>
62
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
63
+ </PropertyGroup>
64
+ <ItemGroup>
65
+ <None Include="packages.config" />
66
+ </ItemGroup>
67
+ <ItemGroup>
68
+ <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
69
+ <HintPath>packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
70
+ <Private>True</Private>
71
+ </Reference>
72
+ </ItemGroup>
73
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
74
+ </Project>
75
+ """),
76
+ ("path/to/packages.config", """
77
+ <packages>
78
+ <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
79
+ </packages>
80
+ """)
81
+ },
82
+ new[]
83
+ {
84
+ ("path/to/my.csproj", """
85
+ <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
86
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
87
+ <PropertyGroup>
88
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
89
+ </PropertyGroup>
90
+ <ItemGroup>
91
+ <None Include="packages.config" />
92
+ </ItemGroup>
93
+ <ItemGroup>
94
+ <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
95
+ <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
96
+ <Private>True</Private>
97
+ </Reference>
98
+ </ItemGroup>
99
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
100
+ </Project>
101
+ """),
102
+ ("path/to/packages.config", """
103
+ <?xml version="1.0" encoding="utf-8"?>
104
+ <packages>
105
+ <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net45" />
106
+ </packages>
107
+ """)
108
+ });
109
+ }
110
+
111
+ [Fact]
112
+ public async Task WithProject()
113
+ {
114
+ await Run(path => new[]
115
+ {
116
+ "update",
117
+ "--repo-root",
118
+ path,
119
+ "--solution-or-project",
120
+ Path.Combine(path, "path/to/my.csproj"),
121
+ "--dependency",
122
+ "Newtonsoft.Json",
123
+ "--new-version",
124
+ "13.0.1",
125
+ "--previous-version",
126
+ "7.0.1",
127
+ "--verbose"
128
+ },
129
+ new[]
130
+ {
131
+ ("path/to/my.csproj", """
132
+ <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
133
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
134
+ <PropertyGroup>
135
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
136
+ </PropertyGroup>
137
+ <ItemGroup>
138
+ <None Include="packages.config" />
139
+ </ItemGroup>
140
+ <ItemGroup>
141
+ <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
142
+ <HintPath>packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
143
+ <Private>True</Private>
144
+ </Reference>
145
+ </ItemGroup>
146
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
147
+ </Project>
148
+ """),
149
+ ("path/to/packages.config", """
150
+ <packages>
151
+ <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
152
+ </packages>
153
+ """)
154
+ },
155
+ new[]
156
+ {
157
+ ("path/to/my.csproj", """
158
+ <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
159
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
160
+ <PropertyGroup>
161
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
162
+ </PropertyGroup>
163
+ <ItemGroup>
164
+ <None Include="packages.config" />
165
+ </ItemGroup>
166
+ <ItemGroup>
167
+ <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
168
+ <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
169
+ <Private>True</Private>
170
+ </Reference>
171
+ </ItemGroup>
172
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
173
+ </Project>
174
+ """),
175
+ ("path/to/packages.config", """
176
+ <?xml version="1.0" encoding="utf-8"?>
177
+ <packages>
178
+ <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net45" />
179
+ </packages>
180
+ """)
181
+ });
182
+ }
183
+
184
+ [Fact]
185
+ public async Task WithDirsProjAndDirectoryBuildPropsThatIsOutOfDirectoryButStillMatchingThePackage()
186
+ {
187
+ await Run(path => new[]
188
+ {
189
+ "update",
190
+ "--repo-root", path,
191
+ "--solution-or-project", $"{path}/some-dir/dirs.proj",
192
+ "--dependency", "NuGet.Versioning",
193
+ "--new-version", "6.6.1",
194
+ "--previous-version", "6.1.0",
195
+ "--verbose"
196
+ },
197
+ initialFiles: new[]
198
+ {
199
+ ("some-dir/dirs.proj", """
200
+ <Project Sdk="Microsoft.Build.Traversal">
201
+ <ItemGroup>
202
+ <ProjectFile Include="project1/project.csproj" />
203
+ <ProjectReference Include="project2/project.csproj" />
204
+ </ItemGroup>
205
+ </Project>
206
+ """),
207
+ ("some-dir/project1/project.csproj", """
208
+ <Project Sdk="Microsoft.NET.Sdk">
209
+ <PropertyGroup>
210
+ <OutputType>Exe</OutputType>
211
+ <TargetFramework>net6.0</TargetFramework>
212
+ <ImplicitUsings>enable</ImplicitUsings>
213
+ <Nullable>enable</Nullable>
214
+ </PropertyGroup>
215
+ <ItemGroup>
216
+ <PackageReference Include="NuGet.Versioning" Version="6.1.0" />
217
+ </ItemGroup>
218
+ </Project>
219
+ """),
220
+ ("some-dir/project2/project.csproj", """
221
+ <Project Sdk="Microsoft.NET.Sdk">
222
+ <PropertyGroup>
223
+ <OutputType>Exe</OutputType>
224
+ <TargetFramework>net6.0</TargetFramework>
225
+ <ImplicitUsings>enable</ImplicitUsings>
226
+ <Nullable>enable</Nullable>
227
+ </PropertyGroup>
228
+ <ItemGroup>
229
+ <PackageReference Include="NuGet.Versioning" Version="6.1.0" />
230
+ </ItemGroup>
231
+ </Project>
232
+ """),
233
+ ("other-dir/Directory.Build.props", """
234
+ <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
235
+
236
+ <ItemGroup>
237
+ <PackageReference Include="NuGet.Versioning" Version="6.1.0" />
238
+ </ItemGroup>
239
+
240
+ </Project>
241
+ """)
242
+ },
243
+ expectedFiles: new[]
244
+ {
245
+ ("some-dir/dirs.proj", """
246
+ <Project Sdk="Microsoft.Build.Traversal">
247
+ <ItemGroup>
248
+ <ProjectFile Include="project1/project.csproj" />
249
+ <ProjectReference Include="project2/project.csproj" />
250
+ </ItemGroup>
251
+ </Project>
252
+ """),
253
+ ("some-dir/project1/project.csproj", """
254
+ <Project Sdk="Microsoft.NET.Sdk">
255
+ <PropertyGroup>
256
+ <OutputType>Exe</OutputType>
257
+ <TargetFramework>net6.0</TargetFramework>
258
+ <ImplicitUsings>enable</ImplicitUsings>
259
+ <Nullable>enable</Nullable>
260
+ </PropertyGroup>
261
+ <ItemGroup>
262
+ <PackageReference Include="NuGet.Versioning" Version="6.6.1" />
263
+ </ItemGroup>
264
+ </Project>
265
+ """),
266
+ ("some-dir/project2/project.csproj", """
267
+ <Project Sdk="Microsoft.NET.Sdk">
268
+ <PropertyGroup>
269
+ <OutputType>Exe</OutputType>
270
+ <TargetFramework>net6.0</TargetFramework>
271
+ <ImplicitUsings>enable</ImplicitUsings>
272
+ <Nullable>enable</Nullable>
273
+ </PropertyGroup>
274
+ <ItemGroup>
275
+ <PackageReference Include="NuGet.Versioning" Version="6.6.1" />
276
+ </ItemGroup>
277
+ </Project>
278
+ """),
279
+ ("other-dir/Directory.Build.props", """
280
+ <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
281
+
282
+ <ItemGroup>
283
+ <PackageReference Include="NuGet.Versioning" Version="6.1.0" />
284
+ </ItemGroup>
285
+
286
+ </Project>
287
+ """)
288
+ }
289
+ );
290
+ }
291
+
292
+ private static async Task Run(Func<string, string[]> getArgs, (string Path, string Content)[] initialFiles, (string, string)[] expectedFiles)
293
+ {
294
+ var actualFiles = await RunUpdate(initialFiles, async (path) =>
295
+ {
296
+ var sb = new StringBuilder();
297
+ var writer = new StringWriter(sb);
298
+
299
+ var originalOut = Console.Out;
300
+ var originalErr = Console.Error;
301
+ Console.SetOut(writer);
302
+ Console.SetError(writer);
303
+
304
+ try
305
+ {
306
+ var args = getArgs(path);
307
+ var result = await Program.Main(args);
308
+ if (result != 0)
309
+ {
310
+ throw new Exception($"Program exited with code {result}.\nOutput:\n\n{sb}");
311
+ }
312
+ }
313
+ finally
314
+ {
315
+ Console.SetOut(originalOut);
316
+ Console.SetError(originalErr);
317
+ }
318
+ });
319
+
320
+ AssertContainsFiles(expectedFiles, actualFiles);
321
+ }
322
+ }
323
+ }
@@ -0,0 +1,24 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <PropertyGroup>
4
+ <TargetFramework>$(CommonTargetFramework)</TargetFramework>
5
+ <OutputType>Exe</OutputType>
6
+ <Nullable>enable</Nullable>
7
+ </PropertyGroup>
8
+
9
+ <ItemGroup>
10
+ <ProjectReference Include="..\NuGetUpdater.Cli\NuGetUpdater.Cli.csproj" />
11
+ <ProjectReference Include="..\NuGetUpdater.Core.Test\NuGetUpdater.Core.Test.csproj" />
12
+ </ItemGroup>
13
+
14
+ <ItemGroup>
15
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
16
+ <PackageReference Include="xunit" Version="2.4.2" />
17
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" />
18
+ </ItemGroup>
19
+
20
+ <ItemGroup>
21
+ <Content Include="..\xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
22
+ </ItemGroup>
23
+
24
+ </Project>
@@ -0,0 +1,3 @@
1
+ namespace NuGetUpdater.Core;
2
+
3
+ public sealed record Dependency(string Name, string? Version, DependencyType Type, bool IsDevDependency = false, bool IsOverride = false);
@@ -0,0 +1,12 @@
1
+ namespace NuGetUpdater.Core;
2
+
3
+ public enum DependencyType
4
+ {
5
+ Unknown,
6
+ PackageConfig,
7
+ PackageReference,
8
+ PackageVersion,
9
+ GlobalPackageReference,
10
+ DotNetTool,
11
+ MSBuildSdk
12
+ }
@@ -0,0 +1,97 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.IO;
4
+ using System.Text.RegularExpressions;
5
+ using System.Threading.Tasks;
6
+
7
+ using DiffPlex;
8
+ using DiffPlex.DiffBuilder;
9
+ using DiffPlex.DiffBuilder.Model;
10
+
11
+ namespace NuGetUpdater.Core;
12
+
13
+ internal abstract class BuildFile
14
+ {
15
+ public string RepoRootPath { get; }
16
+ public string Path { get; }
17
+ public string RepoRelativePath => System.IO.Path.GetRelativePath(RepoRootPath, Path);
18
+
19
+ public BuildFile(string repoRootPath, string path)
20
+ {
21
+ RepoRootPath = repoRootPath;
22
+ Path = path;
23
+ }
24
+
25
+ public abstract Task<bool> SaveAsync();
26
+
27
+ public static IEnumerable<Dependency> GetDependencies(BuildFile buildFile)
28
+ {
29
+ return buildFile switch
30
+ {
31
+ ProjectBuildFile projectBuildFile => projectBuildFile.GetDependencies(),
32
+ PackagesConfigBuildFile packagesConfigBuildFile => packagesConfigBuildFile.GetDependencies(),
33
+ GlobalJsonBuildFile globalJsonBuildFile => globalJsonBuildFile.GetDependencies(),
34
+ DotNetToolsJsonBuildFile dotnetToolsJsonBuildFile => dotnetToolsJsonBuildFile.GetDependencies(),
35
+ _ => throw new NotSupportedException($"Build files of type [{buildFile.GetType().Name}] are not supported.")
36
+ };
37
+ }
38
+ }
39
+
40
+ internal abstract partial class BuildFile<T>
41
+ : BuildFile where T : class
42
+ {
43
+ public T Contents { get; private set; }
44
+
45
+ private string _originalContentsText;
46
+
47
+ public BuildFile(string repoRootPath, string path, T contents) : base(repoRootPath, path)
48
+ {
49
+ Contents = contents;
50
+ _originalContentsText = GetContentsString(contents);
51
+ }
52
+
53
+ public void Update(T contents)
54
+ {
55
+ Contents = contents;
56
+ }
57
+
58
+ public override async Task<bool> SaveAsync()
59
+ {
60
+ var currentContentsText = GetContentsString(Contents);
61
+
62
+ if (!HasAnyNonWhitespaceChanges(_originalContentsText, currentContentsText))
63
+ {
64
+ return false;
65
+ }
66
+
67
+ await File.WriteAllTextAsync(Path, currentContentsText);
68
+ _originalContentsText = currentContentsText;
69
+ return true;
70
+ }
71
+
72
+ protected abstract string GetContentsString(T contents);
73
+
74
+ private static bool HasAnyNonWhitespaceChanges(string oldText, string newText)
75
+ {
76
+ // Ignore white space
77
+ oldText = WhitespaceRegex().Replace(oldText, string.Empty);
78
+ newText = WhitespaceRegex().Replace(newText, string.Empty);
79
+
80
+ var diffBuilder = new InlineDiffBuilder(new Differ());
81
+ var diff = diffBuilder.BuildDiffModel(oldText, newText);
82
+ foreach (var line in diff.Lines)
83
+ {
84
+ if (line.Type is ChangeType.Inserted ||
85
+ line.Type is ChangeType.Deleted ||
86
+ line.Type is ChangeType.Modified)
87
+ {
88
+ return true;
89
+ }
90
+ }
91
+
92
+ return false;
93
+ }
94
+
95
+ [GeneratedRegex("\\s+")]
96
+ private static partial Regex WhitespaceRegex();
97
+ }
@@ -0,0 +1,24 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.IO;
4
+ using System.Linq;
5
+ using System.Text.Json.Nodes;
6
+
7
+ namespace NuGetUpdater.Core;
8
+
9
+ internal sealed class DotNetToolsJsonBuildFile : JsonBuildFile
10
+ {
11
+ public static DotNetToolsJsonBuildFile Open(string repoRootPath, string path)
12
+ => new(repoRootPath, path, File.ReadAllText(path));
13
+
14
+ public DotNetToolsJsonBuildFile(string repoRootPath, string path, string contents)
15
+ : base(repoRootPath, path, contents)
16
+ {
17
+ }
18
+
19
+ public IEnumerable<KeyValuePair<string, JsonNode?>> Tools
20
+ => Node.Value?["tools"]?.AsObject().ToArray() ?? Enumerable.Empty<KeyValuePair<string, JsonNode?>>();
21
+
22
+ public IEnumerable<Dependency> GetDependencies() => Tools.Select(
23
+ t => new Dependency(t.Key, t.Value?.AsObject()["version"]?.GetValue<string>() ?? string.Empty, DependencyType.DotNetTool));
24
+ }
@@ -0,0 +1,25 @@
1
+ using System.Collections.Generic;
2
+ using System.IO;
3
+ using System.Linq;
4
+ using System.Text.Json.Nodes;
5
+
6
+ namespace NuGetUpdater.Core;
7
+
8
+ internal sealed class GlobalJsonBuildFile : JsonBuildFile
9
+ {
10
+ public static GlobalJsonBuildFile Open(string repoRootPath, string path)
11
+ => new(repoRootPath, path, File.ReadAllText(path));
12
+
13
+ public GlobalJsonBuildFile(string repoRootPath, string path, string contents)
14
+ : base(repoRootPath, path, contents)
15
+ {
16
+ }
17
+
18
+ public JsonObject? Sdk => Node.Value?["sdk"]?.AsObject();
19
+
20
+ public JsonObject? MSBuildSdks =>
21
+ Node.Value?["msbuild-sdks"]?.AsObject();
22
+
23
+ public IEnumerable<Dependency> GetDependencies() => MSBuildSdks?.AsObject().Select(
24
+ t => new Dependency(t.Key, t.Value?.GetValue<string>() ?? string.Empty, DependencyType.MSBuildSdk)) ?? Enumerable.Empty<Dependency>();
25
+ }
@@ -0,0 +1,32 @@
1
+ using System;
2
+ using System.Text.Json.Nodes;
3
+
4
+ using NuGetUpdater.Core.Utilities;
5
+
6
+ namespace NuGetUpdater.Core;
7
+
8
+ internal abstract class JsonBuildFile : BuildFile<string>
9
+ {
10
+ protected Lazy<JsonNode?> Node;
11
+
12
+ public JsonBuildFile(string repoRootPath, string path, string contents)
13
+ : base(repoRootPath, path, contents)
14
+ {
15
+ Node = new Lazy<JsonNode?>(() => null);
16
+ ResetNode();
17
+ }
18
+
19
+ protected override string GetContentsString(string _contents) => Contents;
20
+
21
+ public void UpdateProperty(string[] propertyPath, string newValue)
22
+ {
23
+ var updatedContents = JsonHelper.UpdateJsonProperty(Contents, propertyPath, newValue, StringComparison.OrdinalIgnoreCase);
24
+ Update(updatedContents);
25
+ ResetNode();
26
+ }
27
+
28
+ private void ResetNode()
29
+ {
30
+ Node = new Lazy<JsonNode?>(() => JsonHelper.ParseNode(Contents));
31
+ }
32
+ }
@@ -0,0 +1,31 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.IO;
4
+ using System.Linq;
5
+
6
+ using Microsoft.Language.Xml;
7
+
8
+ namespace NuGetUpdater.Core;
9
+
10
+ internal sealed class PackagesConfigBuildFile : XmlBuildFile
11
+ {
12
+ public static PackagesConfigBuildFile Open(string repoRootPath, string path)
13
+ => Parse(repoRootPath, path, File.ReadAllText(path));
14
+ public static PackagesConfigBuildFile Parse(string repoRootPath, string path, string xml)
15
+ => new(repoRootPath, path, Parser.ParseText(xml));
16
+
17
+ public PackagesConfigBuildFile(string repoRootPath, string path, XmlDocumentSyntax contents)
18
+ : base(repoRootPath, path, contents)
19
+ {
20
+ }
21
+
22
+ public IEnumerable<IXmlElementSyntax> Packages => Contents.RootSyntax.GetElements("package", StringComparison.OrdinalIgnoreCase);
23
+
24
+ public IEnumerable<Dependency> GetDependencies() => Packages
25
+ .Where(p => p.GetAttribute("id") is not null && p.GetAttribute("version") is not null)
26
+ .Select(p => new Dependency(
27
+ p.GetAttributeValue("id", StringComparison.OrdinalIgnoreCase),
28
+ p.GetAttributeValue("version", StringComparison.OrdinalIgnoreCase),
29
+ DependencyType.PackageConfig,
30
+ (p.GetAttribute("developmentDependency", StringComparison.OrdinalIgnoreCase)?.Value ?? "false").Equals(true.ToString(), StringComparison.OrdinalIgnoreCase)));
31
+ }