From 2f07f578b264bd90fb16d58744016d92ef3e412b Mon Sep 17 00:00:00 2001 From: mdarocha Date: Fri, 17 Jun 2022 11:54:01 +0200 Subject: [PATCH] nuget-to-nix: support custom package sources If the package was not restored from nuget.org (determinted by checking the "source" field of ".nupkg.metadata"), query the custom source for the package endpoint (the way nuget api is built we can't determine it without an API query) and build a custom package URL to save in the generated deps file. --- pkgs/build-support/dotnet/nuget-to-nix/default.nix | 4 ++++ .../build-support/dotnet/nuget-to-nix/nuget-to-nix.sh | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkgs/build-support/dotnet/nuget-to-nix/default.nix b/pkgs/build-support/dotnet/nuget-to-nix/default.nix index 5267bc24a764..18757692e92d 100644 --- a/pkgs/build-support/dotnet/nuget-to-nix/default.nix +++ b/pkgs/build-support/dotnet/nuget-to-nix/default.nix @@ -6,6 +6,8 @@ , coreutils , findutils , gnused +, jq +, curl }: runCommandLocal "nuget-to-nix" { @@ -18,6 +20,8 @@ runCommandLocal "nuget-to-nix" { coreutils findutils gnused + jq + curl ]; }; diff --git a/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh b/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh index d9eaa041754f..879a87b3341c 100755 --- a/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh +++ b/pkgs/build-support/dotnet/nuget-to-nix/nuget-to-nix.sh @@ -13,6 +13,8 @@ pkgs=$1 tmpfile=$(mktemp /tmp/nuget-to-nix.XXXXXX) trap "rm -f ${tmpfile}" EXIT +declare -A nuget_sources_cache + echo "{ fetchNuGet }: [" while read pkg_spec; do @@ -21,7 +23,14 @@ while read pkg_spec; do sed -nE 's/.*([^<]*).*/\1/p; s/.*([^<+]*).*/\1/p' "$pkg_spec") pkg_sha256="$(nix-hash --type sha256 --flat --base32 "$(dirname "$pkg_spec")"/*.nupkg)" - echo " (fetchNuGet { pname = \"$pkg_name\"; version = \"$pkg_version\"; sha256 = \"$pkg_sha256\"; })" >> ${tmpfile} + pkg_src="$(jq --raw-output '.source' "$(dirname "$pkg_spec")/.nupkg.metadata")" + if [[ $pkg_src != https://api.nuget.org/* ]]; then + pkg_source_url="${nuget_sources_cache[$pkg_src]:=$(curl --fail "$pkg_src" | jq --raw-output '.resources[] | select(."@type" == "PackageBaseAddress/3.0.0")."@id"')}" + pkg_url="$pkg_source_url${pkg_name,,}/${pkg_version,,}/${pkg_name,,}.${pkg_version,,}.nupkg" + echo " (fetchNuGet { pname = \"$pkg_name\"; version = \"$pkg_version\"; sha256 = \"$pkg_sha256\"; url = \"$pkg_url\"; })" >> ${tmpfile} + else + echo " (fetchNuGet { pname = \"$pkg_name\"; version = \"$pkg_version\"; sha256 = \"$pkg_sha256\"; })" >> ${tmpfile} + fi done < <(find $1 -name '*.nuspec') LC_ALL=C sort --ignore-case ${tmpfile}