This commit is contained in:
2025-06-16 05:51:49 -05:00
parent a0b7840a21
commit 893082fcc9
4 changed files with 192 additions and 2 deletions

BIN
configs/copy/home/.local/bin/bw Executable file

Binary file not shown.

191
configs/copy/home/.local/bin/gnf Executable file
View File

@ -0,0 +1,191 @@
#!/usr/bin/env bash
#
# gnf Friendly wrapper around 'sudo dnf'
# Version 1.2
# Author: You
#
# Features:
# • Implicit '-y' on install/remove/reinstall/downgrade (toggle with -n/--no-confirm)
# • 'gnf update' pipeline:
# - dnf update [-y] [--refresh]
# - flatpak update (user + system)
# - optional fwupd refresh+update
# with its own flags: -r/--refresh, -f/--firmware, -n/--no-confirm, -y/--yes
# • Passes any other 'dnf' subcommand straight to sudo dnf
# • 'copr' sub-commands get auto '-y' for addrepo/removerepo/enable/disable/list
set -euo pipefail
PROGRAM=$(basename "$0")
VERSION="1.2"
usage() {
cat <<EOF
$PROGRAM wrapper for sudo dnf with smart defaults
Usage:
$PROGRAM [GLOBAL OPTIONS] COMMAND [COMMAND OPTIONS] [ARGS...]
GLOBAL OPTIONS (must precede COMMAND):
-h, --help Show this help and exit
--version Show version and exit
-n, --no-confirm Disable the automatic '-y' on supported commands
-y, --yes (Re-)enable the automatic '-y' (default)
COMMANDS:
install, remove, reinstall, downgrade
→ Implicit '-y' unless disabled by global '-n'
update (alias: upgrade)
→ dnf update + flatpak update + optional fwupd
→ COMMAND OPTIONS:
-r, --refresh Pass --refresh to dnf update
-f, --firmware After dnf+flatpak, run fwupdmgr refresh && update
-n, --no-confirm Do NOT add '-y' to dnf update
-y, --yes Force '-y' on dnf update (default)
→ You may group short flags: e.g. -rf or -fr
copr (subcommands: addrepo, removerepo, enable, disable, list, …)
→ For addrepo/removerepo/enable/disable/list, we auto '-y'
→ Other copr actions are passed straight through
any other dnf COMMAND is forwarded to 'sudo dnf'
EXAMPLES:
gnf install vim git
gnf -n install firefox # interactive remove/install
gnf update # dnf update -y ; flatpak
gnf update -r # + --refresh
gnf update -rf # + firmware
gnf -n update --refresh # no -y, + refresh
gnf copr addrepo user/project
EOF
}
# If no args, show help
if [[ $# -eq 0 ]]; then
usage
exit 0
fi
#
# 1) Parse GLOBAL OPTIONS
#
auto_yes=true
while [[ $# -gt 0 && "$1" == -* ]]; do
case "$1" in
-h|--help) usage; exit 0 ;;
--version) echo "$PROGRAM $VERSION"; exit 0 ;;
-n|--no-confirm) auto_yes=false; shift ;;
-y|--yes) auto_yes=true; shift ;;
--) shift; break ;; # end of globals
*) break ;; # first non-global dash-opt
esac
done
# Must have at least one positional argument now: the COMMAND
if [[ $# -lt 1 ]]; then
echo "Error: no COMMAND specified." >&2
usage
exit 1
fi
cmd=$1; shift
# Treat 'upgrade' as alias for 'update'
[[ "$cmd" == "upgrade" ]] && cmd=update
#
# 2) Dispatch on COMMAND
#
case "$cmd" in
# ---------------------------------------------------------------
# install/remove/reinstall/downgrade (auto '-y' unless -n)
# ---------------------------------------------------------------
install|remove|reinstall|downgrade)
dnf_args=()
$auto_yes && dnf_args+=(-y)
sudo dnf "$cmd" "${dnf_args[@]}" "$@"
exit $?
;;
# ---------------------------------------------------------------
# update pipeline
# ---------------------------------------------------------------
update)
# 2.1) Map any long opts to short ones for getopts
mapped=()
for arg in "$@"; do
case "$arg" in
--refresh) mapped+=(-r) ;;
--firmware) mapped+=(-f) ;;
--no-confirm) mapped+=(-n) ;;
--yes) mapped+=(-y) ;;
--) mapped+=(--);;
*) mapped+=("$arg");;
esac
done
# 2.2) Parse update-specific flags with getopts (supports grouping: -rf)
refresh=false
firmware=false
confirm=$auto_yes
OPTIND=1
# note: the leading colon suppresses getopts own error msg
while getopts ":rfny" opt "${mapped[@]}"; do
case "$opt" in
r) refresh=true ;;
f) firmware=true ;;
n) confirm=false ;;
y) confirm=true ;;
\?) echo "Unknown option '-$OPTARG' for update" >&2; exit 1 ;;
esac
done
shift $((OPTIND - 1))
# 2.3) Run the dnf update
dnf_args=()
$confirm && dnf_args+=(-y)
$refresh && dnf_args+=(--refresh)
sudo dnf update "${dnf_args[@]}" "$@"
# 2.4) Run flatpak updates (user then system)
flatpak update -y
sudo flatpak update
# 2.5) Optional firmware via fwupd
if $firmware; then
sudo fwupdmgr refresh
sudo fwupdmgr update
fi
exit $?
;;
# ---------------------------------------------------------------
# copr sub-commands
# ---------------------------------------------------------------
copr)
if [[ $# -lt 1 ]]; then
echo "Error: 'gnf copr' requires a subcommand." >&2
exit 1
fi
sub=$1; shift
case "$sub" in
addrepo|removerepo|enable|disable|list)
sudo dnf copr "$sub" -y "$@" ;;
*)
sudo dnf copr "$sub" "$@" ;;
esac
exit $?
;;
# ---------------------------------------------------------------
# anything else → pass straight to sudo dnf
# ---------------------------------------------------------------
*)
sudo dnf "$cmd" "$@"
exit $?
;;
esac