Use pacman local db to find pacnews based on active configs. Relegate
find to an option. Rename DIFFSEARCHPATH to DIFFFINDPATH to clarify use.
Add quit option to prompts. Clarify help.
---
contrib/pacdiff.sh.in | 65 +++++++++++++++++++++++++++++++++++++--------------
1 file changed, 47 insertions(+), 18 deletions(-)
diff --git a/contrib/pacdiff.sh.in b/contrib/pacdiff.sh.in
index 47779d6..25c3fd6 100644
--- a/contrib/pacdiff.sh.in
+++ b/contrib/pacdiff.sh.in
@@ -22,8 +22,8 @@ declare -r myname='pacdiff'
declare -r myver='@PACKAGE_VERSION@'
diffprog=${DIFFPROG:-vimdiff}
-diffsearchpath=${DIFFSEARCHPATH:-/etc}
-locate=0
+difffindpath=${DIFFFINDPATH:-/etc}
+diffpacmandb=${DIFFPACMANDB:-/var/lib/pacman}
USE_COLOR='y'
m4_include(../scripts/library/output_format.sh)
@@ -32,11 +32,21 @@ m4_include(../scripts/library/term_colors.sh)
usage() {
echo "$myname : a simple pacnew/pacorig/pacsave updater"
- echo "Usage : $myname [-l]"
- echo " -l/--locate makes $myname use locate rather than find"
- echo " DIFFPROG variable allows to override the default vimdiff"
- echo " DIFFSEARCHPATH allows to override the default /etc path"
- echo "Example : DIFFPROG=meld DIFFSEARCHPATH=\"/boot /etc /usr\"
$myname"
+ echo ""
+ echo "Usage : $myname [-lf]"
+ echo " -l/--locate makes $myname search using locate"
+ echo " -f/--find makes $myname search using find"
+ echo ""
+ echo "Note: the default search looks for backup files in the local
pacman db"
+ echo " this generally will not find *.pacsave files"
+ echo ""
+ echo " DIFFPROG variable will override the default editor: vimdiff"
+ echo " DIFFFINDPATH will override the default path when using --find"
+ echo " DIFFPACMANDB will override the default pacman db for the "
+ echo " default search type"
+ echo ""
+ echo "Example : DDIFFPROG=meld DIFFPACMANDB=/mnt/var/lib/pacman/
$myname"
+ echo "Example : DIFFFINDPATH=\"/boot /etc /usr\" $myname"
}
version() {
@@ -45,18 +55,12 @@ version() {
echo 'Copyright (C) 2013 Pacman Development Team
<[email protected]>'
}
-cmd() {
- if [ $locate -eq 1 ]; then
- locate -0 -e -b \*.pacnew \*.pacorig \*.pacsave
- else
- find $diffsearchpath \( -name \*.pacnew -o -name \*.pacorig -o
-name \*.pacsave \) -print0
- fi
-}
-
if [ $# -gt 0 ]; then
case $1 in
-l|--locate)
- locate=1;;
+ locate=$(type -P locate);;
+ -f|--find)
+ find=$(type -P find);;
-V|--version)
version; exit 0;;
-h|--help)
@@ -66,6 +70,30 @@ if [ $# -gt 0 ]; then
esac
fi
+check_backup() {
+ [[ -f $1 ]] && printf "$1"'\0'
+}
+
+cmd() {
+ if [[ -n $locate ]]; then
+ locate -0 -e -b \*.pacnew \*.pacorig \*.pacsave
+ elif [[ -n $find ]]; then
+ find "${difffindpath}" \( -name \*.pacnew -o -name \*.pacorig
-o -name \*.pacsave \) -print0 2> /dev/null
+ else
+ # parse local pacman db for backup files and look for pac*
based on them
+ awk '/^%BACKUP%$/ {
+ while (getline) {
+ if (/^$/) { nextfile }
+ print $1
+ }
+ }' "${diffpacmandb}"/local/*/files | while read -r bkup; do
+ check_backup "/$bkup.pacnew"
+ check_backup "/$bkup.pacorig"
+ check_backup "/$bkup.pacsave"
+ done
+ fi
+}
+
# see http://mywiki.wooledge.org/BashFAQ/020
while IFS= read -u 3 -r -d '' pacfile; do
file="${pacfile%.pac*}"
@@ -82,16 +110,17 @@ while IFS= read -u 3 -r -d '' pacfile; do
msg2 "Files are identical, removing..."
rm -v "$pacfile"
else
- ask "(V)iew, (S)kip, (R)emove %s, (O)verwrite with %s:
[v/s/r/o] " "$file_type" "$file_type"
+ ask "(V)iew, (S)kip, (R)emove %s, (O)verwrite with %s, (Q)uit:
[v/s/r/o/q] " "$file_type" "$file_type"
while read c; do
case $c in
+ q|Q) exit 1;;
r|R) rm -v "$pacfile"; break ;;
o|O) mv -v "$pacfile" "$file"; break ;;
v|V)
$diffprog "$pacfile" "$file"
rm -iv "$pacfile"; break ;;
s|S) break ;;
- *) ask "Invalid answer. Try again: [v/s/r/o] ";
continue ;;
+ *) ask "Invalid answer. Try again: [v/s/r/o/q]
"; continue ;;
esac
done
fi
--
1.8.3