epm-sh-functions 19.2 KB
Newer Older
Vitaly Lipatov's avatar
Vitaly Lipatov committed
1 2
#!/bin/sh
#
3 4
# Copyright (C) 2012, 2014  Etersoft
# Copyright (C) 2012, 2014  Vitaly Lipatov <lav@etersoft.ru>
Vitaly Lipatov's avatar
Vitaly Lipatov committed
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
Vitaly Lipatov's avatar
Vitaly Lipatov committed
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.
Vitaly Lipatov's avatar
Vitaly Lipatov committed
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/>.
Vitaly Lipatov's avatar
Vitaly Lipatov committed
18 19
#

20
# copied from /etc/init.d/outformat (ALT Linux)
21

22

23
# FIXME on Android: FIX ME! implement ttyname_r() bionic/libc/bionic/stubs.c:366
24 25
inputisatty()
{
26 27 28
    # check stdin
    #tty -s 2>/dev/null
    test -t 0
29 30
}

31 32
isatty()
{
33 34
    # check stdout
    test -t 1
35 36 37 38
}

isatty2()
{
39 40
    # check stderr
    test -t 2
41 42
}

43 44
check_tty()
{
45
    isatty2 || return
46

47 48 49
    # Set a sane TERM required for tput
    [ -n "$TERM" ] || TERM=dumb
    export TERM
50

51
    check_core_commands
52

53 54 55 56 57
    # grep -E from busybox may not --color
    # grep -E from MacOS print help to stderr
    if grep -E --help 2>&1 | grep -q -- "--color" ; then
        export EGREPCOLOR="--color"
    fi
58

59 60 61 62
    is_command tput || return
    # FreeBSD does not support tput -S
    echo | a= tput -S >/dev/null 2>/dev/null || return
    USETTY="tput -S"
63 64
}

65 66 67 68
: ${BLACK:=0} ${RED:=1} ${GREEN:=2} ${YELLOW:=3} ${BLUE:=4} ${MAGENTA:=5} ${CYAN:=6} ${WHITE:=7}

set_boldcolor()
{
69 70 71 72 73
    [ -n "$USETTY" ] || return
    {
        echo bold
        echo setaf $1
    } | $USETTY
74 75
}

76 77
set_color()
{
78 79 80 81
    [ -n "$USETTY" ] || return
    {
        echo setaf $1
    } | $USETTY
82 83
}

