# HG changeset patch # User Christian Mesh # Date 1339252482 18000 # Node ID e1c080f70e0a06c2a632ff87416fdb456ceb661d # Parent b767df7ddb200a986c2ed15d25779cc1992cc3c0 Add spk-convert (Still needs a few functions) diff -r b767df7ddb20 -r e1c080f70e0a spk-convert --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spk-convert Sat Jun 09 09:34:42 2012 -0500 @@ -0,0 +1,406 @@ +#!/bin/sh +# +# Spk-convert - Convert other distrobution's packages to tazpkg form. Read the README before adding or +# modifing any code in spk! +# +# Copyright (C) SliTaz GNU/Linux - BSD License +# Author: See AUTHORS files +# +. /usr/lib/slitaz/libspk.sh + +# +# Functions +# + +# Help and usage +usage() { + name=$(basename $0) + cat << EOT + +$(boldify $(gettext "Usage:")) $name [packages|--options] + +$(gettext "Convert SliTaz Packages") + +$(boldify $(gettext "Options:")) + --install $(gettext "Install package after conversion") + --root= $(gettext "Set the root file system path") + --debug $(gettext "Display some useful debug information") + +$(boldify $(gettext "Examples:")) + $name package1.rpm package2.tgz packageN.ipk + +EOT + exit 0 +} + +# TODO find_depends show_unresolved_lib +# Move tazpkg pack to shared lib? + +# generate a receipt based on standard receipt vars +# Usage: generate_receipt $receipt $base_package +generate_receipt() { + local receipt=$1 + local base_package=$2 + cat > $receipt <> $receipt << EOT +$func() +{ +$(cat $script) +} +EOT + } + + # read functions into receipt + transpose_func pre_install $tmp/preinst + transpose_func post_install $tmp/postinst + transpose_func pre_remove $tmp/prerm + transpose_func post_remove $tmp/postrm + + [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt + + cd $tmp + tazpkg pack $file + cd - > /dev/null + + mv $tmp/$file.tazpkg . + ;; + *) + gettext "Invalid target: $target (expected i386)"; newline + ;; + esac + unset_receipt + rm -rf $tmp +} + +# convert a .pkg.tar.gz/.apk package to .tazpkg +# Usage: convert_arch $package_file +convert_arch() { + local package_file=$1 + + # Extract + local fs="$tmp/fs" + mkdir -p $fs + tar xzf $package_file -C $fs + + local PKGINFO="$fs/.PKGINFO" + if [ -f $PKGINFO ]; then + + # filter .PKGINFO file for variable + # Usage: filter_vars $search_var + filter_vars() { + local var=$1 + echo $(grep ^$var $PKGINFO | sed 's/.*= //') + } + + PACKAGE=$(filter_vars "pkgname") + VERSION=$(filter_vars "pkgver") + SHORT_DESC=$(filter_vars "pkgdesc") + WEB_SITE=$(filter_vars "url") + MAINTAINER=$(filter_vars "packager") + + local file="$tmp/$package-$version" + local receipt="$file/receipt" + + generate_receipt $receipt $package_file + + mkdir $file + mv $fs $file + + show_unresolved_lib $tmp/$file/receipt + rm -f $file/fs/.[A-Z]* + + cd $tmp + tazpkg pack $file + cd - > /dev/null + + mv $file.tazpkg . + else + eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline + fi + unset_receipt + rm -rf $tmp +} + +# convert a .tgz package to .tazpkg +# Usage: convert_tgz $package_file +convert_tgz() { + local package_file=$1 + local package=$(basename $package_file) + + # Set package to current args + IFS='-' + set -- $package + unset IFS + + local PACKAGE=$1 + local VERSION=$2 + local file="$tmp/$PACKAGE-$VERSION" + local receipt="$file/receipt" + local fs="$file/fs" + + # Extract package + mkdir -p $fs + tar xzf $package_file -C $fs + + if [ -d $fs/install ]; then + # Set other receipt vars + SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \ + head -1 | sed 's/.*(\(.*\)).*/\1/') + WEB_SITE="http://www.slackware.com/packages/" + MAINTAINER="nobody@slitaz.org" + + generate_receipt $receipt $package_file + + show_unresolved_lib $receipt + + # post_install function from doinst.sh + if [ -f $fs/install/doinst.sh ]; then + cat >> $receipt < $file/description.txt + fi + + rm -rf $fs/install + + cd $tmp + tazpkg pack $file + cd - /dev/null + + mv $file.tazpkg . + else + eval_gettext "\$package_file does not look like a Slackware package !"; newline + fi + rm -rf $tmp +} + +# convert a .deb package to .tazpkg +# Usage: convert_deb $package_file +convert_deb() { + local $package_file=$1 + + # Extract deb control + mkdir -p $tmp + dpkg-deb -e $package_file $tmp + + + # filter control file for variable + # Usage: filter_vars $search_var + filter_vars() { + local var=$1 + local result=$(grep '^ *$var:' $tmp/control) + echo ${result##*:} + } + + PACKAGE=$(filter_vars "Package") + VERSION=$(filter_vars "Version") + SHORT_DESC=$(filter_vars "Description") + WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE" + MAINTAINER="nobody@slitaz.org" + target="$(grep ^Architecture $tmp/control | sed 's/.*: //')" + + case "$target" in + i386|all) + local file="$tmp/$PACKAGE-$VERSION" + local receipt="$file/receipt" + local fs="$file/fs" + + # Extract deb contents + mkdir -p $fs + dpkg-deb -x $package_file $fs + + generate_receipt $receipt $package_file + + cd $TMP_DIR + + if [ -s $tmp/conffiles ]; then + cat >> $receipt < $file/Description.txt + + cd $tmp + tazpkg pack $file + cd - > /dev/null + + mv $file.tazpkg . + ;; + *) + gettext "Invalid target: $target (expected i386 or all)"; newline + ;; + esac + rm -rf $tmp +} + +# convert a .rpm package to .tazpkg +# Usage: convert_rpm $package_file +convert_rpm() { + local package_file=$1 + + # Move package_file to tmp + mkdir -p $tmp + cp $package_file $tmp + package_file=$TMP_DIR/$(basename $package_file) + + # filter package_file for variable + # Usage: filter_vars $search_var + filter_vars() { + local var=$1 + echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}') + } + + PACKAGE=$(filter_vars "Name") + VERSION=$(filter_vars "Version") + SHORT_DESC=$(filter_vars "Summary") + WEB_SITE=$(filter_vars "URL") + if [ -z "$URL" ]; then + WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE" + fi + CATEGORY="misc"; + MAINTAINER="nobody@slitaz.org"; + + + local file="$tmp/$PACKAGE-$VERSION" + local receipt="$file/receipt" + local fs="$file/fs" + + mkdir -p $fs + + generate_receipt $receipt $package_file + + rpm -qip $PACKAGE_FILE | \ + grep "^Description*" -A 100 | \ + grep -v "^Description*" > \ + $file/description.txt + + cd $fs + rpm2cpio $PACKAGE_FILE | cpio -idm --quiet + cd - > /dev/null + + show_unresolved_lib $receipt + + cd $tmp + tazpkg pack $file + cd - + + mv $file.tazpkg . + + unset_receipt + rm -rf $TMP_DIR +} + + +# +# Commands and exit +# + +case "$1" in + ""|*usage|*help) usage ;; +esac + +# +# Handle packages: package package.tazpkg ... packageN packageN.tazpkg +# + +check_root + +for pkg in $@ +do + if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ]; + then + convert_deb $pkg + else + case "$pkg" in + *.deb|*.udeb) + convert_deb $pkg;; + *.rpm) + convert_rpm $pkg;; + *.tgz) + convert_tgz $pkg;; + *.apk|*.pkg.tar.gz) + convert_arch $pkg;; + *.ipk|*.opk) + convert_ipk $pkg;; + *) + gettext "Unsupported format"; newline;; + esac + fi +done + +exit 0