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 <eyeswide@gmail.com> --- 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 <pacman-dev@archlinux.org>' } -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