84 85
restore_color()
{
86 87 88 89 90
    [ -n "$USETTY" ] || return
    {
        echo op; # set Original color Pair.
        echo sgr0; # turn off all special graphics mode (bold in our case).
    } | $USETTY
91 92
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
93 94
echover()
{
Vitaly Lipatov's avatar
Vitaly Lipatov committed
95
    [ -z "$verbose" ] && return
96
    echo "$*" >&2
Vitaly Lipatov's avatar
Vitaly Lipatov committed
97 98
}

99 100 101
# echo string without EOL
echon()
{
102 103
    # default /bin/sh on MacOS does not recognize -n
    echo -n "$*" 2>/dev/null || a= /bin/echo -n "$*"
104 105 106
}


Vitaly Lipatov's avatar
Vitaly Lipatov committed
107 108 109
# Used DISTRNAME
set_target_pkg_env()
{
110 111 112 113 114 115
    [ -n "$DISTRNAME" ] || fatal "Missing DISTRNAME in set_target_pkg_env."
    local ver="$DISTRVERSION"
    [ -n "$ver" ] && ver="/$ver"
    PKGFORMAT=$($DISTRVENDOR -p "$DISTRNAME$ver")
    PKGVENDOR=$($DISTRVENDOR -s "$DISTRNAME$ver")
    RPMVENDOR=$($DISTRVENDOR -n "$DISTRNAME$ver")
Vitaly Lipatov's avatar
Vitaly Lipatov committed
116 117 118
}

# Print command line and run command line
119
showcmd()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
120
{
121 122 123 124 125 126 127
    if [ -z "$quiet" ] ; then
        set_boldcolor $GREEN
        local PROMTSIG="\$"
        is_root && PROMTSIG="#"
        echo " $PROMTSIG $*"
        restore_color
    fi >&2
128 129
}

130 131 132
# Print command
echocmd()
{
133 134 135 136 137
    set_boldcolor $GREEN
    local PROMTSIG="\$"
    is_root && PROMTSIG="#"
    echo -n "$PROMTSIG $*"
    restore_color
138 139
}

140 141 142
# Print command line and run command line
docmd()
{
143 144
    showcmd "$*$EXTRA_SHOWDOCMD"
    "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
145 146
}

147
# Run every arg with docmd
148 149
docmd_foreach()
{
150 151 152 153 154 155 156
    local cmd pkg
    cmd="$1"
    #showcmd "$@"
    shift
    for pkg in "$@" ; do
        docmd $cmd $pkg
    done
157 158
}

159 160 161
# run command line with SUDO
sudorun()
{
162 163 164 165 166 167
    set_sudo
    if [ -z "$SUDO" ] ; then
        "$@"
        return
    fi
    $SUDO "$@"
168 169
}

170
# Print command line and run command line with SUDO
171
sudocmd()
172
{
173 174 175
    set_sudo
    [ -n "$SUDO" ] && showcmd "$SUDO $*" || showcmd "$*"
    sudorun "$@"
176 177
}

178
# Run every arg with sudocmd
179
# Returns on any error
180 181
sudocmd_foreach()
{
182 183 184 185 186 187 188 189
    local cmd pkg
    cmd="$1"
    #showcmd "$@"
    shift
    for pkg in "$@" ; do
        # don't quote $cmd here: it can be a command with an args
        sudocmd $cmd $pkg || return
    done
190 191
}

192 193 194
# print full path to files
make_filepath()
{
195 196 197 198 199 200
    local i
    for i in "$@" ; do
        [ -f "$i" ] || continue
        echo "$i" | grep -q "/" && echo "$i" && continue
        echo "./$i"
    done
201 202
}

203 204
get_firstarg()
{
205
    echon "$1"
206 207 208 209
}

get_lastarg()
{
210 211 212
    local lastarg
    eval "lastarg=\${$#}"
    echon "$lastarg"
213 214
}

215 216 217
# TODO: see etersoft-build-utils/tests/test_isnumber.sh
isnumber()
{
218
    echo "$*" | filter_strip_spaces | grep -q "^[0-9]\+$"
219 220
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
221 222
# copied from strings
# CHECKME: the same like estrlist has ?
Vitaly Lipatov's avatar
Vitaly Lipatov committed
223
# Note: used grep -E! write '[0-9]+(first|two)', not '[0-9]\+...'
Vitaly Lipatov's avatar
Vitaly Lipatov committed
224 225
rhas()
{
226
    echo "$1" | grep -E -q -- "$2"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
227 228 229 230 231 232 233 234 235
}

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

Vitaly Lipatov's avatar
Vitaly Lipatov committed
236 237 238 239 240 241 242 243 244 245 246 247 248
filter_strip_spaces()
{
        # possible use just
        #xargs echo
        sed -e "s| \+| |g" | \
                sed -e "s|^ ||" | sed -e "s| \$||"
}

strip_spaces()
{
        echo "$*" | filter_strip_spaces
}

249 250 251 252 253 254

# https://superuser.com/questions/422459/substitution-in-text-file-without-regular-expressions
# http://stackoverflow.com/a/2705678/120999
# use for subst complex string with symbols treating as regexp
sed_escape()
{
255
    echo "$*" | sed -e 's/[]()$*.^|[]/\\&/g'
256 257 258
}


259 260 261
# param true false
subst_option()
{
262
    eval "[ -n \"\$$1\" ]" && echo "$2" || echo "$3"
263 264
}

265 266 267
store_output()
{
    # use make_temp_file from etersoft-build-utils
268
    RC_STDOUT="$(mktemp)"
269 270
    local CMDSTATUS=$RC_STDOUT.pipestatus
    echo 1 >$CMDSTATUS
271
    #RC_STDERR=$(mktemp)
272
    ( LANG=C $@ 2>&1 ; echo $? >$CMDSTATUS ) | tee $RC_STDOUT
Vitaly Lipatov's avatar
Vitaly Lipatov committed
273
    return "$(cat $CMDSTATUS)"
274
    # bashism
275
    # http://tldp.org/LDP/abs/html/bashver3.html#PIPEFAILREF
276
    #return $PIPESTATUS
277 278
}

279 280 281 282 283 284
showcmd_store_output()
{
    showcmd "$@"
    store_output "$@"
}

285 286
clean_store_output()
{
287
    rm -f $RC_STDOUT $RC_STDOUT.pipestatus
288 289
}

290
# run epm, possible from side repo
291 292
epm()
{
293
    if [ "$EPMMODE" = "pipe" ] ; then
294
        epm_main --inscript "$@"
295
        return
296
    fi
297 298 299 300 301 302

    # run epm again to full initialization
    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x'

    $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
303 304 305 306 307
}

# run $SUDO epm, possible from side repo
sudoepm()
{
308
    [ "$EPMMODE" = "pipe" ] && fatal "Can't use sudo epm call from the piped script"
309

310 311
    local bashopt=''
    [ -n "$verbose" ] && bashopt='-x'
312

313
    sudorun $CMDSHELL $bashopt $PROGDIR/$PROGNAME --inscript "$@"
314
}
Vitaly Lipatov's avatar
Vitaly Lipatov committed
315 316 317 318

# Print error message and stop the program
fatal()
{
319
    if [ -z "$TEXTDOMAIN" ] ; then
320
        set_color $RED
321
        echo "Error: $*  (you can discuss the problem in Telegram: https://t.me/useepm)" >&2
322
        restore_color
323 324 325 326 327
#    else
#        echog "Error in $0: $@" >&2
    fi
#    [ "$TERM" = "screen" ] && echo "(screen detected: waiting ten seconds to exit ...)" >&2 && sleep 10
    exit 1
Vitaly Lipatov's avatar
Vitaly Lipatov committed
328
}
329

Vitaly Lipatov's avatar
Vitaly Lipatov committed
330 331 332
# Print warning message
warning()
{
333
    if [ -z "$TEXTDOMAIN" ] ; then
334
        set_color $YELLOW
335
        echo "Warning: $*" >&2
336
        restore_color
337 338 339
#    else
#        echog "Error in $0: $@" >&2
    fi
Vitaly Lipatov's avatar
Vitaly Lipatov committed
340 341
}

342 343
info()
{
344
    [ -n "$quiet" ] && return
345

346 347 348 349 350 351 352
    # print message to stderr if stderr forwarded to (a file)
    if isatty2 ; then
        isatty || return 0
        echo "$*"
    else
        echo "$*" >&2
    fi
353 354
}

355 356 357
# if we have not sudo, returns 1 and set SUDO variable to fatal
SUDO_TESTED=''
SUDO_CMD='sudo'
358 359
set_sudo()
{
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386
    local nofail="$1"

    # cache the result
    [ -n "$SUDO_TESTED" ] && return "$SUDO_TESTED"
    SUDO_TESTED="0"

    SUDO=""
    # skip SUDO if disabled
    [ -n "$EPMNOSUDO" ] && return
    if [ "$DISTRNAME" = "Cygwin" ] || [ "$DISTRNAME" = "Windows" ] ; then
        # skip sudo using on Windows
        return
    fi

    # if we are root, do not need sudo
    is_root && return

    # start error section
    SUDO_TESTED="1"

    if ! is_command $SUDO_CMD ; then
        [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't find sudo. Please install and tune sudo ('# epm install sudo') or run epm under root.'"
        return "$SUDO_TESTED"
    fi

    # if input is a console
    if inputisatty && isatty && isatty2 ; then
387 388 389 390 391 392
        if ! $SUDO_CMD -n true ; then
            info "Please enter sudo user password to use sudo in the current session."
            if ! $SUDO_CMD -l >/dev/null ; then
                [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't use sudo (only passwordless sudo is supported in non interactive using). Please run epm under root.'"
                return "$SUDO_TESTED"
            fi
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
        fi
    else
        # use sudo if one is tuned and tuned without password
        if ! $SUDO_CMD -l -n >/dev/null 2>/dev/null ; then
            [ "$nofail" = "nofail" ] || SUDO="fatal 'Can't use sudo (only passwordless sudo is supported). Please run epm under root or check http://altlinux.org/sudo '"
            return "$SUDO_TESTED"
        fi
    fi

    SUDO_TESTED="0"
    # FIXME: does not work: sudo -- VARIABLE=some command
    SUDO="$SUDO_CMD"
    #SUDO="$SUDO_CMD --"
    # check for < 1.7 version which do not support -- (and --help possible too)
    #$SUDO_CMD -h 2>/dev/null | grep -q "  --" || SUDO="$SUDO_CMD"
408

409 410
}

411 412 413
# return TRUE if we can run privileged command
sudo_allowed()
{
414
    set_sudo nofail
415 416
}

417 418
# wait for n seconds (if possible) during executing command
# args: seconds command
419 420
withtimeout()
{
421 422 423 424 425 426 427 428 429
    local TO=$(print_command_path timeout || print_command_path gtimeout)
    if [ -x "$TO" ] ; then
        $TO "$@"
        return
    fi
    fatal "Possible indefinite wait due timeout command is missed"
    # fallback: drop time arg and run without timeout
    #shift
    #"$@"
430 431
}

432 433
set_eatmydata()
{
434 435 436 437 438 439 440 441 442 443 444
    # don't use eatmydata (useless)
    return 0
    # skip if disabled
    [ -n "$EPMNOEATMYDATA" ] && return
    # use if possible
    is_command eatmydata || return
    set_sudo
    # FIXME: check if SUDO already has eatmydata
    [ -n "$SUDO" ] && SUDO="$SUDO eatmydata" || SUDO="eatmydata"
    [ -n "$verbose" ] && info "Uwaga! eatmydata is installed, we will use it for disable all sync operations."
    return 0
445 446
}

447 448
# 
__get_package_for_command()
449
{
450 451 452 453 454 455 456 457
    case "$1" in
        equery|revdep-rebuild)
            echo 'gentoolkit'
            ;;
        update-kernel|remove-old-kernels)
            echo 'update-kernel'
            ;;
    esac
458 459
}

460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
# TODO:
confirm() {
    local response
    # call with a prompt string or use a default
    read -r -p "${1:-Are you sure? [y/N]} " response
    case $response in
        [yY][eE][sS]|[yY])
            true
            ;;
        *)
            false
            ;;
    esac
}

