#!/bin/sh # # Copyright (C) 2017-2018, 2020 Etersoft # Copyright (C) 2017-2018, 2020 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-sh-altlinux load_helper epm-assure [ -n "$EPM_REPACK_SCRIPTS_DIR" ] || EPM_REPACK_SCRIPTS_DIR="$CONFIGDIR/repack.d" __epm_have_repack_rule() { # skip repacking on non ALT systems [ "$BASEDISTRNAME" = "alt" ] || return 1 # FIXME: use real way (for any archive) local pkgname="$(epm print name for package "$1")" local repackcode="$EPM_REPACK_SCRIPTS_DIR/$pkgname.sh" [ -s "$repackcode" ] } __epm_check_if_needed_repack() { __epm_have_repack_rule "$@" || return local pkgname="$(epm print name for package "$1")" warning "There is repack rule for '$pkgname' package. It is better install this package via 'epm --repack install' or 'epm play'." } # arg: rpm or deb # fills split_replaced_pkgs with packages of that type __epm_split_by_pkg_type() { local type="$1" shift split_replaced_pkgs='' for pkg in "$@" ; do [ "$(get_package_type "$pkg")" = "$type" ] || return 1 [ -e "$pkg" ] || fatal "Can't read $pkg" split_replaced_pkgs="$split_replaced_pkgs $pkg" done [ -n "$split_replaced_pkgs" ] } # $spec $PKGNAME $VERSION __set_name_version() { SPEC="$1" PKGNAME="$2" VERSION="$3" [ -n "$PKGNAME" ] && subst "s|^Name:.*|Name: $PKGNAME|" $SPEC [ -n "$VERSION" ] && subst "s|^Version:.*|Version: $VERSION|" $SPEC } __check_stoplist() { local pkg="$1" local alf="$CONFIGDIR/repackstoplist.list" [ -s "$alf" ] || return 1 [ -n "$pkg" ] || return 1 grep -E -q "^$1$" $alf } __set_version_pkgname() { local alpkg="$1" VERSION="$(echo "$alpkg" | grep -o -P '[-_.][0-9][0-9]*([.]*[0-9])*' | head -n1 | sed -e 's|^[-_.]||')" #" [ -n "$VERSION" ] && PKGNAME="$(echo "$alpkg" | sed -e "s|[-_.]$VERSION.*||")" # set version as all between name and extension #local woext="$(echo "alpkg" | sed -e 's|\.tar.*||')" #if [ "$woext" != "$alpkg" ] ; then # VERSION="$(echo "$woext" " | sed -e "s|^$PKGNAME[-_.]||")" #fi } # AppImage version # hack for ktalk2.4.2 -> ktalk 2.4.2 __set_version_apppkgname() { local alpkg="$1" VERSION="$(echo "$alpkg" | grep -o -P "[-_.a-zA-Z]([0-9])([0-9])*([.]*[0-9])*" | head -n1 | sed -e 's|^[-_.a-zA-Z]||' -e 's|--|-|g' )" #" [ -n "$VERSION" ] && PKGNAME="$(echo "$alpkg" | sed -e "s|[-_.]$VERSION.*||")" } # arg: <package file> # sets: # alpkg - package file name without path # PKGNAME - package name # VERSION - version of the package # SUBGENERIC - name of generic file's extension __prepare_source_package() { local pkg="$1" alpkg=$(basename $pkg) # TODO: use func for get name from deb pkg # TODO: epm print name from deb package # TODO: use stoplist only for deb? [ -z "$force" ] && __check_stoplist $(echo $alpkg | sed -e "s|_.*||") && fatal "Please use official package instead of $alpkg repacking (It is not recommended to use --force to skip this checking." PKGNAME='' VERSION='' SUBGENERIC='' # convert tarballs to tar (for alien) if rhas "$alpkg" "\.(rpm|deb)$" ; then return fi if rhas "$alpkg" "\.AppImage$" ; then __set_version_apppkgname $alpkg [ -n "$VERSION" ] || fatal "Can't get version from $alpkg." SUBGENERIC='appimage' # TODO: move repack archive to erc? [ -x "$alpkg" ] || docmd chmod u+x $verbose "$alpkg" ./$alpkg --appimage-extract || fatal alpkg=$PKGNAME-$VERSION.tar # make a tar for alien erc a $alpkg squashfs-root return fi __set_version_pkgname $alpkg if [ -n "$VERSION" ] ; then # TODO: don't use erc for detect type? then we potentially can skip install it pkgtype="$(erc type $alpkg)" local newalpkg newalpkg=$PKGNAME-$VERSION.$pkgtype #[ -n "$PKGNAME" ] || PKGNAME=$(basename $alpkg .$pkgtype) if [ "$pkgtype" = "tar" ] || [ "$pkgtype" = "tar.gz" ] || [ "$pkgtype" = "tgz" ] ; then # just rename supported formats if [ "$alpkg" != "$newalpkg" ] ; then mv $alpkg $newalpkg fi else # converts directly unsupported formats newalpkg=$PKGNAME-$VERSION.tar #newalpkg=$(basename $alpkg .$pkgtype).tar erc repack $alpkg $newalpkg || fatal fi if [ "$alpkg" != "$newalpkg" ] ; then rm -f $verbose $alpkg alpkg=$newalpkg fi else warning "Can't detect version in $alpkg. We have almost no chance it will supported in alien." fi } # FIXME: Нужно как-то обеспечить непродолжение выполнения. # used in epm install # fill repacked_pkgs __epm_repack() { repacked_pkgs='' case $PKGFORMAT in rpm) load_helper epm-repack-rpm __epm_repack_to_rpm "$@" || return ;; deb) # FIXME: only one package in $@ is supported #local pkgname="$(epm print name from "$@")" __set_version_pkgname "$1" local repackcode="$EPM_REPACK_SCRIPTS_DIR/$PKGNAME.sh" if [ -x "$repackcode" ] ; then load_helper epm-repack-rpm load_helper epm-repack-deb __epm_repack_to_rpm "$@" || return [ -n "$repacked_pkgs" ] || return __epm_repack_to_deb $repacked_pkgs else load_helper epm-repack-deb __epm_repack_to_deb "$@" || return fi ;; *) fatal "$PKGFORMAT is not supported for repack yet" ;; esac return 0 } __epm_repack_if_needed() { # return 1 if there is a package in host package format __epm_split_by_pkg_type $PKGFORMAT "$@" && return 1 __epm_repack "$@" return 0 } epm_repack() { # if possible, it will put pkg_urls into pkg_files and reconstruct pkg_filenames if [ -n "$pkg_urls" ] ; then load_helper epm-download __handle_pkg_urls_to_install fi [ -n "$pkg_names" ] && warning "Can't find $pkg_names files" [ -z "$pkg_files" ] && info "Skip empty repack list" && return 22 if __epm_repack $pkg_files && [ -n "$repacked_pkgs" ] ; then if [ -n "$install" ] ; then epm install $repacked_pkgs return fi cp $repacked_pkgs "$EPMCURDIR" if [ -z "$quiet" ] ; then echo echo "Adapted packages:" for i in $repacked_pkgs ; do echo " $EPMCURDIR/$(basename "$i")" done fi fi __epm_remove_tmp_files }