mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-10 08:16:15 +02:00
108 lines
3.7 KiB
Text
108 lines
3.7 KiB
Text
#! @shell@
|
|
|
|
WORKING_DIRECTORY=$(mktemp -d "${TMPDIR:-/tmp}"/nix-reduce-build-XXXXXX);
|
|
cd "$WORKING_DIRECTORY";
|
|
|
|
if test -z "$1" || test "a--help" = "a$1" ; then
|
|
echo 'nix-reduce-build (paths or Nix expressions) -- (package sources)' >&2
|
|
echo As in: >&2
|
|
echo nix-reduce-build /etc/nixos/nixos -- ssh://user@somewhere.nowhere.example.org >&2
|
|
echo nix-reduce-build /etc/nixos/nixos -- \\
|
|
echo " " \''http://somewhere.nowhere.example.org/nix/nix-http-export.cgi?needed_path='\' >&2
|
|
echo " store path name will be added into the end of the URL" >&2
|
|
echo nix-reduce-build /etc/nixos/nixos -- file://home/user/nar/ >&2
|
|
echo " that should be a directory where gzipped 'nix-store --export' ">&2
|
|
echo " files are located (they should have .nar.gz extension)" >&2
|
|
echo " Or all together: " >&2
|
|
echo -e nix-reduce-build /expr.nix /e2.nix -- \\\\\\\n\
|
|
" ssh://a@b.example.com http://n.example.com/get-nar?q= file://nar/" >&2
|
|
echo " Also supports best-effort local builds of failing expression set:" >&2
|
|
echo "nix-reduce-build /e.nix -- nix-daemon:// nix-self://" >&2
|
|
echo " nix-daemon:// builds using daemon"
|
|
echo " nix-self:// builds directly using nix-store from current installation" >&2
|
|
exit;
|
|
fi;
|
|
|
|
while ! test "$1" = "--" || test "$1" = "" ; do
|
|
echo "$1" >> initial; >&2
|
|
shift;
|
|
done
|
|
shift;
|
|
echo Will work on $(cat initial | wc -l) targets. >&2
|
|
|
|
while read ; do
|
|
case "$REPLY" in
|
|
${NIX_STORE_DIR:-/nix/store}/*)
|
|
echo "$REPLY" >> paths; >&2
|
|
;;
|
|
*)
|
|
nix-instantiate "$REPLY" >> paths;
|
|
;;
|
|
esac;
|
|
done < initial;
|
|
echo Proceeding $(cat paths | wc -l) paths. >&2
|
|
|
|
while read; do
|
|
case "$REPLY" in
|
|
*.drv)
|
|
echo "$REPLY" >> derivers; >&2
|
|
;;
|
|
*)
|
|
nix-store --query --deriver "$REPLY" >>derivers;
|
|
;;
|
|
esac;
|
|
done < paths;
|
|
echo Found $(cat derivers | wc -l) derivers. >&2
|
|
|
|
cat derivers | xargs nix-store --query -R > derivers-closure;
|
|
echo Proceeding at most $(cat derivers-closure | wc -l) derivers. >&2
|
|
|
|
cat derivers-closure | egrep '[.]drv$' | xargs nix-store --query --outputs > wanted-paths;
|
|
cat derivers-closure | egrep -v '[.]drv$' >> wanted-paths;
|
|
echo Prepared $(cat wanted-paths | wc -l) paths to get. >&2
|
|
|
|
cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths;
|
|
echo We need $(cat needed-paths | wc -l) paths. >&2
|
|
|
|
if test -z "$1" ; then
|
|
cat needed-paths;
|
|
fi;
|
|
|
|
for i in "$@"; do
|
|
sshHost="${i#ssh://}";
|
|
httpHost="${i#http://}";
|
|
httpsHost="${i#https://}";
|
|
filePath="${i#file:/}";
|
|
if [ "$i" != "$sshHost" ]; then
|
|
cat needed-paths | while read; do
|
|
echo "Getting $REPLY and its closure over ssh" >&2
|
|
nix-copy-closure --from "$sshHost" --gzip "$REPLY" </dev/null || true;
|
|
done;
|
|
elif [ "$i" != "$httpHost" ] || [ "$i" != "$httpsHost" ]; then
|
|
cat needed-paths | while read; do
|
|
echo "Getting $REPLY over http/https" >&2
|
|
curl ${BAD_CERTIFICATE:+-k} -L "$i${REPLY##*/}" | gunzip | nix-store --import;
|
|
done;
|
|
elif [ "$i" != "$filePath" ] ; then
|
|
cat needed-paths | while read; do
|
|
echo "Installing $REPLY from file" >&2
|
|
gunzip < "$filePath/${REPLY##*/}".nar.gz | nix-store --import;
|
|
done;
|
|
elif [ "$i" = "nix-daemon://" ] ; then
|
|
cat needed-paths | while read ; do
|
|
echo "Building $REPLY using nix-daemon" >&2
|
|
NIX_REMOTE=daemon @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}"
|
|
done;
|
|
elif [ "$i" = "nix-self://" ] ; then
|
|
cat needed-paths | while read ; do
|
|
echo "Building $REPLY using direct Nix build" >&2
|
|
NIX_REMOTE= @bindir@/nix-store -r "${NIX_STORE_DIR:-/nix/store}/${REPLY##*/}"
|
|
done;
|
|
fi;
|
|
mv needed-paths wanted-paths;
|
|
cat wanted-paths | xargs nix-store --check-validity --print-invalid > needed-paths;
|
|
echo We still need $(cat needed-paths | wc -l) paths. >&2
|
|
done;
|
|
|
|
cd /
|
|
rm -r "$WORKING_DIRECTORY"
|