Adds yay command wrapper for Nix operations

- Removes legacy garbage and rebuild functions from shell initialization
- Integrates a new yay package with commands for rebuild, update, garbage collection, and more
- Adds Fish shell completions for improved usability
- Updates system configuration to include yay as a package
This commit is contained in:
Chris Toph 2025-04-21 04:08:43 -04:00
parent bdc52d2dbd
commit eca43c4d84
3 changed files with 369 additions and 20 deletions

View file

@ -2,30 +2,10 @@ function cd
zoxide $argv
end
# Clears all possible garbage from the Nix store 😀
function garbage
sudo nh clean all
nh clean all
sudo nix-collect-garbage --delete-old
nix-collect-garbage --delete-old
sudo nix-store --gc
nix-store --gc
end
function ls
eza $argv
end
# Rebuilds the NixOS configuration, located in ~/git/Nix/dot.nix for all my hosts
function rebuild
if test -f ~/git/Nix/dot.nix/scripts/rebuild.fish
cd ~/git/Nix/dot.nix
scripts/rebuild.fish
else
echo (set_color yellow)" - Rebuild not found"(set_color normal)
end
end
# Discourage using rm command
function rm
if test (count $argv) -gt 0

View file

@ -26,6 +26,7 @@
ranger
sshfs
wget
yay # my yay @ pkgs teehee
];
# Enable CUPS to print documents.

368
pkgs/yay/package.nix Normal file
View file

@ -0,0 +1,368 @@
# 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
# Cache the result since this can be slow
if not set -q __yay_available_packages
set -g __yay_available_packages (nix-env -qa --json | jq -r 'keys[]' 2>/dev/null)
end
printf "%s\n" $__yay_available_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 integration";
license = licenses.mit;
platforms = platforms.unix;
maintainers = [ "Tophc7" ];
};
}