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


Reply via email to