475 476 477

confirm_info()
{
478 479 480 481
    info "$*"
    if [ -z "$non_interactive" ] ; then
        confirm "Are you sure? [y/N]" || fatal "Exiting"
    fi
482 483 484 485

}


486 487
is_root()
{
488 489
    local EFFUID="$(id -u)"
    [ "$EFFUID" = "0" ]
490 491
}

492 493
assure_root()
{
494
    is_root || fatal "run me only under root"
495 496 497 498
}

regexp_subst()
{
499 500 501
    local expression="$1"
    shift
    sed -i -r -e "$expression" "$@"
502 503
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
504
# TODO: we we can't use epm directly?
505 506
assure_exists()
{
507 508 509 510 511 512
    load_helper epm-assure
    local package="$2"
    local textpackage=
    [ -n "$package" ] || package="$(__get_package_for_command "$1")"
    [ -n "$3" ] && textpackage=" >= $3"
    ( direct='' epm_assure "$1" $package $3 ) || fatal "Can't assure in '$1' command from $package$textpackage package"
513 514
}

515 516
assure_exists_erc()
{
517 518 519
    load_helper epm-assure
    local package="erc"
    ( direct='' epm_assure "$package" ) || epm ei erc || fatal "erc is not available to install."
520 521
}

522
# will replaced within disabled_eget in packaged version
Vitaly Lipatov's avatar
Vitaly Lipatov committed
523
eget()
524
{
525 526 527 528 529 530 531
    local EGET
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_eget ] ; then
        ( EGET_BACKEND=$eget_backend $SHAREDIR/tools_eget "$@" )
        return
    fi
    fatal "Internal error: missed tools_eget"
532

533 534 535 536 537
    # FIXME: we need disable output here, eget can be used for get output
    assure_exists eget eget 3.3 >/dev/null
    # run external command, not the function
    EGET=$(print_command_path eget) || fatal "Missed command eget from installed package eget"
    $EGET "$@"
538 539
}

