diff --git a/src/Paket.Core/Dependencies/NuGetV2.fs b/src/Paket.Core/Dependencies/NuGetV2.fs index 6f7d984549..d8baaefc3b 100644 --- a/src/Paket.Core/Dependencies/NuGetV2.fs +++ b/src/Paket.Core/Dependencies/NuGetV2.fs @@ -76,7 +76,7 @@ let private followODataLink auth url = let mutable uri = null // warn once per specific API endpoint, but try to cut the query let baseUrl = if Uri.TryCreate(url, UriKind.Absolute, &uri) then uri.AbsolutePath else url traceWarnIfNotBefore baseUrl - "At least one 'next' link (index %d) returned a empty result (noticed on '%O'): ['%s']" + "At least one 'next' link (index %d) returned a empty result (noticed on '%O'): ['%s']" i url (System.String.Join("' ; '", linksToFollow)) | None -> () return @@ -179,10 +179,11 @@ let private handleODataEntry nugetURL packageName version entry = | Some node -> node.InnerText | _ -> "" + // If a package has no dependencies, JFrog Artifactory will return an XML structure without the Dependencies node. let dependencies = match entry |> getNode "properties" |> optGetNode "Dependencies" with | Some node -> node.InnerText - | None -> failwithf "unable to find dependencies for package %O %O" packageName version + | None -> "" let rawPackages = let split (d : string) = @@ -195,7 +196,7 @@ let private handleODataEntry nugetURL packageName version entry = | Some p -> Some p | None -> - if not (restriction.StartsWith "_") then + if not (restriction.StartsWith "_") then Logging.traceWarnIfNotBefore ("Package", restriction, packageName, version) "Could not detect any platforms from '%s' in package %O %O, please tell the package authors" restriction packageName version None else Some PlatformMatching.ParsedPlatformPath.Empty) @@ -480,5 +481,3 @@ let FindPackages(auth, nugetURL, packageNamePrefix, maxResults) = with e -> return FSharp.Core.Result.Error (ExceptionDispatchInfo.Capture e) } - - diff --git a/tests/Paket.Tests/NuGetOData/NoDependenciesNode.xml b/tests/Paket.Tests/NuGetOData/NoDependenciesNode.xml new file mode 100644 index 0000000000..d1f5fe8716 --- /dev/null +++ b/tests/Paket.Tests/NuGetOData/NoDependenciesNode.xml @@ -0,0 +1,44 @@ + + + http://doesntmatter/Packages(Id='NoDeps',Version='1.0.0') + + + NoDeps + Package without any dependencies, as returned by JFrog Artifactory. + 2020-01-01T00:00:00Z + + Someone + + + + + 1.0.0 + 1.0.0 + + 2020-01-01T00:00:00.000 + A package with no dependencies node in the OData response (e.g. JFrog Artifactory). + 0 + http://doesntmatter/packages/NoDeps/1.0.0 + + true + true + false + + 2020-01-01T00:00:00.000 + AAAA + SHA512 + 1234 + + http://doesntmatter/package/ReportAbuse/NoDeps/1.0.0 + + false + + NoDeps + 0 + + + http://doesntmatter/license + + + + diff --git a/tests/Paket.Tests/NuGetOData/ODataSpecs.fs b/tests/Paket.Tests/NuGetOData/ODataSpecs.fs index e8bfa97f5b..ecfbd18be1 100644 --- a/tests/Paket.Tests/NuGetOData/ODataSpecs.fs +++ b/tests/Paket.Tests/NuGetOData/ODataSpecs.fs @@ -149,6 +149,19 @@ let ``can detect explicit dependencies for Microsoft.AspNet.WebApi.Client``() = FrameworkRestriction.And [getPortableRestriction("portable-net45+win8+wp8+wp81+wpa81"); FrameworkRestriction.NotAtLeast(DotNetFramework(FrameworkVersion.V4_5))] |> ExplicitRestriction) +[] +let ``can parse package without Dependencies node as no dependencies``() = + parseEntry "NuGetOData/NoDependenciesNode.xml" + |> shouldEqual + { PackageName = "NoDeps" + DownloadUrl = "http://doesntmatter/package/NoDeps/1.0.0" + SerializedDependencies = [] + Unlisted = false + LicenseUrl = "http://doesntmatter/license" + CacheVersion = NuGet.NuGetPackageCache.CurrentCacheVersion + Version = "1.0.0" + SourceUrl = fakeUrl } + [] let ``can ignore unknown frameworks``() = let parsed = parseList "NuGetOData/BenchmarkDotNet-UnknownFramework.xml" |> ODataSearchResult.get diff --git a/tests/Paket.Tests/Paket.Tests.fsproj b/tests/Paket.Tests/Paket.Tests.fsproj index b07186ecb6..f53cffdd8c 100644 --- a/tests/Paket.Tests/Paket.Tests.fsproj +++ b/tests/Paket.Tests/Paket.Tests.fsproj @@ -83,6 +83,7 @@ +