--- trunk/mage/usr/lib/mage/magequery.sh 2005/01/10 01:59:03 43 +++ branches/mage-next/src/magequery.in 2018/06/04 16:59:42 3097 @@ -1,7 +1,10 @@ #!/bin/bash -#query mage database for installed packages -# version: 0.3.6-r11 +# query mage database for installed packages +# $Id$ + +# always export C locale to fix utf-8 issues +export LC_ALL=C print_usage() { @@ -10,6 +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 PATH searches packages which own given file" + echo " -e PATH searches the package which owns the exact given filename" echo echo " Examples:" echo @@ -18,98 +25,165 @@ echo } -while getopts "n:v:b:h-" opt ; do - case "${opt}" in - n) - S_PNAME="${OPTARG}" - ;; - - v) - S_PVER="${OPTARG}" - ;; - - b) - S_PBUILD="${OPTARG}" - ;; - h) - print_usage - exit 0 - ;; - - -) break - ;; - - *) - print_usage - exit 1 - ;; +# default args: +GET_INVENTORY=0 +SEARCH_ONLY_PATH=0 +SEARCH_ONLY_CAT=0 +SEARCH_EXACT_FILENAME=0 + +# 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 +source /etc/mage.rc.global +source ${MAGERC} RETVAL=1 -for i in ${INSTALLDB}/*/* +if [[ ${SEARCH_ONLY_PATH} = 1 ]] +then + unset S_PACKAGES + unset i pkg + 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}) ]] + then + S_PACKAGES="${S_PACKAGES} ${pkg}" + fi + done + + # show packages + for pkg in ${S_PACKAGES} + do + echo "${pkg}" + done + + exit 0 +fi + +if [[ ${SEARCH_ONLY_CAT} = 1 ]] +then + # 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