epm-assure 3.23 KB
Newer Older
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2013-2016  Etersoft
# Copyright (C) 2013-2016  Vitaly Lipatov <lav@etersoft.ru>
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#
# 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/>.
#

__check_command_in_path()
{
    PATH=$PATH:/sbin:/usr/sbin which "$1" 2>/dev/null
}


26 27 28 29 30
# copied from strings
# CHECKME: the same like estrlist has ?
# Note: used egrep! write '[0-9]+(first|two)', not '[0-9]\+...'
rhas()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
31
	echo "$1" | grep -E -q -- "$2"
32 33 34 35 36 37 38 39 40
}

# copied from strings
is_dirpath()
{
    [ "$1" = "." ] && return $?
    rhas "$1" "/"
}

41 42 43 44 45
__epm_need_update()
{
    local PACKAGE="$1"
    local PACKAGEVERSION="$2"

46
    [ -n "$PACKAGEVERSION" ] || return 0
47 48 49 50 51 52 53

    load_helper epm-query
    is_installed "$PACKAGE" || return 0

    load_helper epm-print
    # epm print version for package N
    local INSTALLEDVERSION=$(query_package_field "version" "$PACKAGE")
54 55
    # if needed >= installed, return 0
    [ "$(compare_version "$PACKAGEVERSION" "$INSTALLEDVERSION")" -gt 0 ] && return 0
56 57 58 59

    return 1
}

60
__epm_assure_checking()
61
{
62 63 64
    local CMD="$1"
    local PACKAGE="$2"
    local PACKAGEVERSION="$3"
65 66

    [ -n "$PACKAGEVERSION" ] && return 1
67

68 69
    if is_dirpath "$CMD" ; then
        if [ -e "$CMD" ] ; then
70
            if [ -n "$verbose" ] ; then
71 72
                info "File or directory $CMD is already exists."
                epm qf "$CMD"
73
            fi
74
            return 0
75 76
        fi

77
        [ -n "$PACKAGE" ] || fatal "You need run with package name param when use with absolute path"
78
        return 1
79 80
    fi

81
    if __check_command_in_path "$CMD" >/dev/null ; then
82 83
        if [ -n "$verbose" ] ; then
            local compath="$(__check_command_in_path "$1")"
84
            info "Command $CMD is exists: $compath"
85 86
            epm qf "$compath"
        fi
87
        return 0
88 89
    fi

90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
    return 1
}

# Do fast checking for command and install package if the command does not exist

# $1 - command name
# $2 - [package name]
# $3 - [needed package version]

__epm_assure()
{
    local CMD="$1"
    local PACKAGE="$2"
    local PACKAGEVERSION="$3"
    [ -n "$PACKAGE" ] || PACKAGE="$1"

    __epm_assure_checking $CMD $PACKAGE $PACKAGEVERSION && return 0

108
    info "Installing appropriate package for $CMD command..."
109 110
    __epm_need_update $PACKAGE $PACKAGEVERSION || return 0

111 112 113 114 115 116
    docmd epm --auto install $PACKAGE || return

    [ -n "$PACKAGEVERSION" ] || return 0
    # check if we couldn't update and still need update
    __epm_need_update $PACKAGE $PACKAGEVERSION && return 1
    return 0
117 118 119 120 121
}


epm_assure()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
122
    [ -n "$pkg_filenames" ] || fatal "Assure: Missing params. Check $0 --help for info."
123 124

    # use helper func for extract separate params
Vitaly Lipatov's avatar
Vitaly Lipatov committed
125
    # shellcheck disable=SC2046
126
    __epm_assure $(eval echo $quoted_args)
127
}