--- trunk/mage/usr/lib/mage/magequery.sh 2006/02/20 00:15:03 332 +++ trunk/mage/usr/lib/mage/magequery.sh 2018/06/04 16:54:53 3096 @@ -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.12 2006-02-20 00:15:03 niro Exp $ +# query mage database for installed packages +# $Id$ + +# always export C locale to fix utf-8 issues +export LC_ALL=C print_usage() { @@ -10,8 +13,10 @@ echo " -n NAME searches for name NAME" echo " -v VER searches for version VER, needs -n" 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 searches packages name 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 @@ -21,55 +26,60 @@ } # default args: -GET_INVENTORY=false -SEARCH_ONLY_PATH=false +GET_INVENTORY=0 +SEARCH_ONLY_PATH=0 +SEARCH_ONLY_CAT=0 +SEARCH_EXACT_FILENAME=0 -while getopts "n:v:b:f:hi-" opt ; 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}" - ;; - h) - print_usage - exit 0 - ;; - - -) break - ;; - - *) - print_usage - exit 1 - ;; +# no params given, or is only an arg not ar param, exit +if [[ $# -lt 1 ]] || [[ ${1:0:1} != - ]] +then + print_usage + exit 1 +fi + +# very basic getops +for i in $* +do + 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="1" ;; + -f) SEARCH_ONLY_PATH="1"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; + -e) SEARCH_ONLY_PATH="1"; SEARCH_EXACT_FILENAME="1"; shift; SEARCH_PATH="$1"; if [[ -z ${SEARCH_PATH} ]]; then print_usage; exit 1; fi ;; + -c) SEARCH_ONLY_CAT="1"; 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 ]] +if [[ ${SEARCH_ONLY_PATH} = 1 ]] then unset S_PACKAGES unset i pkg - for i in $(fgrep -rl "${SEARCH_PATH}" ${INSTALLDB}) + if [[ ${SEARCH_EXACT_FILENAME} = 1 ]] + 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}) ]] @@ -87,85 +97,93 @@ exit 0 fi -if [[ ${GET_INVENTORY} = true ]] +if [[ ${SEARCH_ONLY_CAT} = 1 ]] then - for package in $(find ${MROOT}${INSTALLDB} -mindepth 2 -maxdepth 2 -type d -printf "%h,%f\n" | sort) + # no packages of SEARCH_CAT are installed + [[ ! -d ${MROOT}${INSTALLDB}/${SEARCH_CAT} ]] && exit 1 + 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} = 1 ]] +then + # build the list first + for ((i=0; i