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

Andrew Gregory andrew.gregory.8 at gmail.com
Wed Jun 19 01:55:45 EDT 2013


On 06/02/13 at 03:39pm, John Frazier wrote:
> 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}

Check our other scripts.  They parse DBPath from pacman.conf

>  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"

I'm not sure checking for exact matches is the best solution here.
Pacman can save multiple .pacsave files with an increasing extension
which this (and our existing searches) will miss.

> +		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