540 541 542
# will replaced within disabled_erc in packaged version
erc()
{
543 544 545 546 547 548 549 550 551

    if ! is_command patool ; then
        if is_command 7z || is_command 7za || is_command 7zr || is_command 7zz ; then
            :
        else
            epm install p7zip
        fi
    fi

552 553 554 555 556 557
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_erc ] ; then
        $SHAREDIR/tools_erc "$@"
        return
    fi
    fatal "Internal error: missed tools_erc"
558

559 560 561
    # FIXME: we need disable output here, ercat can be used for get output
    assure_exists_erc >/dev/null
    # run external command, not the function
562
    local ERC
563 564
    ERC=$(print_command_path erc) || fatal "Missed command erc from installed package erc"
    $ERC "$@"
565 566 567 568 569
}

# will replaced within disabled_ercat in packaged version
ercat()
{
570 571 572 573 574 575 576
    local ERCAT
    # use internal eget only if exists
    if [ -s $SHAREDIR/tools_ercat ] ; then
        $SHAREDIR/tools_ercat "$@"
        return
    fi
    fatal "Internal error: missed tools_ercat"
577

578 579 580 581 582
    # FIXME: we need disable output here, ercat can be used for get output
    assure_exists_erc >/dev/null
    # run external command, not the function
    ERCAT=$(print_command_path ercat) || fatal "Missed command ercat from installed package erc"
    $ERCAT "$@"
583 584
}

