#!/usr/bin/env bash set -euo pipefail readonly libexec_dir="${0%/*}" # a file with the disko config declare disko_config # a flake uri, if present disko config is relative to the flake root declare from_flake # mount was chosen as the default mode because it's less destructive mode=mount nix_args=() showUsage() { cat <&2 exit 1 } ## Main ## [[ $# -eq 0 ]] && { showUsage exit 1 } while [[ $# -gt 0 ]]; do case "$1" in --debug) set -x ;; -m | --mode) mode=$2 shift ;; -f | --flake) flake="$2" shift ;; --argstr | --arg) nix_args+=("$1" "$2" "$3") shift shift ;; --help) showUsage exit 0 ;; --dry-run) dry_run=y ;; --no-deps) nix_args+=(--arg noDeps true) ;; --show-trace) nix_args+=("$1") ;; *) if [ -z ${disko_config+x} ]; then disko_config=$1 else showUsage exit 1 fi ;; esac shift done if ! ([[ $mode = "create" ]] || [[ $mode = "mount" ]] || [[ $mode = "zap_create_mount" ]]); then abort "mode must be either create, mount or zap_create_mount" fi if [[ ! -z "${flake+x}" ]]; then if [[ $flake =~ ^(.*)\#([^\#\"]*)$ ]]; then flake="${BASH_REMATCH[1]}" flakeAttr="${BASH_REMATCH[2]}" fi if [[ -z "$flakeAttr" ]]; then echo "Please specify the name of the NixOS configuration to be installed, as a URI fragment in the flake-uri." echo "For example, to use the output diskoConfigurations.foo from the flake.nix, append \"#foo\" to the flake-uri." exit 1 fi nix_args+=("--arg" "flake" "$flake") nix_args+=("--argstr" "flakeAttr" "$flakeAttr") nix_args+=(--extra-experimental-features flakes) elif [[ ! -z "${disko_config+x}" ]] && [[ -e "$disko_config" ]]; then nix_args+=("--arg" "diskoFile" "$disko_config") else abort "disko config must be an existing file or flake must be set" fi script=$(nix-build "${libexec_dir}"/cli.nix \ --no-out-link \ --argstr mode "$mode" \ "${nix_args[@]}" ) if [[ ! -z "${dry_run+x}" ]]; then echo "$script" else exec "$script" fi