diff --git a/bin/nix-build-and-cache b/bin/nix-build-and-cache index 140fd561..67e3aa4e 100755 --- a/bin/nix-build-and-cache +++ b/bin/nix-build-and-cache @@ -13,41 +13,55 @@ just() { nix build -L "$@" fi - if [ ! -z "$ATTIC_TOKEN" ]; then - # historical "conduit" store for compatibility purposes, same as conduwuit - nix run --inputs-from "$toplevel" attic -- \ - login \ - conduit \ - "${ATTIC_ENDPOINT:-https://attic.kennel.juneis.dog/conduit}" \ - "$ATTIC_TOKEN" - - readarray -t outputs < <(nix path-info "$@") - readarray -t derivations < <(nix path-info "$@" --derivation) - - # Push the target installable and its build dependencies - nix run --inputs-from "$toplevel" attic -- \ - push \ - conduit \ - "${outputs[@]}" \ - "${derivations[@]}" - - # main "conduwuit" store - nix run --inputs-from "$toplevel" attic -- \ - login \ - conduwuit \ - "${ATTIC_ENDPOINT:-https://attic.kennel.juneis.dog/conduwuit}" \ - "$ATTIC_TOKEN" - - # Push the target installable and its build dependencies - nix run --inputs-from "$toplevel" attic -- \ - push \ - conduwuit \ - "${outputs[@]}" \ - "${derivations[@]}" - else + if [ -z "$ATTIC_TOKEN" ]; then echo "\$ATTIC_TOKEN is unset, skipping uploading to the binary cache" + return fi + # historical "conduit" store for compatibility purposes, same as conduwuit + nix run --inputs-from "$toplevel" attic -- \ + login \ + conduit \ + "${ATTIC_ENDPOINT:-https://attic.kennel.juneis.dog/conduit}" \ + "$ATTIC_TOKEN" + + # Find all output paths of the installables and their build dependencies + readarray -t derivations < <(nix path-info --derivation "$@") + cache=() + for derivation in "${derivations[@]}"; do + cache+=( + "$(nix-store --query --requisites --include-outputs "$derivation")" + ) + done + + # Upload them to Attic (conduit store) + # + # Use `xargs` and a here-string because something would probably explode if + # several thousand arguments got passed to a command at once. Hopefully no + # store paths include a newline in them. + ( + IFS=$'\n' + nix shell --inputs-from "$toplevel" attic -c xargs \ + attic push conduit <<< "${cache[*]}" + ) + + # main "conduwuit" store + nix run --inputs-from "$toplevel" attic -- \ + login \ + conduwuit \ + "${ATTIC_ENDPOINT:-https://attic.kennel.juneis.dog/conduwuit}" \ + "$ATTIC_TOKEN" + + # Upload them to Attic (conduwuit store) + # + # Use `xargs` and a here-string because something would probably explode if + # several thousand arguments got passed to a command at once. Hopefully no + # store paths include a newline in them. + ( + IFS=$'\n' + nix shell --inputs-from "$toplevel" attic -c xargs \ + attic push conduwuit <<< "${cache[*]}" + ) } # Build and cache things needed for CI @@ -56,7 +70,7 @@ ci() { --inputs-from "$toplevel" # Keep sorted - "$toplevel#devShells.x86_64-linux.default.inputDerivation" + "$toplevel#devShells.x86_64-linux.default" attic#default nixpkgs#direnv nixpkgs#jq