dependabot-nuget 0.285.0 → 0.287.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.
- checksums.yaml +4 -4
- data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Build.props +5 -1
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/NuGet.CommandLine.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Configuration/NuGet.Configuration.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.LibraryModel/NuGet.LibraryModel.csproj +1 -0
- data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +8 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +7 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +11 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +2 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/CompatabilityChecker.cs +24 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/NuGetContext.cs +15 -4
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/VersionFinder.cs +9 -38
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +10 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +52 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/ProjectBuildFile.cs +15 -8
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IAnalyzeWorker.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IDiscoveryWorker.cs +8 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/IUpdaterWorker.cs +9 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +78 -61
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackageReferenceUpdater.cs +21 -10
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +37 -5
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +5 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +5 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +51 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Analyze/AnalyzeWorkerTests.cs +302 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.cs +269 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +577 -43
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +168 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestAnalyzeWorker.cs +37 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestDiscoveryWorker.cs +35 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestUpdaterWorker.cs +39 -0
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +104 -3
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +51 -13
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DirsProj.cs +4 -2
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +62 -18
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +1 -1
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/PathHelperTests.cs +14 -0
- data/helpers/lib/NuGetUpdater/global.json +1 -1
- data/lib/dependabot/nuget/file_updater.rb +8 -3
- data/lib/dependabot/nuget/native_helpers.rb +11 -12
- metadata +12 -6
- data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/DependencySolverEnvironment.cs +0 -12
@@ -729,6 +729,191 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
|
|
729
729
|
);
|
730
730
|
}
|
731
731
|
|
732
|
+
[Fact]
|
733
|
+
public async Task AnalysisCanContineWhenRegistrationJSONIsMalformed()
|
734
|
+
{
|
735
|
+
// from a case seen in the wild; a transitive dependency's registration JSON has an invalid `range` property
|
736
|
+
// analysis should continue
|
737
|
+
var aspNetCoreAppRefPackage = MockNuGetPackage.WellKnownReferencePackage("Microsoft.AspNetCore.App", "net8.0");
|
738
|
+
var desktopAppRefPackage = MockNuGetPackage.WellKnownReferencePackage("Microsoft.WindowsDesktop.App", "net8.0");
|
739
|
+
var netCoreAppRefPackage = MockNuGetPackage.WellKnownReferencePackage("Microsoft.NETCore.App", "net8.0",
|
740
|
+
[
|
741
|
+
("data/FrameworkList.xml", Encoding.UTF8.GetBytes("""
|
742
|
+
<FileList TargetFrameworkIdentifier=".NETCoreApp" TargetFrameworkVersion="8.0" FrameworkName="Microsoft.NETCore.App" Name=".NET Runtime">
|
743
|
+
</FileList>
|
744
|
+
"""))
|
745
|
+
]);
|
746
|
+
(int, byte[]) TestHttpHandler(string uriString)
|
747
|
+
{
|
748
|
+
var uri = new Uri(uriString, UriKind.Absolute);
|
749
|
+
var baseUrl = $"{uri.Scheme}://{uri.Host}:{uri.Port}";
|
750
|
+
switch (uri.PathAndQuery)
|
751
|
+
{
|
752
|
+
// initial request is good
|
753
|
+
case "/index.json":
|
754
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
755
|
+
{
|
756
|
+
"version": "3.0.0",
|
757
|
+
"resources": [
|
758
|
+
{
|
759
|
+
"@id": "{{baseUrl}}/download",
|
760
|
+
"@type": "PackageBaseAddress/3.0.0"
|
761
|
+
},
|
762
|
+
{
|
763
|
+
"@id": "{{baseUrl}}/query",
|
764
|
+
"@type": "SearchQueryService"
|
765
|
+
},
|
766
|
+
{
|
767
|
+
"@id": "{{baseUrl}}/registrations",
|
768
|
+
"@type": "RegistrationsBaseUrl"
|
769
|
+
}
|
770
|
+
]
|
771
|
+
}
|
772
|
+
"""));
|
773
|
+
case "/registrations/some.package/index.json":
|
774
|
+
return (200, Encoding.UTF8.GetBytes("""
|
775
|
+
{
|
776
|
+
"count": 1,
|
777
|
+
"items": [
|
778
|
+
{
|
779
|
+
"lower": "1.0.0",
|
780
|
+
"upper": "1.1.0",
|
781
|
+
"items": [
|
782
|
+
{
|
783
|
+
"catalogEntry": {
|
784
|
+
"listed": true,
|
785
|
+
"version": "1.0.0"
|
786
|
+
}
|
787
|
+
},
|
788
|
+
{
|
789
|
+
"catalogEntry": {
|
790
|
+
"listed": true,
|
791
|
+
"version": "1.1.0",
|
792
|
+
"dependencyGroups": [
|
793
|
+
{
|
794
|
+
"dependencies": [
|
795
|
+
{
|
796
|
+
"id": "Some.Transitive.Dependency",
|
797
|
+
"range": "",
|
798
|
+
"comment": "The above range is invalid and fails the JSON parse"
|
799
|
+
}
|
800
|
+
]
|
801
|
+
}
|
802
|
+
]
|
803
|
+
}
|
804
|
+
}
|
805
|
+
]
|
806
|
+
}
|
807
|
+
]
|
808
|
+
}
|
809
|
+
"""));
|
810
|
+
case "/download/some.package/index.json":
|
811
|
+
return (200, Encoding.UTF8.GetBytes("""
|
812
|
+
{
|
813
|
+
"versions": [
|
814
|
+
"1.0.0",
|
815
|
+
"1.1.0"
|
816
|
+
]
|
817
|
+
}
|
818
|
+
"""));
|
819
|
+
case "/download/some.package/1.0.0/some.package.1.0.0.nupkg":
|
820
|
+
return (200, MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0").GetZipStream().ReadAllBytes());
|
821
|
+
case "/download/some.package/1.1.0/some.package.1.1.0.nupkg":
|
822
|
+
return (200, MockNuGetPackage.CreateSimplePackage("Some.Package", "1.1.0", "net8.0").GetZipStream().ReadAllBytes());
|
823
|
+
case "/download/microsoft.aspnetcore.app.ref/index.json":
|
824
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
825
|
+
{
|
826
|
+
"versions": [
|
827
|
+
"{{aspNetCoreAppRefPackage.Version}}"
|
828
|
+
]
|
829
|
+
}
|
830
|
+
"""));
|
831
|
+
case "/download/microsoft.netcore.app.ref/index.json":
|
832
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
833
|
+
{
|
834
|
+
"versions": [
|
835
|
+
"{{netCoreAppRefPackage.Version}}"
|
836
|
+
]
|
837
|
+
}
|
838
|
+
"""));
|
839
|
+
case "/download/microsoft.windowsdesktop.app.ref/index.json":
|
840
|
+
return (200, Encoding.UTF8.GetBytes($$"""
|
841
|
+
{
|
842
|
+
"versions": [
|
843
|
+
"{{desktopAppRefPackage.Version}}"
|
844
|
+
]
|
845
|
+
}
|
846
|
+
"""));
|
847
|
+
default:
|
848
|
+
if (uri.PathAndQuery == $"/download/microsoft.aspnetcore.app.ref/{aspNetCoreAppRefPackage.Version}/microsoft.aspnetcore.app.ref.{aspNetCoreAppRefPackage.Version}.nupkg")
|
849
|
+
{
|
850
|
+
return (200, aspNetCoreAppRefPackage.GetZipStream().ReadAllBytes());
|
851
|
+
}
|
852
|
+
|
853
|
+
if (uri.PathAndQuery == $"/download/microsoft.netcore.app.ref/{netCoreAppRefPackage.Version}/microsoft.netcore.app.ref.{netCoreAppRefPackage.Version}.nupkg")
|
854
|
+
{
|
855
|
+
return (200, netCoreAppRefPackage.GetZipStream().ReadAllBytes());
|
856
|
+
}
|
857
|
+
|
858
|
+
if (uri.PathAndQuery == $"/download/microsoft.windowsdesktop.app.ref/{desktopAppRefPackage.Version}/microsoft.windowsdesktop.app.ref.{desktopAppRefPackage.Version}.nupkg")
|
859
|
+
{
|
860
|
+
return (200, desktopAppRefPackage.GetZipStream().ReadAllBytes());
|
861
|
+
}
|
862
|
+
|
863
|
+
// nothing else is found
|
864
|
+
return (404, Encoding.UTF8.GetBytes("{}"));
|
865
|
+
};
|
866
|
+
}
|
867
|
+
using var http = TestHttpServer.CreateTestServer(TestHttpHandler);
|
868
|
+
await TestAnalyzeAsync(
|
869
|
+
extraFiles:
|
870
|
+
[
|
871
|
+
("NuGet.Config", $"""
|
872
|
+
<configuration>
|
873
|
+
<packageSources>
|
874
|
+
<clear />
|
875
|
+
<add key="package_feed" value="{http.BaseUrl.TrimEnd('/')}/index.json" allowInsecureConnections="true" />
|
876
|
+
</packageSources>
|
877
|
+
</configuration>
|
878
|
+
""")
|
879
|
+
],
|
880
|
+
discovery: new()
|
881
|
+
{
|
882
|
+
Path = "/",
|
883
|
+
Projects =
|
884
|
+
[
|
885
|
+
new()
|
886
|
+
{
|
887
|
+
FilePath = "./project.csproj",
|
888
|
+
TargetFrameworks = ["net8.0"],
|
889
|
+
Dependencies =
|
890
|
+
[
|
891
|
+
new("Some.Package", "1.0.0", DependencyType.PackageReference),
|
892
|
+
]
|
893
|
+
}
|
894
|
+
]
|
895
|
+
},
|
896
|
+
dependencyInfo: new()
|
897
|
+
{
|
898
|
+
Name = "Some.Package",
|
899
|
+
Version = "1.0.0",
|
900
|
+
IgnoredVersions = [],
|
901
|
+
IsVulnerable = false,
|
902
|
+
Vulnerabilities = [],
|
903
|
+
},
|
904
|
+
expectedResult: new()
|
905
|
+
{
|
906
|
+
CanUpdate = true,
|
907
|
+
UpdatedVersion = "1.1.0",
|
908
|
+
VersionComesFromMultiDependencyProperty = false,
|
909
|
+
UpdatedDependencies =
|
910
|
+
[
|
911
|
+
new("Some.Package", "1.1.0", DependencyType.Unknown, TargetFrameworks: ["net8.0"]),
|
912
|
+
],
|
913
|
+
}
|
914
|
+
);
|
915
|
+
}
|
916
|
+
|
732
917
|
[Fact]
|
733
918
|
public async Task ResultFileHasCorrectShapeForAuthenticationFailure()
|
734
919
|
{
|
@@ -835,4 +1020,121 @@ public partial class AnalyzeWorkerTests : AnalyzeWorkerTestBase
|
|
835
1020
|
}
|
836
1021
|
);
|
837
1022
|
}
|
1023
|
+
|
1024
|
+
[Fact]
|
1025
|
+
public async Task AnalysisFailsWhenNewerPackageDownloadIsDenied()
|
1026
|
+
{
|
1027
|
+
static (int, byte[]) TestHttpHandler(string uriString)
|
1028
|
+
{
|
1029
|
+
var uri = new Uri(uriString, UriKind.Absolute);
|
1030
|
+
var baseUrl = $"{uri.Scheme}://{uri.Host}:{uri.Port}";
|
1031
|
+
return uri.PathAndQuery switch
|
1032
|
+
{
|
1033
|
+
// initial request is good
|
1034
|
+
"/index.json" => (200, Encoding.UTF8.GetBytes($$"""
|
1035
|
+
{
|
1036
|
+
"version": "3.0.0",
|
1037
|
+
"resources": [
|
1038
|
+
{
|
1039
|
+
"@id": "{{baseUrl}}/download",
|
1040
|
+
"@type": "PackageBaseAddress/3.0.0"
|
1041
|
+
},
|
1042
|
+
{
|
1043
|
+
"@id": "{{baseUrl}}/query",
|
1044
|
+
"@type": "SearchQueryService"
|
1045
|
+
},
|
1046
|
+
{
|
1047
|
+
"@id": "{{baseUrl}}/registrations",
|
1048
|
+
"@type": "RegistrationsBaseUrl"
|
1049
|
+
}
|
1050
|
+
]
|
1051
|
+
}
|
1052
|
+
""")),
|
1053
|
+
// request for package index is good
|
1054
|
+
"/registrations/some.package/index.json" => (200, Encoding.UTF8.GetBytes("""
|
1055
|
+
{
|
1056
|
+
"count": 1,
|
1057
|
+
"items": [
|
1058
|
+
{
|
1059
|
+
"lower": "1.0.0",
|
1060
|
+
"upper": "1.1.0",
|
1061
|
+
"items": [
|
1062
|
+
{
|
1063
|
+
"catalogEntry": {
|
1064
|
+
"listed": true,
|
1065
|
+
"version": "1.0.0"
|
1066
|
+
}
|
1067
|
+
},
|
1068
|
+
{
|
1069
|
+
"catalogEntry": {
|
1070
|
+
"listed": true,
|
1071
|
+
"version": "1.1.0"
|
1072
|
+
}
|
1073
|
+
}
|
1074
|
+
]
|
1075
|
+
}
|
1076
|
+
]
|
1077
|
+
}
|
1078
|
+
""")),
|
1079
|
+
// request for versions is good
|
1080
|
+
"/download/some.package/index.json" => (200, Encoding.UTF8.GetBytes("""
|
1081
|
+
{
|
1082
|
+
"versions": [
|
1083
|
+
"1.0.0",
|
1084
|
+
"1.1.0"
|
1085
|
+
]
|
1086
|
+
}
|
1087
|
+
""")),
|
1088
|
+
// download of old package is good
|
1089
|
+
"/download/some.package/1.0.0/some.package.1.0.0.nupkg" => (200, MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net9.0").GetZipStream().ReadAllBytes()),
|
1090
|
+
// download of new package is denied
|
1091
|
+
"/download/some.package/1.1.0/some.package.1.1.0.nupkg" => (401, Array.Empty<byte>()),
|
1092
|
+
// all other requests are not found
|
1093
|
+
_ => (404, Encoding.UTF8.GetBytes("{}")),
|
1094
|
+
};
|
1095
|
+
}
|
1096
|
+
using var http = TestHttpServer.CreateTestServer(TestHttpHandler);
|
1097
|
+
await TestAnalyzeAsync(
|
1098
|
+
extraFiles:
|
1099
|
+
[
|
1100
|
+
("NuGet.Config", $"""
|
1101
|
+
<configuration>
|
1102
|
+
<packageSources>
|
1103
|
+
<clear />
|
1104
|
+
<add key="private_feed" value="{http.BaseUrl.TrimEnd('/')}/index.json" allowInsecureConnections="true" />
|
1105
|
+
</packageSources>
|
1106
|
+
</configuration>
|
1107
|
+
""")
|
1108
|
+
],
|
1109
|
+
discovery: new()
|
1110
|
+
{
|
1111
|
+
Path = "/",
|
1112
|
+
Projects = [
|
1113
|
+
new()
|
1114
|
+
{
|
1115
|
+
FilePath = "./project.csproj",
|
1116
|
+
TargetFrameworks = ["net9.0"],
|
1117
|
+
Dependencies = [
|
1118
|
+
new("Some.Package", "1.0.0", DependencyType.PackageReference),
|
1119
|
+
],
|
1120
|
+
}
|
1121
|
+
]
|
1122
|
+
},
|
1123
|
+
dependencyInfo: new()
|
1124
|
+
{
|
1125
|
+
Name = "Some.Package",
|
1126
|
+
Version = "1.0.0",
|
1127
|
+
IgnoredVersions = [],
|
1128
|
+
IsVulnerable = false,
|
1129
|
+
Vulnerabilities = [],
|
1130
|
+
},
|
1131
|
+
expectedResult: new()
|
1132
|
+
{
|
1133
|
+
UpdatedVersion = "1.0.0",
|
1134
|
+
CanUpdate = false,
|
1135
|
+
VersionComesFromMultiDependencyProperty = false,
|
1136
|
+
UpdatedDependencies = [],
|
1137
|
+
}
|
1138
|
+
);
|
1139
|
+
}
|
838
1140
|
}
|
@@ -107,6 +107,106 @@ public partial class DiscoveryWorkerTests : DiscoveryWorkerTestBase
|
|
107
107
|
);
|
108
108
|
}
|
109
109
|
|
110
|
+
[Fact]
|
111
|
+
public async Task TestDependenciesSeparatedBySemicolon()
|
112
|
+
{
|
113
|
+
await TestDiscoveryAsync(
|
114
|
+
packages:
|
115
|
+
[
|
116
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
117
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package2", "9.0.1", "net8.0"),
|
118
|
+
],
|
119
|
+
workspacePath: "src",
|
120
|
+
files: new[]
|
121
|
+
{
|
122
|
+
("src/project.csproj", """
|
123
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
124
|
+
<PropertyGroup>
|
125
|
+
<TargetFramework>net8.0</TargetFramework>
|
126
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
127
|
+
</PropertyGroup>
|
128
|
+
|
129
|
+
<ItemGroup>
|
130
|
+
<PackageReference Include="Some.Package;Some.Package2" Version="$(SomePackageVersion)" />
|
131
|
+
</ItemGroup>
|
132
|
+
</Project>
|
133
|
+
""")
|
134
|
+
},
|
135
|
+
expectedResult: new()
|
136
|
+
{
|
137
|
+
Path = "src",
|
138
|
+
Projects = [
|
139
|
+
new()
|
140
|
+
{
|
141
|
+
FilePath = "project.csproj",
|
142
|
+
TargetFrameworks = ["net8.0"],
|
143
|
+
ReferencedProjectPaths = [],
|
144
|
+
ExpectedDependencyCount = 3,
|
145
|
+
Dependencies = [
|
146
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
147
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
148
|
+
new("Some.Package2", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
149
|
+
],
|
150
|
+
Properties = [
|
151
|
+
new("SomePackageVersion", "9.0.1", "src/project.csproj"),
|
152
|
+
new("TargetFramework", "net8.0", "src/project.csproj"),
|
153
|
+
]
|
154
|
+
}
|
155
|
+
]
|
156
|
+
}
|
157
|
+
);
|
158
|
+
}
|
159
|
+
|
160
|
+
[Fact]
|
161
|
+
public async Task TestDependenciesSeparatedBySemicolonWithWhitespace()
|
162
|
+
{
|
163
|
+
await TestDiscoveryAsync(
|
164
|
+
packages:
|
165
|
+
[
|
166
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
167
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package2", "9.0.1", "net8.0"),
|
168
|
+
],
|
169
|
+
workspacePath: "src",
|
170
|
+
files: new[]
|
171
|
+
{
|
172
|
+
("src/project.csproj", """
|
173
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
174
|
+
<PropertyGroup>
|
175
|
+
<TargetFramework>net8.0</TargetFramework>
|
176
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
177
|
+
</PropertyGroup>
|
178
|
+
|
179
|
+
<ItemGroup>
|
180
|
+
<PackageReference Include=" Some.Package ; Some.Package2 " Version="$(SomePackageVersion)" />
|
181
|
+
</ItemGroup>
|
182
|
+
</Project>
|
183
|
+
""")
|
184
|
+
},
|
185
|
+
expectedResult: new()
|
186
|
+
{
|
187
|
+
Path = "src",
|
188
|
+
Projects = [
|
189
|
+
new()
|
190
|
+
{
|
191
|
+
FilePath = "project.csproj",
|
192
|
+
TargetFrameworks = ["net8.0"],
|
193
|
+
ReferencedProjectPaths = [],
|
194
|
+
ExpectedDependencyCount = 3,
|
195
|
+
Dependencies = [
|
196
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
197
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
198
|
+
new("Some.Package2", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net8.0"], IsDirect: true),
|
199
|
+
],
|
200
|
+
Properties = [
|
201
|
+
new("SomePackageVersion", "9.0.1", "src/project.csproj"),
|
202
|
+
new("TargetFramework", "net8.0", "src/project.csproj"),
|
203
|
+
]
|
204
|
+
}
|
205
|
+
]
|
206
|
+
}
|
207
|
+
);
|
208
|
+
}
|
209
|
+
|
110
210
|
[Fact]
|
111
211
|
public async Task TestPackageConfig()
|
112
212
|
{
|
@@ -375,6 +475,175 @@ public partial class DiscoveryWorkerTests : DiscoveryWorkerTestBase
|
|
375
475
|
);
|
376
476
|
}
|
377
477
|
|
478
|
+
[Fact]
|
479
|
+
public async Task TestRepo_SolutionFileCasingMismatchIsResolved()
|
480
|
+
{
|
481
|
+
var solutionPath = "solution.sln";
|
482
|
+
await TestDiscoveryAsync(
|
483
|
+
packages:
|
484
|
+
[
|
485
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
486
|
+
],
|
487
|
+
workspacePath: "",
|
488
|
+
files: new[]
|
489
|
+
{
|
490
|
+
("src/project.csproj", """
|
491
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
492
|
+
<PropertyGroup>
|
493
|
+
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
494
|
+
</PropertyGroup>
|
495
|
+
|
496
|
+
<ItemGroup>
|
497
|
+
<PackageReference Include="Some.Package" />
|
498
|
+
</ItemGroup>
|
499
|
+
</Project>
|
500
|
+
"""),
|
501
|
+
("Directory.Build.props", "<Project />"),
|
502
|
+
("Directory.Packages.props", """
|
503
|
+
<Project>
|
504
|
+
<PropertyGroup>
|
505
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
506
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
507
|
+
</PropertyGroup>
|
508
|
+
|
509
|
+
<ItemGroup>
|
510
|
+
<PackageVersion Include="Some.Package" Version="$(SomePackageVersion)" />
|
511
|
+
</ItemGroup>
|
512
|
+
</Project>
|
513
|
+
"""),
|
514
|
+
(solutionPath, """
|
515
|
+
Microsoft Visual Studio Solution File, Format Version 12.00
|
516
|
+
# Visual Studio 14
|
517
|
+
VisualStudioVersion = 14.0.22705.0
|
518
|
+
MinimumVisualStudioVersion = 10.0.40219.1
|
519
|
+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProJect", ".\src\ProJect.csproj", "{782E0C0A-10D3-444D-9640-263D03D2B20C}"
|
520
|
+
EndProject
|
521
|
+
Global
|
522
|
+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
523
|
+
Debug|Any CPU = Debug|Any CPU
|
524
|
+
Release|Any CPU = Release|Any CPU
|
525
|
+
EndGlobalSection
|
526
|
+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
527
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
528
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
529
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
530
|
+
{782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.Build.0 = Release|Any CPU
|
531
|
+
EndGlobalSection
|
532
|
+
GlobalSection(SolutionProperties) = preSolution
|
533
|
+
HideSolutionNode = FALSE
|
534
|
+
EndGlobalSection
|
535
|
+
EndGlobal
|
536
|
+
"""),
|
537
|
+
},
|
538
|
+
expectedResult: new()
|
539
|
+
{
|
540
|
+
Path = "",
|
541
|
+
ExpectedProjectCount = 2,
|
542
|
+
Projects = [
|
543
|
+
new()
|
544
|
+
{
|
545
|
+
FilePath = "src/project.csproj",
|
546
|
+
TargetFrameworks = ["net7.0", "net8.0"],
|
547
|
+
ExpectedDependencyCount = 2,
|
548
|
+
Dependencies = [
|
549
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
550
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net7.0", "net8.0"], IsDirect: true)
|
551
|
+
],
|
552
|
+
Properties = [
|
553
|
+
new("ManagePackageVersionsCentrally", "true", "Directory.Packages.props"),
|
554
|
+
new("SomePackageVersion", "9.0.1", "Directory.Packages.props"),
|
555
|
+
new("TargetFrameworks", "net7.0;net8.0", "src/project.csproj"),
|
556
|
+
]
|
557
|
+
}
|
558
|
+
],
|
559
|
+
DirectoryPackagesProps = new()
|
560
|
+
{
|
561
|
+
FilePath = "Directory.Packages.props",
|
562
|
+
Dependencies = [
|
563
|
+
new("Some.Package", "9.0.1", DependencyType.PackageVersion, IsDirect: true)
|
564
|
+
],
|
565
|
+
},
|
566
|
+
}
|
567
|
+
);
|
568
|
+
}
|
569
|
+
|
570
|
+
[Fact]
|
571
|
+
public async Task TestDirsProj_CasingMismatchIsResolved()
|
572
|
+
{
|
573
|
+
var dirsProjPath = "dirs.proj";
|
574
|
+
await TestDiscoveryAsync(
|
575
|
+
packages:
|
576
|
+
[
|
577
|
+
MockNuGetPackage.CreateSimplePackage("Some.Package", "9.0.1", "net8.0"),
|
578
|
+
],
|
579
|
+
workspacePath: "",
|
580
|
+
files: new[]
|
581
|
+
{
|
582
|
+
("src/project.csproj", """
|
583
|
+
<Project Sdk="Microsoft.NET.Sdk">
|
584
|
+
<PropertyGroup>
|
585
|
+
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
|
586
|
+
</PropertyGroup>
|
587
|
+
|
588
|
+
<ItemGroup>
|
589
|
+
<PackageReference Include="Some.Package" />
|
590
|
+
</ItemGroup>
|
591
|
+
</Project>
|
592
|
+
"""),
|
593
|
+
("Directory.Build.props", "<Project />"),
|
594
|
+
("Directory.Packages.props", """
|
595
|
+
<Project>
|
596
|
+
<PropertyGroup>
|
597
|
+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
598
|
+
<SomePackageVersion>9.0.1</SomePackageVersion>
|
599
|
+
</PropertyGroup>
|
600
|
+
|
601
|
+
<ItemGroup>
|
602
|
+
<PackageVersion Include="Some.Package" Version="$(SomePackageVersion)" />
|
603
|
+
</ItemGroup>
|
604
|
+
</Project>
|
605
|
+
"""),
|
606
|
+
// Introduce a casing difference in the project reference
|
607
|
+
(dirsProjPath, """
|
608
|
+
<Project>
|
609
|
+
<ItemGroup>
|
610
|
+
<ProjectReference Include="SRC/PROJECT.CSPROJ" />
|
611
|
+
</ItemGroup>
|
612
|
+
</Project>
|
613
|
+
""")
|
614
|
+
},
|
615
|
+
expectedResult: new()
|
616
|
+
{
|
617
|
+
Path = "",
|
618
|
+
ExpectedProjectCount = 2,
|
619
|
+
Projects = [
|
620
|
+
new()
|
621
|
+
{
|
622
|
+
FilePath = "src/project.csproj",
|
623
|
+
TargetFrameworks = ["net7.0", "net8.0"],
|
624
|
+
ExpectedDependencyCount = 2,
|
625
|
+
Dependencies = [
|
626
|
+
new("Microsoft.NET.Sdk", null, DependencyType.MSBuildSdk),
|
627
|
+
new("Some.Package", "9.0.1", DependencyType.PackageReference, TargetFrameworks: ["net7.0", "net8.0"], IsDirect: true)
|
628
|
+
],
|
629
|
+
Properties = [
|
630
|
+
new("ManagePackageVersionsCentrally", "true", "Directory.Packages.props"),
|
631
|
+
new("SomePackageVersion", "9.0.1", "Directory.Packages.props"),
|
632
|
+
new("TargetFrameworks", "net7.0;net8.0", "src/project.csproj"),
|
633
|
+
]
|
634
|
+
}
|
635
|
+
],
|
636
|
+
DirectoryPackagesProps = new()
|
637
|
+
{
|
638
|
+
FilePath = "Directory.Packages.props",
|
639
|
+
Dependencies = [
|
640
|
+
new("Some.Package", "9.0.1", DependencyType.PackageVersion, IsDirect: true)
|
641
|
+
],
|
642
|
+
},
|
643
|
+
}
|
644
|
+
);
|
645
|
+
}
|
646
|
+
|
378
647
|
[Fact]
|
379
648
|
public async Task NonSupportedProjectExtensionsAreSkipped()
|
380
649
|
{
|