Implement the default search using the local pacman db.
 Use @sysconfdir@/pacman.conf to find the local db 
 Search for pacsave.0 files.

Signed-off-by: Jonathan Frazier <[email protected]>
---
 contrib/pacdiff.sh.in | 86 ++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 64 insertions(+), 22 deletions(-)

diff --git a/contrib/pacdiff.sh.in b/contrib/pacdiff.sh.in
index 47779d6..ee80c9c 100644
--- a/contrib/pacdiff.sh.in
+++ b/contrib/pacdiff.sh.in
@@ -21,9 +21,8 @@
 declare -r myname='pacdiff'
 declare -r myver='@PACKAGE_VERSION@'
 
-diffprog=${DIFFPROG:-vimdiff}
-diffsearchpath=${DIFFSEARCHPATH:-/etc}
-locate=0
+diffprog=${DIFF_PROG:-vimdiff}
+difffindpath="${DIFF_FIND_PATH:-/etc}"
 USE_COLOR='y'
 
 m4_include(../scripts/library/output_format.sh)
@@ -32,11 +31,19 @@ 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 "  DIFF_PROG variable will override the default editor: vimdiff"
+       echo "  DIFF_FIND_PATH will override the default path when using --find"
+       echo ""
+       echo "Example : DIFF_PROG=meld $myname"
+       echo "Example : DIFF_FIND_PATH=\"/boot /etc /usr\" $myname -f"
 }
 
 version() {
@@ -45,27 +52,61 @@ 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;;
+                       version; exit 0;;
                -h|--help)
-               usage; exit 0;;
+                       usage; exit 0;;
                *)
-               usage; exit 1;;
+                       usage; exit 1;;
        esac
 fi
 
+if [[ ! -n $locate && ! -n $find ]]; then
+       if [[ ! -r @sysconfdir@/pacman.conf ]]; then
+               error "unable to read @sysconfdir@/pacman.conf"
+               usage; exit 1
+       fi
+
+       eval $(awk '/DBPath/ {print $1$2$3}' @sysconfdir@/pacman.conf)
+       pac_db="${DBPath:-@localstatedir@/lib/pacman/}local"
+       if [[ ! -d "${pac_db}" ]]; then
+         error "unable to read pacman db %s". "${pac_db}"
+               usage; exit 1
+       fi
+fi
+
+check_backup() {
+  [[ -f "$1" ]] && printf "$1"'\0'
+}
+
+cmd() {
+       if [[ -n $locate ]]; then
+               locate -0 -e -b \*.pacnew \*.pacorig \*.pacsave 
'*.pacsave.[0-9]'
+       elif [[ -n $find ]]; then
+               find "${difffindpath}" \( -name \*.pacnew -o -name \*.pacorig 
-o -name \*.pacsave -o -name '*.pacsave.[0-9]' \) -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
+                       }
+               }' "${pac_db}"/*/files | while read -r bkup; do
+                       check_backup "/$bkup.pacnew"
+                       check_backup "/$bkup.pacorig"
+                       for f in "/$bkup.pacsave"{,.{0..9}}; do
+                               check_backup "$f"
+                       done
+               done
+       fi
+}
+
 # see http://mywiki.wooledge.org/BashFAQ/020
 while IFS= read -u 3 -r -d '' pacfile; do
        file="${pacfile%.pac*}"
@@ -82,16 +123,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.1


Reply via email to