97 lines
2.4 KiB
Bash
97 lines
2.4 KiB
Bash
|
#! /usr/bin/env nix-shell
|
||
|
#! nix-shell -i bash -p dotnet-sdk_3 nixfmt
|
||
|
|
||
|
# Run this script to generate deps.nix
|
||
|
# ./create_deps.sh /path/to/package/source/checkout > deps.nix
|
||
|
|
||
|
# Attribution: this script is shamelessly stolen and barely modified from
|
||
|
# <nixpkgs>/pkgs/applications/blockchains/wasabibackend
|
||
|
|
||
|
URLBASE="https://www.nuget.org/api/v2/package"
|
||
|
|
||
|
DEPS_HEADER="
|
||
|
{ fetchurl }:
|
||
|
let
|
||
|
nugetUrlBase = \"$URLBASE\";
|
||
|
fetchNuGet = { name, version, sha256 }: fetchurl {
|
||
|
inherit sha256;
|
||
|
url = \"\${nugetUrlBase}/\${name}/\${version}\";
|
||
|
};
|
||
|
in ["
|
||
|
|
||
|
DEPS_FOOTER="]"
|
||
|
|
||
|
DEPS_TEMPLATE="
|
||
|
(fetchNuGet {
|
||
|
name = \"%s\";
|
||
|
version = \"%s\";
|
||
|
sha256 = \"%s\";
|
||
|
})"
|
||
|
|
||
|
|
||
|
function generate_restore_log() {
|
||
|
checkout_path=$1
|
||
|
>&2 echo "generating restore log for $checkout_path..."
|
||
|
cd $checkout_path
|
||
|
dotnet nuget locals all --clear
|
||
|
dotnet restore -v normal --no-cache -r linux-x64
|
||
|
cd -
|
||
|
}
|
||
|
|
||
|
function process_restore_log() {
|
||
|
restore_log=$1
|
||
|
>&2 echo "processing restore log..."
|
||
|
while read line; do
|
||
|
if echo $line | grep -q "^[[:space:]]*Installing"; then
|
||
|
l=$(echo $line | xargs)
|
||
|
l=${l#Installing }
|
||
|
l=${l%.}
|
||
|
echo $l
|
||
|
fi
|
||
|
done < $restore_log
|
||
|
}
|
||
|
|
||
|
function prefetch_deps() {
|
||
|
processed_log=$1
|
||
|
>&2 echo "prefetching deps..."
|
||
|
while read line; do
|
||
|
name=$(echo $line | cut -d' ' -f1)
|
||
|
>&2 echo "prefetching '$name' version: $version"
|
||
|
version=$(echo $line | cut -d' ' -f2)
|
||
|
hash=$(nix-prefetch-url "$URLBASE/$name/$version" 2>/dev/null)
|
||
|
echo "$name $version $hash"
|
||
|
done < $processed_log
|
||
|
}
|
||
|
|
||
|
function generate_deps_expression() {
|
||
|
packages=$1
|
||
|
>&2 echo "generating deps nix-expression..."
|
||
|
echo $DEPS_HEADER
|
||
|
while read line; do
|
||
|
name=$(echo $line | cut -d' ' -f1)
|
||
|
version=$(echo $line | cut -d' ' -f2)
|
||
|
hash=$(echo $line | cut -d' ' -f3)
|
||
|
printf "$DEPS_TEMPLATE" $name $version $hash
|
||
|
done < $packages
|
||
|
echo $DEPS_FOOTER
|
||
|
}
|
||
|
|
||
|
function main() {
|
||
|
checkout_path=$1
|
||
|
tmpdir=$(mktemp -d)
|
||
|
generate_restore_log $checkout_path > $tmpdir/restore.log
|
||
|
process_restore_log $tmpdir/restore.log > $tmpdir/processed.log
|
||
|
prefetch_deps $tmpdir/processed.log > $tmpdir/prefetched.log
|
||
|
generate_deps_expression $tmpdir/prefetched.log > $tmpdir/deps.nix
|
||
|
nixfmt $tmpdir/deps.nix
|
||
|
cat $tmpdir/deps.nix
|
||
|
rm -rf $tmpdir
|
||
|
}
|
||
|
|
||
|
if [ ! -d "$1" ]; then
|
||
|
>&2 echo "First argument must be a directory, the path to the package source checkout"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
main $@
|