#! /usr/bin/env dash # shellcheck source=/dev/null SHELL_LIBRARY_VERSION="1.7.1" . %SHELL_LIBRARY_PATH UPDATE_SCRIPT_NAME="update.sh"; CONFIG_DIRECTORY_PATH="$HOME/.local/share/flake-update"; AUTHORS="Soispha" YEARS="2023" # Searches upward for a `UPDATE_SCRIPT_NAME` script # Returns a path to the script if it exists, otherwise nothing is returned check_for_update_script() { dirname="$(search_upward_files "$UPDATE_SCRIPT_NAME")" if [ "$dirname" ]; then printf "%s/%s" "$dirname" "$UPDATE_SCRIPT_NAME" fi } # Checks if a given path to the update script is allowed. # Takes the path as input # Return 0, if allowed, 1 if not. check_for_allowed_update_script(){ update_script="$1"; config_path="${CONFIG_DIRECTORY_PATH}${update_script}"; update_script_hash="$(sha256sum "$update_script")"; if [ -f "$config_path" ]; then if [ "$(cat "$config_path")" = "$update_script_hash" ];then dbg "Recorded hash matches"; return 0; else dbg "Recorded hash \'$(cat "$config_path")\' does not match real hash \'$update_script_hash\', assuming not allowed"; return 1; fi else dbg "Path \'$config_path\' does not exist, assuming not allowed"; return 1; fi } # Asks the user if they want to allow a given script. # Takes the path as input ask_to_allow_update_script(){ update_script="$1"; config_path="${CONFIG_DIRECTORY_PATH}${update_script}"; update_script_hash="$(sha256sum "$update_script")"; println "\033[2J"; # clear the screen cat "$update_script"; readp "Do you want to allow this script?[N/y]: " allow; dbg "allow is: $allow"; case "$allow" in [yY]) dbg "allowed script"; dbg "storing contents in: $config_path"; mkdir --parents "$(dirname "$config_path")"; print "$update_script_hash" > "$config_path"; ;; *) UPDATE_SCRIPT_NOT_ALLOWED=true; ;; esac } # Runs the provided script and continues to update the nix flake # Takes the path to the script and the directory to the flake as arguments # If the path to the update script is empty, it will be ignored update(){ update_script="$1"; flake_base_dir="$2"; [ "$update_script" = "" ] || "$update_script"; dbg "changed directory to: $flake_base_dir"; cd "$flake_base_dir" || die "Provided dir \'$flake_base_dir\' can not be accessed"; nix flake update if grep '[^0-9]_[0-9]' flake.lock > /dev/null; then batgrep '[^0-9]_[0-9]' flake.lock; die "Your flake.nix contains duplicate inputs!"; fi } help() { cat << EOF This is a Nix flake update manager. Usage: $NAME [--help] Options: --help | -h Display this help and exit. --version | -v Display version and copyright information and exit. Commands: flake update the flake project runs a executable called "update-", if it exists EOF } main() { if ! [ "$UPDATE_SCRIPT_NOT_ALLOWED" = true ]; then update_script="$(check_for_update_script)"; flake_base_dir="$(search_flake_base_dir)"; # Assume, that the update script is in the base dir dbg "update_script is: $update_script"; dbg "flake_base_dir is: $flake_base_dir"; if [ "$update_script" = "" ]; then update "" "$flake_base_dir"; elif check_for_allowed_update_script "$update_script" && ! [ "$update_script" = "" ]; then update "$update_script" "$flake_base_dir"; else ask_to_allow_update_script "$update_script"; main; fi fi } if [ "$#" -eq 0 ]; then main; fi for input in "$@"; do case "$input" in "--help" | "-h") help; exit 0; ;; "--version" | "-v") version; exit 0; ;; "--") end_of_cli_options=true; ;; esac [ "$end_of_cli_options" = "true" ] && break done while [ "$#" -ne 0 ]; do case "$1" in "flake") main; shift 1; ;; *) command="$1"; shift 1; [ "$1" = "--" ] && shift 1 if which update-"$command" > /dev/null 2>&1;then if [ "$end_of_cli_options" = "true" ]; then update-"$command" "$@"; else update-"$command"; fi else die "command \"update-$command\" is not executable, or does not exist"; fi ;; esac [ "$end_of_cli_options" = "true" ] && break done