[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