#!/usr/bin/env bash set -euo pipefail # Build and cache the specified arguments just() { if command -v nom &> /dev/null; then nom build "$@" else nix build "$@" fi if [ -z ${ATTIC_TOKEN+x} ]; then echo "\$ATTIC_TOKEN is unset, skipping uploading to the binary cache" return fi nix run --inputs-from . attic -- \ login \ "$ATTIC_SERVER" \ "$ATTIC_ENDPOINT" \ "$ATTIC_TOKEN" # Find all output paths of the installables and their build dependencies readarray -t derivations < <(nix path-info --derivation "$@") readarray -t cache < <( xargs \ nix-store --query --requisites --include-outputs \ <<< "${derivations[*]}" ) # Upload them to Attic # # 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 . attic -c xargs \ attic push "$ATTIC_SERVER:$ATTIC_CACHE" <<< "${cache[*]}" ) } # Build and cache things needed for CI ci() { cache=( --inputs-from . # Keep sorted ".#devShells.x86_64-linux.default" attic#default nixpkgs#direnv nixpkgs#jq nixpkgs#nix-direnv ) just "${cache[@]}" } # Build and cache all the package outputs packages() { readarray -t cache < <( nix flake show --json 2> /dev/null | nix run --inputs-from . nixpkgs#jq -- \ -r \ '.packages."x86_64-linux" | keys | map(".#" + .) | .[]' ) just "${cache[@]}" } pushd "$(git rev-parse --show-toplevel)" > /dev/null "$@" popd > /dev/null