Vitaly Lipatov's avatar
Vitaly Lipatov committed
585 586
estrlist()
{
587 588 589 590 591
    if [ -s $SHAREDIR/tools_estrlist ] ; then
        $SHAREDIR/tools_estrlist "$@"
        return
    fi
    fatal "missed tools_estrlist"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
592 593 594 595
}

onefile_estrlist()
{
596
    internal_tools_estrlist "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
597 598
}

599 600
# will replaced within eget() in packed version
onefile_eget()
Vitaly Lipatov's avatar
Vitaly Lipatov committed
601
{
602 603 604 605 606
    # check for both
    # we really need that cross here,
    is_command curl || assure_exists wget
    is_command wget || assure_exists curl
    internal_tools_eget "$@"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
607 608
}

609
# TODO: improve and drop!
610 611
get_package_type()
{
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642
    local i
    case $1 in
        *.deb)
            echo "deb"
            return
            ;;
        *.rpm)
            echo "rpm"
            return
            ;;
        *.txz)
            echo "txz"
            return
            ;;
        *.tbz)
            echo "tbz"
            return
            ;;
        *.exe)
            echo "exe"
            return
            ;;
        *.msi)
            echo "msi"
            return
            ;;
        *.AppImage)
            echo "AppImage"
            return
            ;;
        *)
643 644
            # print extension by default
            echo "$1" | sed -e 's|.*\.||'
645 646 647
            return 1
            ;;
    esac
648 649 650
}


