#!/bin/sh # # Copyright (C) 2009, 2012 Etersoft # Copyright (C) 2009, 2012 Vitaly Lipatov <lav@etersoft.ru> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # copied from etersoft-build-utils/bin/rpmqf __do_query_real_file() { local TOFILE # get canonical path if [ -e "$1" ] ; then TOFILE="$1" else TOFILE=$(which "$1" 2>/dev/null || echo "$1") if [ "$TOFILE" != "$1" ] ; then info "Note: $1 is placed as $TOFILE" fi fi # get value of symbolic link if [ -L "$TOFILE" ] ; then local LINKTO __do_query "$TOFILE" LINKTO=$(readlink -f "$TOFILE") info "Note: $TOFILE is link to $LINKTO" __do_query_real_file "$LINKTO" return fi FULLFILEPATH="$TOFILE" } dpkg_print_name_version() { local ver i for i in $* ; do ver=$(dpkg -s $i 2>/dev/null | grep "Version:" | sed -e "s|Version: ||g") if [ -z "$ver" ] ; then echo "$i" else echo "$i-$ver" fi done } __do_query() { local CMD case $PMTYPE in apt-rpm) CMD="rpm -qf" ;; *-dpkg) showcmd dpkg -S $1 dpkg_print_name_version $(dpkg -S $1 | grep -v "^diversion by" | sed -e "s|:.*||") return ;; yum-rpm|dnf-rpm|urpm-rpm) CMD="rpm -qf" ;; zypper-rpm) CMD="rpm -qf" ;; emerge) assure_exists equery CMD="equery belongs" ;; pacman) CMD="pacman -Qo" ;; pkgng) CMD="pkg which" ;; conary) CMD="conary query --path" ;; slackpkg) # note: need remove leading slash for grep docmd grep -R -- "$(echo $@ | sed -e 's|^/\+||g')" /var/log/packages | sed -e "s|/var/log/packages/||g" return ;; ipkg) CMD="ipkg files" ;; aptcyg) #CMD="apt-cyg packageof" # do not realized locally return 1 ;; *) fatal "Have no suitable query command for $PMTYPE" ;; esac docmd $CMD $@ } __do_short_query() { local CMD case $PMTYPE in *-rpm) CMD="rpm -qf --queryformat %{NAME}\n" ;; NOapt-dpkg) showcmd dpkg -S $1 dpkg_print_name_version $(dpkg -S $1 | sed -e "s|:.*||" | grep -v "^diversion by") return ;; NOemerge) assure_exists equery CMD="equery belongs" ;; NOpacman) CMD="pacman -Qo" ;; NOslackpkg) # note: need remove leading slash for grep docmd grep -R "$(echo $@ | sed -e 's|^/\+||g')" /var/log/packages | sed -e "s|/var/log/packages/||g" return ;; *) fatal "Have no suitable query command for $PMTYPE" ;; esac docmd $CMD $@ } epm_query_file() { # in short mode print handle only real names and do short output # TODO: move to separate command? # FIXME: it is possible use query if [ -n "$short" ] ; then [ -n "$pkg_files$pkg_dirs" ] || fatal "Run query without file names (needed path to files)" __do_short_query $pkg_files $pkg_dirs return fi # file can exists or not [ -n "$pkg_filenames" ] || fatal "Run query without file names" load_helper epm-search_file for pkg in $pkg_filenames ; do __do_query_real_file "$pkg" __do_query "$FULLFILEPATH" || pkg_filenames="$FULLFILEPATH" epm_search_file done }