bootstrap: Update package list script

Takes simple options -h (show help), -v (verbose), -n (dry-run) when
started.

By default does not spam output of *all* recognized packages anymore but
simply prints a diff at the end. Old output can be enabled with `-v`
verbose option.

Diff is shown even if dry-run mode is enabled so that using dry-run by
default will show you a preview of what changed.
This commit is contained in:
Marty Oehme 2022-04-27 13:00:09 +02:00
parent b947493765
commit 71c41ecbde
Signed by: Marty
GPG key ID: B7538B8F50A1C800

View file

@ -7,6 +7,24 @@ pkg_all=$(pacman -Qqett | grep -v "$(pacman -Qqg base-devel)")
pkg_repo=$(pacman -Qqn) pkg_repo=$(pacman -Qqn)
pkg_aur=$(pacman -Qqm) pkg_aur=$(pacman -Qqm)
while getopts "nvh" opt; do
case "$opt" in
n) DRYRUN=true ;;
v) VERBOSE=true ;;
h | *)
{
printf "\nUpdate the list of installed packages.\n\nWill compare packages committed to the dotfile repository\nand those currently installed (on an Arch system, using pacman).\nUpdates the list of committed packages in repository\nand prints out the differences as a diff.\n\nOptions:\n\n\t-h\tDisplay this help.\n\t-v\tShow verbose information.\n\t-n\tPrint out changes without changing anything (dry-run).\n"
exit 1
}
;;
esac
done
print_msg() {
# shellcheck disable=2059
[ -n "$VERBOSE" ] && printf "$@"
}
# tsv file: # tsv file:
# packagename, description, source, target # packagename, description, source, target
# toot a toot manager A D # toot a toot manager A D
@ -20,9 +38,9 @@ touch "${OUTPUT}_TEMP"
for pkg in $pkg_all; do for pkg in $pkg_all; do
source="" source=""
if $(echo "$pkg_repo" | grep -F -q -x "$pkg"); then if echo "$pkg_repo" | grep -F -q -x "$pkg"; then
source="R" source="R"
elif $(echo "$pkg_aur" | grep -F -q -x "$pkg"); then elif echo "$pkg_aur" | grep -F -q -x "$pkg"; then
source="A" source="A"
else else
echo "ERROR: The package $pkg could not be found in repositories or AUR." echo "ERROR: The package $pkg could not be found in repositories or AUR."
@ -39,9 +57,9 @@ for pkg in $pkg_all; do
fi fi
if [ -n "$found_line" ]; then if [ -n "$found_line" ]; then
target=$(echo "$found_line" | cut -f4) target=$(echo "$found_line" | cut -f4)
printf "Updating pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target" print_msg "Updating pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target"
else else
printf "Adding pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target" print_msg "Adding pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target"
fi fi
printf "%s\t%s\t%s\t%s\n" "$pkg" "$desc" "$source" "$target" >>"${OUTPUT}_TEMP" printf "%s\t%s\t%s\t%s\n" "$pkg" "$desc" "$source" "$target" >>"${OUTPUT}_TEMP"
@ -51,11 +69,19 @@ done
if [ -f "$OUTPUT" ]; then if [ -f "$OUTPUT" ]; then
while read -r line; do while read -r line; do
if ! echo "$line" | cut -f1 | xargs -I _ grep -F -q -x _ <(echo "$pkg_all"); then if ! echo "$line" | cut -f1 | xargs -I _ grep -F -q -x _ <(echo "$pkg_all"); then
printf "REMOVED: %s" "$line" printf "REMOVED: %s\n" "$line"
fi fi
done <<<$(tail +2 "$OUTPUT") done <<<"$(tail +2 $OUTPUT)"
fi
# show file changes
if [ -f "$OUTPUT" ] && [ -f "$OUTPUT"_TEMP ]; then
changes=$(diff --color=always -y --suppress-common-lines "$OUTPUT" "$OUTPUT"_TEMP | tail -n+2)
printf "FILE CHANGES:\n=============\n%s" "$changes"
fi fi
# actually write to file # actually write to file
cat <(printf "Name\tDescription\tSource\tTarget\n") "${OUTPUT}_TEMP" >"$OUTPUT" if [ -z "$DRYRUN" ]; then
cat <(printf "Name\tDescription\tSource\tTarget\n") "${OUTPUT}_TEMP" >"$OUTPUT"
fi
rm "${OUTPUT}_TEMP" rm "${OUTPUT}_TEMP"