651
# print options description from HELPCMD/HELPOPT lines in the code
652
# args: section_name, [file with code]
653 654
get_help()
{
655 656 657
    if [ "$0" = "/dev/stdin" ] || [ "$0" = "sh" ] ; then
        return
    fi
658
    local F="$0"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
659 660 661
    if [ -n "$2" ] ; then
        is_dirpath "$2" && F="$2" || F="$(dirname $0)/$2"
    fi
662

663
    cat "$F" | grep -- "# $1" | while read -r n ; do
Vitaly Lipatov's avatar
Vitaly Lipatov committed
664 665 666 667 668 669
        if echo "$n" | grep -q "# $1: PART: " ; then
            echo
            echo "$n" | sed -e "s|# $1: PART: ||"
            continue
        fi
        echo "$n" | grep -q "^ *#" && continue
670 671 672
        opt=`echo $n | sed -e "s|) # $1:.*||g" -e 's|"||g' -e 's@^|@@'`
        desc=`echo $n | sed -e "s|.*) # $1:||g"`
        printf "    %-20s %s\n" "$opt" "$desc"
673 674 675
    done
}

676 677
# TODO: get all info by one request (too slow)
set_distro_info()
678
{
679 680 681 682
    # use external distro_info if internal one is missed
    DISTRVENDOR=$PROGDIR/distr_info
    [ -x $DISTRVENDOR ] || DISTRVENDOR=distro_info
    export DISTRVENDOR
683

684 685 686 687 688 689 690
    [ -n "$DISTRNAME" ] || DISTRNAME=$($DISTRVENDOR -d) || fatal "Can't get distro name."
    [ -n "$DISTRVERSION" ] || DISTRVERSION=$($DISTRVENDOR -v)
    if [ -z "$DISTRARCH" ] ; then
        DISTRARCH=$($DISTRVENDOR --distro-arch)
    fi
    DISTRCONTROL="$($DISTRVENDOR -y)"
    [ -n "$BASEDISTRNAME" ] || BASEDISTRNAME=$($DISTRVENDOR -s)
691

692 693 694 695 696
    # TODO: improve BIGTMPDIR conception
    # https://bugzilla.mozilla.org/show_bug.cgi?id=69938
    # https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s15.html
    # https://geekpeach.net/ru/%D0%BA%D0%B0%D0%BA-systemd-tmpfiles-%D0%BE%D1%87%D0%B8%D1%89%D0%B0%D0%B5%D1%82-tmp-%D0%B8%D0%BB%D0%B8-var-tmp-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0-tmpwatch-%D0%B2-centos-rhel-7
    [ -n "$BIGTMPDIR" ] || [ -d "/var/tmp" ] && BIGTMPDIR="/var/tmp" || BIGTMPDIR="/tmp"
697 698 699 700 701
}

# FIXME: detect if not recognized
set_pm_type()
{
702 703 704
    local CMD
    set_distro_info
    set_target_pkg_env
705

706
# override package manager detection result
707 708 709 710 711
if [ -n "$EPM_BACKEND" ] ; then
    PMTYPE=$EPM_BACKEND
    return
fi
# obsoleted
712
if [ -n "$FORCEPM" ] ; then
713 714
    PMTYPE=$FORCEPM
    return
715 716
fi

717
    PMTYPE="$($DISTRVENDOR -g $DISTRNAME/$DISTRVERSION)"
718
}
719

720 721
is_active_systemd()
{
722
    [ "$DISTRCONTROL" = "systemd" ]
723
}
724 725 726

assure_distr()
{
727 728 729
    local TEXT="this option"
    [ -n "$2" ] && TEXT="$2"
    [ "$DISTRNAME" = "$1" ] || fatal "$TEXT supported only for $1 distro"
730
}
731 732 733 734 735

# return delimiter sign in depend of package type
get_pkg_name_delimiter()
{
   local pkgtype="$1"
736
   [ -n "$pkgtype" ] || pkgtype="$PKGFORMAT"
737 738 739 740

   [ "$pkgtype" = "deb" ] && echo "_" && return
   echo "-"
}
741

742 743 744 745 746 747 748 749 750 751

