epm-filelist 5.27 KB
Newer Older
1 2
#!/bin/sh
#
Vitaly Lipatov's avatar
Vitaly Lipatov committed
3 4
# Copyright (C) 2012-2018  Etersoft
# Copyright (C) 2012-2018  Vitaly Lipatov <lav@etersoft.ru>
5
#
6 7 8
# 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
9 10 11 12 13
# (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
14
# GNU Affero General Public License for more details.
15
#
16 17
# 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/>.
18 19
#

20
load_helper epm-query
21
load_helper epm-print
22
load_helper epm-sh-warmup
23

24 25 26
# TODO: port or rewrite apt-file
# https://bugzilla.altlinux.org/show_bug.cgi?id=14449
# see also epm-search-file
27
__alt_local_content_filelist()
28
{
29
    load_helper epm-sh-altlinux
30
    load_helper epm-sh-altlinux-contents-index
31
    load_helper epm-check_updated_repo
32

33 34
    check_alt_contents_index || init_alt_contents_index
    update_repo_if_needed
35
    local CI="$(cat $ALT_CONTENTS_INDEX_LIST)"
36

Vitaly Lipatov's avatar
Vitaly Lipatov committed
37
    # TODO: safe way to use less or bat
38 39 40 41 42
    #local OUTCMD="less"
    #[ -n "$USETTY" ] || OUTCMD="cat"
    OUTCMD="cat"

    {
Vitaly Lipatov's avatar
Vitaly Lipatov committed
43
        [ -n "$USETTY" ] && info "Search in $CI for $1..."
44
        ercat $CI | grep -h -P -- ".*\t$1$" | sed -e "s|\(.*\)\t\(.*\)|\1|g"
45 46 47
    } | $OUTCMD
}

48 49 50
__deb_local_content_filelist()
{
    showcmd "apt-file list $1 | grep '^$1: ' | sed -e 's|$1: ||g'"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
51
    a='' apt-file list "$1" | grep "^$1: " | sed -e "s|$1: ||g"
52 53
}

54 55 56

__epm_filelist_remote()
{
57 58
    [ -z "$*" ] && return

59 60
    case $BASEDISTRNAME in
        alt)
61 62
            # TODO: use RESTful interface to prometeus? See ALT bug #29496
            docmd_foreach __alt_local_content_filelist "$@"
63
            return
64
            ;;
65 66 67
    esac

    case $PMTYPE in
68
        apt-dpkg)
69
            try_assure_exists apt-file || return
70 71 72 73 74 75 76 77 78 79 80
            if sudo_allowed ; then
                sudocmd apt-file update
            else
                info "sudo requires a password, skip apt-file update"
            fi
            docmd_foreach __deb_local_content_filelist "$@"
            ;;
        packagekit)
            docmd pkcon get-files "$@"
            ;;
        yum-rpm)
81
            assure_exists yum-utils
82 83
            docmd repoquery -q -l "$@"
            ;;
84
        dnf-rpm|dnf5-rpm)
85
            assure_exists dnf-plugins-core
86 87 88 89 90 91
            docmd dnf repoquery -l "$@"
            ;;
        *)
            fatal "Query filelist for non installed packages is not implemented yet."
            ;;
    esac
92 93
}

94 95
__epm_filelist_file()
{
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
    local CMD

    [ -z "$*" ] && return

    # TODO: allow a new packages
    case $(get_package_type $1) in
        rpm)
            assure_exists rpm
            CMD="rpm -qlp"
            ;;
        deb)
            assure_exists dpkg
            CMD="dpkg --contents"
            ;;
        eopkg)
            assure_exists eopkg
            CMD="eopkg --files info"
            ;;
        *)
115
            fatal 'Have no suitable query command for $PMTYPE'
116 117 118 119 120
            ;;
    esac

    # TODO: add less
    docmd $CMD $@
121 122 123 124
}

__epm_filelist_name()
{
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
    local CMD

    [ -z "$*" ] && return

    warmup_lowbase

    case $PMTYPE in
        *-rpm)
            CMD="rpm -ql"
            ;;
        *-dpkg)
            CMD="dpkg -L"
            ;;
        packagekit)
            CMD="pkcon get-files"
            ;;
        android)
            CMD="pm list packages -f"
            ;;
144 145 146
        termux-pkg)
            CMD="pkg files"
            ;;
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
        conary)
            CMD="conary query --ls"
            ;;
        pacman)
            docmd pacman -Ql $@ | sed -e "s|.* ||g"
            return
            ;;
        emerge)
            assure_exists equery
            CMD="equery files"
            ;;
        homebrew)
            CMD="brew list"
            ;;
        pkgng)
            CMD="pkg info -l"
            ;;
Vitaly Lipatov's avatar
Vitaly Lipatov committed
164 165 166
        redox-pkg)
            CMD="pkg list"
            ;;
167 168 169
        opkg)
            CMD="opkg files"
            ;;
170 171 172 173
        apk)
            docmd apk manifest $@ | sed -e 's|^sha1.* |/|'
            return
            ;;
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
        eopkg)
            docmd eopkg --files -s info $@ | grep "^/"
            return
            ;;
        xbps)
            CMD="xbps-query -f"
            ;;
        aptcyg)
            docmd apt-cyg listfiles $@ | sed -e "s|^|/|g"
            return
            ;;
        slackpkg)
            is_installed $@ || fatal "Query filelist for non installed packages is not implemented yet"
            docmd awk 'BEGIN{desk=1}{if(/^FILE LIST:$/){desk=0} else if (desk==0) {print}}' /var/log/packages/${pkg_filenames}*
            return
            ;;
        *)
191
            fatal 'Have no suitable query command for $PMTYPE'
192 193 194 195 196 197 198
            ;;
    esac

    # TODO: add less or bat (for any output in the function)
    docmd $CMD $@ && return
    # TODO: may be we need check is installed before prev. line?
    is_installed $@ || __epm_filelist_remote $@
199 200 201
}


202
epm_filelist()
203
{
204
    [ -n "$pkg_filenames" ] || fatal "Filelist: package name is missed"
205 206


207 208 209
    __epm_filelist_file $pkg_files || return
    # shellcheck disable=SC2046
    __epm_filelist_name $(print_name $pkg_names) || return
210 211

}