[pacman-dev] [PATCH] pacdiff - implement default search using local pacman db

John Frazier eyeswide at gmail.com
Sun Jun 2 15:39:29 EDT 2013


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 <pacman-dev at 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;;
 		-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



More information about the pacman-dev mailing list