# don't remove <arg> on exit
__epm_remove_from_tmp_files()
{
   keep="$1"
   [ -r "$keep" ] || return 0
   [ -n "$to_remove_pkg_files" ] || return 0
   to_remove_pkg_files="$(echo "$to_remove_pkg_files" | sed -e "s|$keep||")"
}

752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
# usage: trap "__epm_remove_tmp_files" EXIT
__epm_remove_tmp_files()
{
    # TODO: move it to exit handler
    if [ -z "$DEBUG" ] ; then
        # TODO: reinvent
        [ -n "$to_remove_pkg_files" ] && rm -f $to_remove_pkg_files
        # hack??
        [ -n "$to_remove_pkg_files" ] && rmdir $(dirname $to_remove_pkg_files | head -n1) 2>/dev/null
        [ -n "$to_remove_pkg_dirs" ] && rmdir $to_remove_pkg_dirs 2>/dev/null
        [ -n "$to_clean_tmp_dirs" ] && rm -rf $to_clean_tmp_dirs 2>/dev/null
    fi
    return 0
}


768 769 770 771 772 773 774 775 776 777 778
__epm_check_if_package_from_repo()
{
    local pkg="$1"
    # only ALT
    [ "$BASEDISTRNAME" = "alt" ] || return 0

    local vendor
    # TODO: check only for rpm
    #vendor="$(epm print field Vendor for "$pkg" 2>/dev/null))"
    #[ "$vendor" = "ALT Linux Team" ] || return

779 780
    local distribution
    distribution="$(epm print field Distribution for "$pkg" 2>/dev/null )"
781 782
    echo "$distribution" | grep -q "^ALT" || return

783 784 785 786
    local sig
    sig="$(epm print field sigpgp for "$pkg" 2>/dev/null )"
    [ "$sig" = "(none)" ] && return 1

787
    # FIXME: how to check if the package is from ALT repo (verified)?
788
    local release="$(epm print release from package "$pkg" 2>/dev/null )"
789 790 791 792 793 794
    echo "$release" | grep -q "^alt" || return

    return 0
}


795 796
has_space()
{
797
    estrlist -- has_space "$@"
798
}
799

Vitaly Lipatov's avatar
Vitaly Lipatov committed
800 801
is_url()
{
802
    echo "$1" | grep -q "^[filehtps]*:/"
Vitaly Lipatov's avatar
Vitaly Lipatov committed
803 804
}

805
# print a path to the command if exists in $PATH
806
if a= which which 2>/dev/null >/dev/null ; then
807 808 809 810
    # the best case if we have which command (other ways needs checking)
    # TODO: don't use which at all, it is binary, not builtin shell command
print_command_path()
{
811
    a= which -- "$1" 2>/dev/null
812
}
813
elif a= type -a type 2>/dev/null >/dev/null ; then
814 815
print_command_path()
{
816
    a= type -fpP -- "$1" 2>/dev/null
817 818 819 820
}
else
print_command_path()
{
821
    a= type "$1" 2>/dev/null | sed -e 's|.* /|/|'
822 823 824 825 826 827 828 829 830
}
fi

# check if <arg> is a real command
is_command()
{
    print_command_path "$1" >/dev/null
}

831
# compatibility layer
832

833
# add realpath if missed
834
if ! is_command realpath ; then
835 836 837 838 839 840 841
realpath()
{
    [ -n "$*" ] || return
    readlink -f "$@"
}
fi

842

843 844 845 846 847
# TODO: use perl if sed -i is not accessible
# sed -i is only supported in GNU sed.
#  sed -i "s/$find/$replace/g" "$@"
#  perl -p -i -e "s/$find/$replace/g" "$@"

848
# add subst if missed
849
if ! is_command subst ; then
850 851 852 853 854
subst()
{
    sed -i -e "$@"
}
fi
855 856 857 858


check_core_commands()
{
859 860 861
    #which which >/dev/null || fatal "Can't find which command (which or debianutils package is missed?)"
    is_command grep || fatal "Can't find grep command (coreutils package is missed?)"
    is_command sed || fatal "Can't find sed command (sed package is missed?)"
862 863
}