--- trunk/mage/usr/lib/mage/magequery.sh 2011/01/28 20:33:29 1206 +++ trunk/mage/usr/lib/mage/magequery.sh 2018/06/04 16:49:01 3094 @@ -1,7 +1,10 @@ #!/bin/bash -#query mage database for installed packages -# $Header: /home/cvsd/magellan-cvs/magellan-src/mage/usr/lib/mage/magequery.sh,v 1.13 2008-10-05 10:33:04 niro Exp $ +# query mage database for installed packages +# $Id$ + +# always export C locale to fix utf-8 issues +export LC_ALL=C print_usage() { @@ -12,7 +15,8 @@ echo " -b BUILD searches for build number BUILD, needs -n -v" echo " -c CAT shows all packages of given categorie" echo " -i shows an inventory of all installed packages" - echo " -f PATH searches package names in given path" + echo " -f PATH searches packages which own given file" + echo " -e PATH searches the package which owns the exact given filename" echo echo " Examples:" echo @@ -25,58 +29,57 @@ GET_INVENTORY=false SEARCH_ONLY_PATH=false SEARCH_ONLY_CAT=false +SEARCH_EXACT_FILENAME=false + +# no params given, or is only an arg not ar param, exit +if [[ $# -lt 1 ]] || [[ ${1:0:1} != - ]] +then + print_usage + exit 1 +fi -while getopts "n:v:b:f:c:hi-" opt +# very basic getops +for i in $* do - case "${opt}" in - n) - S_PNAME="${OPTARG}" - ;; - - v) - S_PVER="${OPTARG}" - ;; - - b) - S_PBUILD="${OPTARG}" - ;; - i) - GET_INVENTORY="true" - ;; - f) - SEARCH_ONLY_PATH="true" - SEARCH_PATH="${OPTARG}" - ;; - c) - SEARCH_ONLY_CAT="true" - SEARCH_CAT="${OPTARG}" - ;; - h) - print_usage - exit 0 - ;; - - -) break - ;; - - *) - print_usage - exit 1 - ;; + case $1 in + -n) shift; S_PNAME="$1"; if [[ -z ${S_PNAME} ]]; then print_usage; exit 1; fi ;; + -v) shift; S_PVER="$1"; if [[ -z ${S_PVER} ]]; then print_usage; exit 1; fi ;; + -b) shift; S_PBUILD="$1"; if [[ -z ${S_PBUILD} ]]; then print_usage; exit 1; fi ;; + -i) GET_INVENTORY="true" ;; + -f) SEARCH_ONLY_PATH="true"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; + -e) SEARCH_ONLY_PATH="true"; SEARCH_EXACT_FILENAME="true"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; + -c) SEARCH_ONLY_CAT="true"; shift; SEARCH_CAT="$1"; if [[ -z ${SEARCH_CAT} ]]; then print_usage; exit 1; fi ;; + -h) print_usage; exit 0 ;; + -*) print_usage; exit 1 ;; esac + shift done -shift $(($OPTIND - 1)) source /etc/mage.rc.global -source /etc/mage.rc +source ${MAGERC} RETVAL=1 if [[ ${SEARCH_ONLY_PATH} = true ]] then unset S_PACKAGES unset i pkg - for i in $(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB}) + if [[ ${SEARCH_EXACT_FILENAME} = true ]] + then + # fix ++, which gets interpreted as a regex + SEARCH_PATH="${SEARCH_PATH//+/\\+}" + # fix [, which gets interpreted as a regex + SEARCH_PATH="${SEARCH_PATH//[/\\[}" + S_CANDIDATES=$(egrep -rl "^${SEARCH_PATH}§" ${INSTALLDB}) + else + S_CANDIDATES=$(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB}) + fi + for i in ${S_CANDIDATES} do + # ignore magefiles! + case ${i} in + *.mage) continue ;; + esac + # print categorie and pkgname pkg="$(basename ${i%/*/*})/$(basename ${i%/*})" if [[ -z $(echo ${S_PACKAGES} | grep ${pkg}) ]] @@ -98,61 +101,51 @@ then # no packages of SEARCH_CAT are installed [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1 - - for i in ${INSTALLDB}/${SEARCH_CAT}/* - do - # print categorie and pkgname - echo "$(basename ${i%/*})/$(basename ${i})" - done + find ${MROOT}${INSTALLDB}/${SEARCH_CAT} -maxdepth 1 -mindepth 1 -printf "${SEARCH_CAT}/%P\n" | sort exit 0 fi +# generate multidim array +declare -i INSTALL_DATABASE_COUNT=0 +for line in $(find ${MROOT}${INSTALLDB} -maxdepth 2 -mindepth 2 -printf '%P\n' | sort) +do + INSTALL_DATABASE_PCAT[${INSTALL_DATABASE_COUNT}]="${line%/*}" + pkgname="${line#*/}" + INSTALL_DATABASE_PNAME[${INSTALL_DATABASE_COUNT}]="${pkgname%-*-*}" + pkgversion="${pkgname//${pkgname%-*-*}-}" + INSTALL_DATABASE_PVER[${INSTALL_DATABASE_COUNT}]="${pkgversion%-*}" + INSTALL_DATABASE_PBUILD[${INSTALL_DATABASE_COUNT}]="${pkgname##*-}" + (( INSTALL_DATABASE_COUNT++ )) +done + if [[ ${GET_INVENTORY} = true ]] then - for package in $(find ${MROOT}${INSTALLDB} -mindepth 2 -maxdepth 2 -type d -printf "%h,%f\n" | sort) + # build the list first + for ((i=0; i