#!/bin/sh # # Copyright (C) 2012, 2013 Etersoft # Copyright (C) 2012, 2013 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/>. # load_helper epm-packages _get_grep_exp() { local def="^$1$" [ "$PMTYPE" != "emerge" ] && echo "$def" && return # Gentoo hack: support for short package form echo "$1" | grep -q "/" && echo "$def" && return echo "/$1$" } # TODO: combine with -qa (the difference only in return status now) _query_via_packages_list() { local res=0 local grepexp local firstpkg=$1 shift grepexp=$(_get_grep_exp $firstpkg) # separate first line for print out command short=1 pkg_filenames=$firstpkg epm_packages | grep -- "$grepexp" || res=1 for pkg in "$@" ; do grepexp=$(_get_grep_exp $pkg) short=1 pkg_filenames=$pkg epm_packages 2>/dev/null | grep -- "$grepexp" || res=1 done return $res } # internal use only, for installed package __epm_get_hilevel_nameform() { [ -n "$*" ] || return case $PMTYPE in apt-rpm) # use # as delimeter for apt local pkg pkg=$(rpm -q --queryformat "%{NAME}#%{SERIAL}:%{VERSION}-%{RELEASE}\n" $1) echo $pkg | grep -q "(none)" && pkg=$(rpm -q --queryformat "%{NAME}#%{VERSION}-%{RELEASE}\n" $1) # HACK: can use only for multiple install packages like kernel echo $pkg | grep -q kernel || return 1 echo $pkg return ;; yum-rpm) # just use strict version with Epoch and Serial local pkg pkg=$(rpm -q --queryformat "%{EPOCH}:%{NAME}%{VERSION}-%{RELEASE}.${ARCH}\n" $1) echo $pkg | grep -q "(none)" && pkg=$(rpm -q --queryformat "%{NAME}-%{VERSION}-%{RELEASE}.${ARCH}\n" $1) echo $pkg return ;; *) return 1 ;; esac } # for local installed packages only # used from epm remove __epm_get_hilevel_name() { local i for i in $@ ; do local pkg # get short form in pkg quiet=1 short=1 pkg=$(__epm_query_name $i) || continue # drop not installed packages # if already short form, skipped [ "$pkg" = "$i" ] && echo "$i" && continue # try get long form or use short form __epm_get_hilevel_nameform $i || echo $pkg done } __epm_query_file() { local CMD [ -z "$*" ] && return case $PMTYPE in *-rpm) CMD="rpm -qp" [ -n "$short" ] && CMD="rpm -qp --queryformat %{name}\n" ;; *-dpkg) CMD="dpkg-deb --show --showformat=\${Package}-\${Version}\n" [ -n "$short" ] && CMD="dpkg-query --show --showformat=\${Package}\n" ;; *) fatal "Do not know command for query file package" ;; esac docmd $CMD $@ } __epm_query_name() { local CMD [ -z "$*" ] && return case $PMTYPE in *-rpm) CMD="rpm -q" [ -n "$short" ] && CMD="rpm -q --queryformat %{name}\n" ;; *-dpkg) #docmd dpkg -l $@ | grep "^ii" CMD="dpkg-query -W --showformat=\${Package}-\${Version}\n" [ -n "$short" ] && CMD="dpkg-query -W --showformat=\${Package}\n" ;; npackd) docmd "npackdcl path --package=$@" return ;; conary) CMD="conary query" ;; homebrew) warning "fix query" return 1 ;; # TODO: need to print name if exists #pkgng) # CMD="pkg info -e" # ;; # Note: slackpkg info pkgname *) # default slow workaround _query_via_packages_list $@ return ;; esac docmd $CMD $@ } # check if pkg is installed is_installed() { pkg_filenames="$@" pkg_names="$@" epm_query >/dev/null 2>/dev/null # broken way to recursive call here (overhead!) #epm installed $@ >/dev/null 2>/dev/null } # fill pkg_installed and pkg_noninstalled separate_installed() { pkg_installed= pkg_noninstalled= for i in $* ; do is_installed $i && pkg_installed="$pkg_installed $i" || pkg_noninstalled="$pkg_noninstalled $i" done } epm_query() { [ -n "$pkg_filenames" ] || fatal "Query: missing package(s) name" __epm_query_file $pkg_files || return __epm_query_name $pkg_names || return }