|
# I just missed writing yay in terminal |
|
{ pkgs, lib, ... }: |
|
let |
|
mainScript = '' |
|
#!${lib.getExe pkgs.fish} |
|
|
|
# Helper functions for colored output |
|
function __yay_red |
|
printf "\033[31m[!] %s\033[0m\n" $argv[1] |
|
end |
|
|
|
function __yay_green |
|
printf "\033[32m[+] %s\033[0m\n" $argv[1] |
|
end |
|
|
|
function __yay_yellow |
|
printf "\033[33m[*] %s\033[0m\n" $argv[1] |
|
end |
|
|
|
function __yay_blue |
|
printf "\033[34m[i] %s\033[0m\n" $argv[1] |
|
end |
|
|
|
# Function to determine the flake path |
|
function __yay_get_flake_path |
|
set -l path_arg $argv[1] |
|
set -l flake_path "" |
|
|
|
# Priority: 1. Path arg, 2. FLAKE env var, 3. Current directory |
|
if test -n "$path_arg" |
|
# redirect diagnostics to stderr so only the path comes out on stdout |
|
__yay_yellow "Using flake path from argument: $path_arg" >&2 |
|
set flake_path $path_arg |
|
else if set -q FLAKE |
|
__yay_yellow "Using flake path from FLAKE env var: $FLAKE" >&2 |
|
set flake_path $FLAKE |
|
else |
|
set flake_path (pwd) |
|
__yay_yellow "Using current directory as flake path: $flake_path" >&2 |
|
end |
|
|
|
# Verify the flake path has a flake.nix |
|
if not test -f "$flake_path/flake.nix" |
|
__yay_red "No flake.nix found in $flake_path" >&2 |
|
return 1 |
|
end |
|
|
|
# emit only the path on stdout |
|
echo $flake_path |
|
end |
|
|
|
# Function to clean home manager backups |
|
function __yay_clean_hm_backups |
|
__yay_yellow "««« CLEARING HOME-MANAGER BACKUPS »»»" |
|
set total_files (find ~/.config -type f -name "*.homeManagerBackupFileExtension" | wc -l) |
|
|
|
if test $total_files -eq 0 |
|
__yay_green "No home manager backup files found" |
|
return 0 |
|
end |
|
|
|
set counter 0 |
|
find ~/.config -type f -name "*.homeManagerBackupFileExtension" | while read -l file |
|
set counter (math $counter + 1) |
|
echo -n (printf "\rDeleting file %d of %d" $counter $total_files) |
|
rm $file |
|
end |
|
echo # new line after progress |
|
__yay_green "Removed $total_files home manager backup files" |
|
end |
|
|
|
# Command: rebuild |
|
function __yay_rebuild |
|
set -l options h/help 'p/path=' 'H/host=' t/trace |
|
argparse $options -- $argv |
|
or return 1 |
|
|
|
if set -ql _flag_help |
|
echo "Usage: yay rebuild [OPTIONS]" |
|
echo "Options:" |
|
echo " -p, --path PATH Path to the Nix configuration (overrides FLAKE env var)" |
|
echo " -H, --host HOST Hostname to build for (default: current hostname)" |
|
echo " -t, --trace Enable trace output" |
|
echo " -h, --help Show this help message" |
|
return 0 |
|
end |
|
|
|
# Get the flake path |
|
set -l flake_path (__yay_get_flake_path $_flag_path) |
|
if test $status -ne 0 |
|
return 1 |
|
end |
|
|
|
# Determine hostname |
|
set -l host |
|
if set -ql _flag_host |
|
set host $_flag_host |
|
else |
|
set host (hostname) |
|
end |
|
|
|
# Clean home manager backups first |
|
__yay_clean_hm_backups |
|
|
|
# Run the rebuild |
|
__yay_green "««« REBUILDING SYSTEM »»»" |
|
__yay_green "Building configuration for host: $host" |
|
__yay_green "Using flake at: $flake_path" |
|
|
|
# Set the repo path for nh |
|
set -x REPO_PATH $flake_path |
|
|
|
# Change to the flake directory |
|
set -l original_dir (pwd) |
|
cd $flake_path |
|
|
|
# Execute nh os switch |
|
if set -ql _flag_trace |
|
nh os switch . -- --impure --show-trace |
|
else |
|
nh os switch . -- --impure |
|
end |
|
|
|
set -l result $status |
|
|
|
# Return to original directory |
|
cd $original_dir |
|
|
|
if test $result -eq 0 |
|
__yay_green "System rebuild completed successfully!" |
|
else |
|
__yay_red "System rebuild failed with exit code $result" |
|
end |
|
|
|
return $result |
|
end |
|
|
|
# Command: update |
|
function __yay_update |
|
set -l options h/help 'p/path=' |
|
argparse $options -- $argv |
|
or return 1 |
|
|
|
if set -ql _flag_help |
|
echo "Usage: yay update [OPTIONS]" |
|
echo "Options:" |
|
echo " -p, --path PATH Path to the Nix configuration (overrides FLAKE env var)" |
|
echo " -h, --help Show this help message" |
|
return 0 |
|
end |
|
|
|
# Get the flake path |
|
set -l flake_path (__yay_get_flake_path $_flag_path) |
|
if test $status -ne 0 |
|
return 1 |
|
end |
|
|
|
__yay_green "««« UPDATING FLAKE INPUTS »»»" |
|
__yay_green "Using flake at: $flake_path" |
|
|
|
# Change to the flake directory |
|
set -l original_dir (pwd) |
|
cd $flake_path |
|
|
|
# Update the flake inputs |
|
nix flake update |
|
set -l result $status |
|
|
|
# Return to original directory |
|
cd $original_dir |
|
|
|
if test $result -eq 0 |
|
__yay_green "Flake inputs updated successfully!" |
|
else |
|
__yay_red "Failed to update flake inputs with exit code $result" |
|
end |
|
|
|
return $result |
|
end |
|
|
|
# Command: garbage |
|
function __yay_garbage |
|
set -l options h/help |
|
argparse $options -- $argv |
|
or return 1 |
|
|
|
if set -ql _flag_help |
|
echo "Usage: yay garbage" |
|
echo "Clears all possible garbage from the Nix store" |
|
echo "Options:" |
|
echo " -h, --help Show this help message" |
|
return 0 |
|
end |
|
|
|
# ask for sudo once up-front |
|
__yay_yellow "Requesting sudo credentials…" |
|
sudo -v |
|
|
|
__yay_green "««« CLEANING NIX GARBAGE »»»" |
|
|
|
__yay_yellow "Running: sudo nh clean all" |
|
sudo nh clean all |
|
|
|
__yay_yellow "Running: nh clean all" |
|
nh clean all |
|
|
|
__yay_yellow "Running: sudo nix-collect-garbage --delete-old" |
|
sudo nix-collect-garbage --delete-old |
|
|
|
__yay_yellow "Running: nix-collect-garbage --delete-old" |
|
nix-collect-garbage --delete-old |
|
|
|
__yay_yellow "Running: sudo nix-store --gc" |
|
sudo nix-store --gc |
|
|
|
__yay_yellow "Running: nix-store --gc" |
|
nix-store --gc |
|
|
|
__yay_green "Garbage collection completed successfully!" |
|
return 0 |
|
end |
|
|
|
# Command: try |
|
function __yay_try |
|
set -l options h/help |
|
argparse $options -- $argv |
|
or return 1 |
|
|
|
if set -ql _flag_help || test (count $argv) -eq 0 |
|
echo "Usage: yay try PACKAGE [PACKAGE...]" |
|
echo "Creates a shell with the specified package(s)" |
|
echo "Options:" |
|
echo " -h, --help Show this help message" |
|
return 0 |
|
end |
|
|
|
__yay_green "««« CREATING NIX SHELL »»»" |
|
__yay_yellow "Loading packages: $argv" |
|
|
|
# Run nix-shell with the provided packages and launch fish as the interactive shell |
|
nix-shell -p $argv --command fish |
|
|
|
return $status |
|
end |
|
|
|
# Show help |
|
function __yay_help |
|
echo "Usage: yay COMMAND [OPTIONS]" |
|
echo "" |
|
echo "A wrapper around Nix commands" |
|
echo "" |
|
echo "Commands:" |
|
echo " rebuild Rebuild the NixOS configuration" |
|
echo " update Update flake inputs" |
|
echo " garbage Clean up the Nix store" |
|
echo " try Create a shell with the specified package(s)" |
|
echo " help Show this help message" |
|
echo "" |
|
echo "Run 'yay COMMAND --help' for command-specific help" |
|
end |
|
|
|
# Main script entry point |
|
if test (count $argv) -eq 0 |
|
__yay_help |
|
exit 1 |
|
end |
|
|
|
set -l cmd $argv[1] |
|
set -l cmd_args $argv[2..-1] |
|
|
|
switch $cmd |
|
case rebuild |
|
__yay_rebuild $cmd_args |
|
case update |
|
__yay_update $cmd_args |
|
case garbage |
|
__yay_garbage $cmd_args |
|
case try |
|
__yay_try $cmd_args |
|
case -h --help help |
|
__yay_help |
|
case '*' |
|
__yay_red "Unknown command: $cmd" |
|
__yay_help |
|
exit 1 |
|
end |
|
''; |
|
|
|
completionsScript = '' |
|
# Complete the main command |
|
complete -c yay -f |
|
|
|
# Complete the top-level subcommands |
|
complete -c yay -n "__fish_use_subcommand" -a rebuild -d "Rebuild the NixOS configuration" |
|
complete -c yay -n "__fish_use_subcommand" -a update -d "Update flake inputs" |
|
complete -c yay -n "__fish_use_subcommand" -a garbage -d "Clean up the Nix store" |
|
complete -c yay -n "__fish_use_subcommand" -a try -d "Create a shell with the specified package(s)" |
|
complete -c yay -n "__fish_use_subcommand" -a help -d "Show help message" |
|
|
|
# Options for 'rebuild' |
|
complete -c yay -n "__fish_seen_subcommand_from rebuild" -s p -l path -r -d "Path to the Nix configuration" |
|
complete -c yay -n "__fish_seen_subcommand_from rebuild" -s H -l host -r -d "Hostname to build for" |
|
complete -c yay -n "__fish_seen_subcommand_from rebuild" -s t -l trace -d "Enable trace output" |
|
complete -c yay -n "__fish_seen_subcommand_from rebuild" -s h -l help -d "Show help message" |
|
|
|
# Options for 'update' |
|
complete -c yay -n "__fish_seen_subcommand_from update" -s p -l path -r -d "Path to the Nix configuration" |
|
complete -c yay -n "__fish_seen_subcommand_from update" -s h -l help -d "Show help message" |
|
|
|
# Options for 'garbage' |
|
complete -c yay -n "__fish_seen_subcommand_from garbage" -s h -l help -d "Show help message" |
|
|
|
# Options for 'try' |
|
complete -c yay -n "__fish_seen_subcommand_from try" -s h -l help -d "Show help message" |
|
|
|
# Package suggestions for 'try' (using nix-env's available packages) |
|
function __yay_list_packages |
|
# Use persistent cache file in /tmp (lasts until reboot) |
|
set -l cache_file "/tmp/yay_packages_cache" |
|
|
|
# Load from cache if it exists |
|
if test -f "$cache_file" |
|
cat "$cache_file" |
|
return 0 |
|
end |
|
|
|
# Otherwise, fetch packages and store in cache |
|
echo -n "Loading packages..." >&2 |
|
# Run nix-env but redirect warnings to /dev/null |
|
set -l packages (nix-env -qa --json 2>/dev/null | jq -r 'keys[]' 2>/dev/null) |
|
|
|
# Process packages to remove namespace prefix (like "nixos.", "nixpkgs.", etc.) |
|
set -l cleaned_packages |
|
for pkg in $packages |
|
set -l cleaned_pkg (string replace -r '^[^.]+\.' ''\'''\' $pkg) |
|
set -a cleaned_packages $cleaned_pkg |
|
end |
|
|
|
# Save to cache file for future shell sessions |
|
printf "%s\n" $cleaned_packages > "$cache_file" |
|
echo " done!" >&2 |
|
|
|
# Output the packages |
|
printf "%s\n" $cleaned_packages |
|
end |
|
|
|
complete -c yay -n "__fish_seen_subcommand_from try; and not __fish_is_switch" -a "(__yay_list_packages)" -d "Nix package" |
|
''; |
|
|
|
# Create the main script |
|
scriptFile = pkgs.writeTextFile { |
|
name = "yay"; |
|
text = mainScript; |
|
executable = true; |
|
destination = "/bin/yay"; |
|
}; |
|
|
|
# Create the completions file |
|
completionsFile = pkgs.writeTextFile { |
|
name = "yay-completions"; |
|
text = completionsScript; |
|
destination = "/share/fish/vendor_completions.d/yay.fish"; |
|
}; |
|
in |
|
pkgs.symlinkJoin { |
|
name = "yay"; |
|
paths = [ |
|
scriptFile |
|
completionsFile |
|
]; |
|
buildInputs = [ pkgs.makeWrapper ]; |
|
|
|
# Make sure nh is always available in PATH |
|
postBuild = '' |
|
wrapProgram $out/bin/yay \ |
|
--prefix PATH : ${ |
|
lib.makeBinPath [ |
|
pkgs.nh |
|
pkgs.jq |
|
] |
|
} |
|
''; |
|
|
|
meta = with lib; { |
|
description = "A convenient wrapper around Nix commands with fish completions"; |
|
license = licenses.mit; |
|
platforms = platforms.unix; |
|
maintainers = [ "Tophc7" ]; |
|
}; |
|
} |
yay try