diff --git a/home/toph/common/core/fish/init.fish b/home/toph/common/core/fish/init.fish index 55b76ef..5593450 100644 --- a/home/toph/common/core/fish/init.fish +++ b/home/toph/common/core/fish/init.fish @@ -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 diff --git a/hosts/common/core/default.nix b/hosts/common/core/default.nix index f6024b2..daf9447 100644 --- a/hosts/common/core/default.nix +++ b/hosts/common/core/default.nix @@ -26,6 +26,7 @@ ranger sshfs wget + yay # my yay @ pkgs teehee ]; # Enable CUPS to print documents. diff --git a/pkgs/yay/package.nix b/pkgs/yay/package.nix new file mode 100644 index 0000000..856df2f --- /dev/null +++ b/pkgs/yay/package.nix @@ -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" ]; + }; +}