spk rev 110

Add spk-convert (Still needs a few functions)
author Christian Mesh <meshca@clarkson.edu>
date Sat Jun 09 09:34:42 2012 -0500 (2012-06-09)
parents b767df7ddb20
children dae62126a6a4
files spk-convert
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/spk-convert	Sat Jun 09 09:34:42 2012 -0500
     1.3 @@ -0,0 +1,406 @@
     1.4 +#!/bin/sh
     1.5 +#
     1.6 +# Spk-convert - Convert other distrobution's packages to tazpkg form. Read the README before adding or
     1.7 +# modifing any code in spk!
     1.8 +#
     1.9 +# Copyright (C) SliTaz GNU/Linux - BSD License
    1.10 +# Author: See AUTHORS files
    1.11 +#
    1.12 +. /usr/lib/slitaz/libspk.sh
    1.13 +
    1.14 +#
    1.15 +# Functions
    1.16 +#
    1.17 +
    1.18 +# Help and usage
    1.19 +usage() {
    1.20 +	name=$(basename $0)
    1.21 +	cat << EOT
    1.22 +
    1.23 +$(boldify $(gettext "Usage:")) $name [packages|--options]
    1.24 +
    1.25 +$(gettext "Convert SliTaz Packages")
    1.26 +
    1.27 +$(boldify $(gettext "Options:"))
    1.28 +  --install    $(gettext "Install package after conversion")
    1.29 +  --root=     $(gettext "Set the root file system path")
    1.30 +  --debug     $(gettext "Display some useful debug information")
    1.31 +
    1.32 +$(boldify $(gettext "Examples:"))
    1.33 +  $name package1.rpm package2.tgz packageN.ipk
    1.34 +
    1.35 +EOT
    1.36 +	exit 0
    1.37 +}
    1.38 +
    1.39 +# TODO find_depends show_unresolved_lib
    1.40 +# Move tazpkg pack to shared lib?
    1.41 +
    1.42 +# generate a receipt based on standard receipt vars
    1.43 +# Usage: generate_receipt $receipt $base_package
    1.44 +generate_receipt() {
    1.45 +	local receipt=$1
    1.46 +	local base_package=$2
    1.47 +	cat > $receipt <<EOT
    1.48 +# SliTaz package receipt.
    1.49 +# generated by tazpkg from package $(basename $base_package)
    1.50 +PACKAGE="$PACKAGE"
    1.51 +VERSION="$VERSION"
    1.52 +CATEGORY="misc"
    1.53 +SHORT_DESC="$SHORT_DESC"
    1.54 +WEB_SITE="$WEB_SITE"
    1.55 +MAINTAINER="$MAINTAINER"
    1.56 +DEPENDS="$(find_depends)"
    1.57 +CONFIG_FILES="$CONFIG_FILES"
    1.58 +EOT
    1.59 +		
    1.60 +}
    1.61 +
    1.62 +# convert a .ipk package to .tazpkg
    1.63 +# Usage: convert_ipk $package_file
    1.64 +convert_ipk() {
    1.65 +	local package_file=$1
    1.66 +	
    1.67 +	mkdir -p $tmp
    1.68 +	tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmp
    1.69 +
    1.70 +	local control="$tmp/control"
    1.71 +	
    1.72 +	# filter ipk control file for variable
    1.73 +	# Usage: filter_vars $search_var
    1.74 +	filter_vars() {
    1.75 +		local var=$1
    1.76 +		echo "$(grep ^$var $control | sed 's/.*: //')"
    1.77 +	}
    1.78 +	
    1.79 +	# Load up receipt template variables
    1.80 +	PACKAGE=$(filter_vars "Package")
    1.81 +	VERSION=$(filter_vars "Version")
    1.82 +	MAINTAINER=$(filter_vars "Maintainer")
    1.83 +	SHORT_DESC=$(filter_vars "Description")
    1.84 +	WEB_SITE="http://openwrt.org/"
    1.85 +	
    1.86 +	target=$(filter_vars "Architecture")
    1.87 +	case "$target" in
    1.88 +		i386|all)
    1.89 +			local file="$PACKAGE-$VERSION"
    1.90 +			local receipt="$tmp/$file/receipt"
    1.91 +			local fs="$tmp/$file/fs"
    1.92 +			
    1.93 +			mkdir -p $fs
    1.94 +			tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs
    1.95 +			
    1.96 +			unset CONFIG_FILES
    1.97 +			[ -s $tmp/conffiles ] && $CONFIG_FILE=$(cat $tmp/conffiles)
    1.98 +
    1.99 +			generate_receipt $receipt $package_file
   1.100 +			
   1.101 +			show_unresolved_lib $receipt
   1.102 +			
   1.103 +			# Writes a ipk script to receipt function
   1.104 +			# Usage: transpose_func $function_name $script
   1.105 +			transpose_func() {
   1.106 +				local func=$1
   1.107 +				local script=$2
   1.108 +				if [ -s $script ]; then
   1.109 +					cat >> $receipt << EOT
   1.110 +$func()
   1.111 +{
   1.112 +$(cat $script)
   1.113 +}
   1.114 +EOT
   1.115 +			}
   1.116 +			
   1.117 +			# read functions into receipt
   1.118 +			transpose_func pre_install $tmp/preinst
   1.119 +			transpose_func post_install $tmp/postinst
   1.120 +			transpose_func pre_remove $tmp/prerm
   1.121 +			transpose_func post_remove $tmp/postrm
   1.122 +			
   1.123 +			[ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt
   1.124 +
   1.125 +			cd $tmp
   1.126 +			tazpkg pack $file			
   1.127 +			cd - > /dev/null
   1.128 +			
   1.129 +			mv $tmp/$file.tazpkg .
   1.130 +			;;
   1.131 +		*)
   1.132 +			gettext "Invalid target: $target (expected i386)"; newline
   1.133 +		;;
   1.134 +	esac
   1.135 +	unset_receipt
   1.136 +	rm -rf $tmp
   1.137 +}
   1.138 +
   1.139 +# convert a .pkg.tar.gz/.apk package to .tazpkg
   1.140 +# Usage: convert_arch $package_file
   1.141 +convert_arch() {
   1.142 +	local package_file=$1
   1.143 +	
   1.144 +	# Extract
   1.145 +	local fs="$tmp/fs"
   1.146 +	mkdir -p $fs
   1.147 +	tar xzf $package_file -C $fs
   1.148 +	
   1.149 +	local PKGINFO="$fs/.PKGINFO"
   1.150 +	if [ -f $PKGINFO ]; then
   1.151 +	
   1.152 +		# filter .PKGINFO file for variable
   1.153 +		# Usage: filter_vars $search_var
   1.154 +		filter_vars() {
   1.155 +			local var=$1
   1.156 +			echo $(grep ^$var $PKGINFO | sed 's/.*= //')
   1.157 +		}
   1.158 +	
   1.159 +		PACKAGE=$(filter_vars "pkgname")
   1.160 +		VERSION=$(filter_vars "pkgver")
   1.161 +		SHORT_DESC=$(filter_vars "pkgdesc")
   1.162 +		WEB_SITE=$(filter_vars "url")
   1.163 +		MAINTAINER=$(filter_vars "packager")
   1.164 +		
   1.165 +		local file="$tmp/$package-$version"
   1.166 +		local receipt="$file/receipt"
   1.167 +		
   1.168 +		generate_receipt $receipt $package_file
   1.169 +		
   1.170 +		mkdir $file
   1.171 +		mv $fs $file
   1.172 +		
   1.173 +		show_unresolved_lib $tmp/$file/receipt
   1.174 +		rm -f $file/fs/.[A-Z]*
   1.175 +		
   1.176 +		cd $tmp
   1.177 +		tazpkg pack $file
   1.178 +		cd - > /dev/null
   1.179 +		
   1.180 +		mv $file.tazpkg .
   1.181 +	else
   1.182 +		eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline
   1.183 +	fi
   1.184 +	unset_receipt
   1.185 +	rm -rf $tmp
   1.186 +}
   1.187 +
   1.188 +# convert a .tgz package to .tazpkg
   1.189 +# Usage: convert_tgz $package_file
   1.190 +convert_tgz() {
   1.191 +	local package_file=$1
   1.192 +	local package=$(basename $package_file)
   1.193 +	
   1.194 +	# Set package to current args
   1.195 +	IFS='-'
   1.196 +	set -- $package
   1.197 +	unset IFS
   1.198 +	
   1.199 +	local PACKAGE=$1
   1.200 +	local VERSION=$2
   1.201 +	local file="$tmp/$PACKAGE-$VERSION"
   1.202 +	local receipt="$file/receipt"
   1.203 +	local fs="$file/fs"
   1.204 +	
   1.205 +	# Extract package
   1.206 +	mkdir -p $fs
   1.207 +	tar xzf $package_file -C $fs
   1.208 +	
   1.209 +	if [ -d $fs/install ]; then
   1.210 +		# Set other receipt vars
   1.211 +		SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \
   1.212 +			head -1 | sed 's/.*(\(.*\)).*/\1/')
   1.213 +		WEB_SITE="http://www.slackware.com/packages/"
   1.214 +		MAINTAINER="nobody@slitaz.org"
   1.215 +		
   1.216 +		generate_receipt $receipt $package_file
   1.217 +	  	
   1.218 +		show_unresolved_lib $receipt
   1.219 +		
   1.220 +		# post_install function from doinst.sh
   1.221 +		if [ -f $fs/install/doinst.sh ]; then
   1.222 +			cat >> $receipt <<EOM
   1.223 +
   1.224 +post_install()
   1.225 +{
   1.226 +chroot \$1/ sh - << EOT
   1.227 +cd /
   1.228 +$(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
   1.229 +EOT
   1.230 +}
   1.231 +EOM
   1.232 +		# Get full description
   1.233 +		if [ ! -z "$SHORT_DESC" ]; then
   1.234 +			grep ^$PACKAGE $fs/install/slack-desc | \
   1.235 +			sed "s/^$PACKAGE://" > $file/description.txt
   1.236 +		fi
   1.237 +		
   1.238 +		rm -rf $fs/install
   1.239 +		
   1.240 +		cd $tmp
   1.241 +		tazpkg pack $file
   1.242 +		cd - /dev/null
   1.243 +		
   1.244 +		mv $file.tazpkg .
   1.245 +	else
   1.246 +		eval_gettext "\$package_file does not look like a Slackware package !"; newline
   1.247 +	fi
   1.248 +	rm -rf $tmp
   1.249 +}
   1.250 +
   1.251 +# convert a .deb package to .tazpkg
   1.252 +# Usage: convert_deb $package_file
   1.253 +convert_deb() {
   1.254 +	local $package_file=$1
   1.255 +	
   1.256 +	# Extract deb control
   1.257 +	mkdir -p $tmp
   1.258 +	dpkg-deb -e $package_file $tmp
   1.259 +	
   1.260 +	
   1.261 +	# filter control file for variable
   1.262 +	# Usage: filter_vars $search_var
   1.263 +	filter_vars() {
   1.264 +		local var=$1
   1.265 +		local result=$(grep '^ *$var:' $tmp/control)
   1.266 +		echo ${result##*:}
   1.267 +	}
   1.268 +	
   1.269 +	PACKAGE=$(filter_vars "Package")
   1.270 +	VERSION=$(filter_vars "Version")
   1.271 +	SHORT_DESC=$(filter_vars "Description")
   1.272 +	WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE"
   1.273 +	MAINTAINER="nobody@slitaz.org"
   1.274 +	target="$(grep ^Architecture $tmp/control | sed 's/.*: //')"
   1.275 +	
   1.276 +	case "$target" in
   1.277 +	i386|all)
   1.278 +		local file="$tmp/$PACKAGE-$VERSION"
   1.279 +		local receipt="$file/receipt"
   1.280 +		local fs="$file/fs"
   1.281 +		
   1.282 +		# Extract deb contents
   1.283 +		mkdir -p $fs
   1.284 +		dpkg-deb -x $package_file $fs
   1.285 +		
   1.286 +		generate_receipt $receipt $package_file
   1.287 +		
   1.288 +		cd $TMP_DIR
   1.289 +		
   1.290 +		if [ -s $tmp/conffiles ]; then
   1.291 +		 	cat >> $receipt <<EOT
   1.292 +CONFIG_FILES="$(cat $tmp/conffiles)"
   1.293 +EOT
   1.294 +		fi
   1.295 +		
   1.296 +		show_unresolved_lib $file/receipt
   1.297 +		
   1.298 +		# Description.txt
   1.299 +		[ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/Description.txt
   1.300 +		
   1.301 +		cd $tmp
   1.302 +		tazpkg pack $file
   1.303 +		cd - > /dev/null
   1.304 +		
   1.305 +		mv $file.tazpkg .
   1.306 +		;;
   1.307 +	*)
   1.308 +		gettext "Invalid target: $target (expected i386 or all)"; newline
   1.309 +		;;
   1.310 +	esac
   1.311 +	rm -rf $tmp
   1.312 +}
   1.313 +
   1.314 +# convert a .rpm package to .tazpkg
   1.315 +# Usage: convert_rpm $package_file
   1.316 +convert_rpm() {
   1.317 +	local package_file=$1
   1.318 +	
   1.319 +	# Move package_file to tmp
   1.320 +	mkdir -p $tmp
   1.321 +	cp $package_file $tmp
   1.322 +	package_file=$TMP_DIR/$(basename $package_file)
   1.323 +	
   1.324 +	# filter package_file for variable
   1.325 +	# Usage: filter_vars $search_var
   1.326 +	filter_vars() {
   1.327 +		local var=$1
   1.328 +		echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}')
   1.329 +	}
   1.330 +	
   1.331 +	PACKAGE=$(filter_vars "Name")
   1.332 +	VERSION=$(filter_vars "Version")
   1.333 +	SHORT_DESC=$(filter_vars "Summary")
   1.334 +	WEB_SITE=$(filter_vars "URL")
   1.335 +	if [ -z "$URL" ]; then
   1.336 +		WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE"
   1.337 +	fi
   1.338 +	CATEGORY="misc";
   1.339 +	MAINTAINER="nobody@slitaz.org";
   1.340 +	
   1.341 +	
   1.342 +	local file="$tmp/$PACKAGE-$VERSION"
   1.343 +	local receipt="$file/receipt"
   1.344 +	local fs="$file/fs"
   1.345 +	
   1.346 +	mkdir -p $fs
   1.347 +	
   1.348 +	generate_receipt $receipt $package_file
   1.349 +	
   1.350 +	rpm -qip $PACKAGE_FILE | \
   1.351 +		grep "^Description*" -A 100 | \
   1.352 +		grep -v "^Description*" > \
   1.353 +		$file/description.txt
   1.354 +	
   1.355 +	cd $fs
   1.356 +	rpm2cpio $PACKAGE_FILE | cpio -idm --quiet
   1.357 +	cd - > /dev/null
   1.358 +	
   1.359 +	show_unresolved_lib $receipt
   1.360 +	
   1.361 +	cd $tmp
   1.362 +	tazpkg pack $file
   1.363 +	cd -
   1.364 +	
   1.365 +	mv $file.tazpkg .
   1.366 +		
   1.367 +	unset_receipt
   1.368 +	rm -rf $TMP_DIR
   1.369 +}
   1.370 +
   1.371 +
   1.372 +#
   1.373 +# Commands and exit
   1.374 +#
   1.375 +
   1.376 +case "$1" in
   1.377 +	""|*usage|*help) usage ;;
   1.378 +esac
   1.379 +
   1.380 +#
   1.381 +# Handle packages: package package.tazpkg ... packageN packageN.tazpkg
   1.382 +#
   1.383 +
   1.384 +check_root
   1.385 +
   1.386 +for pkg in $@
   1.387 +do
   1.388 +	if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ]; 
   1.389 +	then
   1.390 +		convert_deb $pkg
   1.391 +	else
   1.392 +		case "$pkg" in
   1.393 +			*.deb|*.udeb)
   1.394 +				convert_deb $pkg;;
   1.395 +			*.rpm)
   1.396 +				convert_rpm $pkg;;
   1.397 +			*.tgz)
   1.398 +				convert_tgz $pkg;;
   1.399 +			*.apk|*.pkg.tar.gz)
   1.400 +				convert_arch $pkg;;
   1.401 +			*.ipk|*.opk)
   1.402 +				convert_ipk $pkg;;
   1.403 +			*)
   1.404 +				gettext "Unsupported format"; newline;;
   1.405 +		esac
   1.406 +	fi
   1.407 +done
   1.408 +
   1.409 +exit 0