dotfiles/bootstrap/update_package_list.sh

62 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env bash
BOOTSTRAP_DIR=~/.dotfiles/bootstrap
OUTPUT=${BOOTSTRAP_DIR}/packages.tsv
pkg_all=$(pacman -Qqett | grep -v "$(pacman -Qqg base-devel)")
pkg_repo=$(pacman -Qqn)
pkg_aur=$(pacman -Qqm)
# tsv file:
# packagename, description, source, target
# toot a toot manager A D
if [ -f "${OUTPUT}_TEMP" ]; then
rm "${OUTPUT}_TEMP"
fi
touch "${OUTPUT}_TEMP"
# create new package list
for pkg in $pkg_all; do
source=""
if $(echo "$pkg_repo" | grep -F -q -x "$pkg"); then
source="R"
elif $(echo "$pkg_aur" | grep -F -q -x "$pkg"); then
source="A"
else
echo "ERROR: The package $pkg could not be found in repositories or AUR."
exit 1
fi
desc=$(pacman -Qs "$pkg" | grep -A1 --color "local/$pkg\s" | tail -n1)
#remove leading whitespace
desc="${desc#"${desc%%[![:space:]]*}"}"
target=""
if [ -f "$OUTPUT" ]; then
found_line=$(grep -e "^$pkg" "$OUTPUT")
fi
if [ -n "$found_line" ]; then
target=$(echo "$found_line" | cut -f4)
printf "Updating pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target"
else
printf "Adding pkg: %s:%s from: %s, for: %s\n" "$pkg" "$desc" "$source" "$target"
fi
printf "%s\t%s\t%s\t%s\n" "$pkg" "$desc" "$source" "$target" >>"${OUTPUT}_TEMP"
done
# notify on any removed packages
if [ -f "$OUTPUT" ]; then
while read -r line; do
if ! echo "$line" | cut -f1 | xargs -I _ grep -F -q -x _ <(echo "$pkg_all"); then
printf "REMOVED: %s" "$line"
fi
done <<<$(tail +2 "$OUTPUT")
fi
# actually write to file
cat <(printf "Name\tDescription\tSource\tTarget\n") "${OUTPUT}_TEMP" >"$OUTPUT"
rm "${OUTPUT}_TEMP"