#!/nix/store/ciarnmsx8lvsrmdbjddpmx0pqjrm8imb-bash-5.3p3/bin/bash # shellcheck shell=bash set -euo pipefail shopt -s nullglob export SSL_CERT_FILE=/nix/store/6jsh5hyyli9ddac6dqxx07a68jzllkqb-nss-cacert-3.115/etc/ssl/certs/ca-bundle.crt export PATH="/nix/store/rqn7v98b071xg19iyrz3qzlby8nwmqh3-nix-2.31.2/bin:/nix/store/xs8scz9w9jp4hpqycx3n3bah5y07ymgj-coreutils-9.8/bin:/nix/store/frzsv47z1mcyrp941zab08mx6kardizi-jq-1.8.1-bin/bin:/nix/store/69j5n7qzjlphqpgsx4bbbp6zcklm7cih-xmlstarlet-1.6.1/bin:/nix/store/xvh4bi0cc2cw18lpn6ax9m4zwnn1s9lj-curl-8.16.0-bin/bin:/nix/store/22r4s6lqhl43jkazn51f3c18qwk894g4-gnugrep-3.12/bin:/nix/store/8c4l9cqqj7pixqlmljx5d495pfpw8pys-gawk-5.3.2/bin:$PATH" # used for glob ordering of package names export LC_ALL=C if [ $# -eq 0 ]; then >&2 echo "Usage: $0 [path to a file with a list of excluded packages] > deps.json" exit 1 fi pkgs=$1 tmp=$(realpath "$(mktemp -td nuget-to-json.XXXXXX)") trap 'rm -r "$tmp"' EXIT excluded_list=$(realpath "${2:-/dev/null}") export DOTNET_NOLOGO=1 export DOTNET_CLI_TELEMETRY_OPTOUT=1 mapfile -t sources < <(dotnet nuget list source --format short | awk '/^E / { print $2 }') wait "$!" declare -a remote_sources declare -A base_addresses for index in "${sources[@]}"; do if [[ -d "$index" ]]; then continue fi remote_sources+=("$index") index_response=$( if [[ "$index" =~ .*dev\.azure\.com.* ]] && [ -n "$NUGET_PAT" ]; then curl --anyauth -u "user:$NUGET_PAT" --netrc-optional --compressed -fsSL "$index" else curl --netrc-optional --compressed -fsSL "$index" fi ) base_address=$( echo "$index_response" | jq -r '.resources[] | select(."@type" == "PackageBaseAddress/3.0.0")."@id"' ) if [[ ! "$base_address" == */ ]]; then base_address="$base_address/" fi base_addresses[$index]="$base_address" done ( echo '[' first=true cd "$pkgs" for package in *; do [[ -d "$package" ]] || continue cd "$package" for version in *; do id=$(xmlstarlet sel -t -v /_:package/_:metadata/_:id "$version"/*.nuspec) if grep -qxF "$id.$version.nupkg" "$excluded_list"; then continue fi # packages in the nix store should have an empty metadata file # packages installed with 'dotnet tool' may be missing 'source' used_source="$(jq -r 'if has("source") then .source elif has("contentHash") then "__unknown" else "" end' "$version"/.nupkg.metadata)" found=false if [[ -z "$used_source" || -d "$used_source" ]]; then continue fi for source in "${remote_sources[@]}"; do url="${base_addresses[$source]}$package/$version/$package.$version.nupkg" if [[ "$source" == "$used_source" ]]; then hash="$(nix-hash --type sha256 --flat --sri "$version/$package.$version".nupkg)" found=true break else # do nothing if the package does not already exist # locally, since nix-prefetch-url does not handle authentication : fi done if [[ $found = false ]]; then echo "couldn't find $package $version" >&2 exit 1 fi if [[ $first = false ]]; then echo ' , {' else echo ' {' fi echo " \"pname\": \"$id\"" echo " , \"version\": \"$version\"" echo " , \"hash\": \"$hash\"" if [[ "$source" != https://api.nuget.org/v3/index.json ]]; then echo " , \"url\": \"$url\"" fi echo ' }' first=false done cd .. done echo ']' ) | jq .