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.
This commit is contained in:
mdarocha 2022-06-17 11:54:01 +02:00
parent b404c4ae49
commit 2f07f578b2
2 changed files with 14 additions and 1 deletions

View File

@ -6,6 +6,8 @@
, coreutils , coreutils
, findutils , findutils
, gnused , gnused
, jq
, curl
}: }:
runCommandLocal "nuget-to-nix" { runCommandLocal "nuget-to-nix" {
@ -18,6 +20,8 @@ runCommandLocal "nuget-to-nix" {
coreutils coreutils
findutils findutils
gnused gnused
jq
curl
]; ];
}; };

View File

@ -13,6 +13,8 @@ pkgs=$1
tmpfile=$(mktemp /tmp/nuget-to-nix.XXXXXX) tmpfile=$(mktemp /tmp/nuget-to-nix.XXXXXX)
trap "rm -f ${tmpfile}" EXIT trap "rm -f ${tmpfile}" EXIT
declare -A nuget_sources_cache
echo "{ fetchNuGet }: [" echo "{ fetchNuGet }: ["
while read pkg_spec; do while read pkg_spec; do
@ -21,7 +23,14 @@ while read pkg_spec; do
sed -nE 's/.*<id>([^<]*).*/\1/p; s/.*<version>([^<+]*).*/\1/p' "$pkg_spec") sed -nE 's/.*<id>([^<]*).*/\1/p; s/.*<version>([^<+]*).*/\1/p' "$pkg_spec")
pkg_sha256="$(nix-hash --type sha256 --flat --base32 "$(dirname "$pkg_spec")"/*.nupkg)" 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') done < <(find $1 -name '*.nuspec')
LC_ALL=C sort --ignore-case ${tmpfile} LC_ALL=C sort --ignore-case ${tmpfile}