spk annotate spk-convert @ 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
children dae62126a6a4
rev   line source
meshca@110 1 #!/bin/sh
meshca@110 2 #
meshca@110 3 # Spk-convert - Convert other distrobution's packages to tazpkg form. Read the README before adding or
meshca@110 4 # modifing any code in spk!
meshca@110 5 #
meshca@110 6 # Copyright (C) SliTaz GNU/Linux - BSD License
meshca@110 7 # Author: See AUTHORS files
meshca@110 8 #
meshca@110 9 . /usr/lib/slitaz/libspk.sh
meshca@110 10
meshca@110 11 #
meshca@110 12 # Functions
meshca@110 13 #
meshca@110 14
meshca@110 15 # Help and usage
meshca@110 16 usage() {
meshca@110 17 name=$(basename $0)
meshca@110 18 cat << EOT
meshca@110 19
meshca@110 20 $(boldify $(gettext "Usage:")) $name [packages|--options]
meshca@110 21
meshca@110 22 $(gettext "Convert SliTaz Packages")
meshca@110 23
meshca@110 24 $(boldify $(gettext "Options:"))
meshca@110 25 --install $(gettext "Install package after conversion")
meshca@110 26 --root= $(gettext "Set the root file system path")
meshca@110 27 --debug $(gettext "Display some useful debug information")
meshca@110 28
meshca@110 29 $(boldify $(gettext "Examples:"))
meshca@110 30 $name package1.rpm package2.tgz packageN.ipk
meshca@110 31
meshca@110 32 EOT
meshca@110 33 exit 0
meshca@110 34 }
meshca@110 35
meshca@110 36 # TODO find_depends show_unresolved_lib
meshca@110 37 # Move tazpkg pack to shared lib?
meshca@110 38
meshca@110 39 # generate a receipt based on standard receipt vars
meshca@110 40 # Usage: generate_receipt $receipt $base_package
meshca@110 41 generate_receipt() {
meshca@110 42 local receipt=$1
meshca@110 43 local base_package=$2
meshca@110 44 cat > $receipt <<EOT
meshca@110 45 # SliTaz package receipt.
meshca@110 46 # generated by tazpkg from package $(basename $base_package)
meshca@110 47 PACKAGE="$PACKAGE"
meshca@110 48 VERSION="$VERSION"
meshca@110 49 CATEGORY="misc"
meshca@110 50 SHORT_DESC="$SHORT_DESC"
meshca@110 51 WEB_SITE="$WEB_SITE"
meshca@110 52 MAINTAINER="$MAINTAINER"
meshca@110 53 DEPENDS="$(find_depends)"
meshca@110 54 CONFIG_FILES="$CONFIG_FILES"
meshca@110 55 EOT
meshca@110 56
meshca@110 57 }
meshca@110 58
meshca@110 59 # convert a .ipk package to .tazpkg
meshca@110 60 # Usage: convert_ipk $package_file
meshca@110 61 convert_ipk() {
meshca@110 62 local package_file=$1
meshca@110 63
meshca@110 64 mkdir -p $tmp
meshca@110 65 tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmp
meshca@110 66
meshca@110 67 local control="$tmp/control"
meshca@110 68
meshca@110 69 # filter ipk control file for variable
meshca@110 70 # Usage: filter_vars $search_var
meshca@110 71 filter_vars() {
meshca@110 72 local var=$1
meshca@110 73 echo "$(grep ^$var $control | sed 's/.*: //')"
meshca@110 74 }
meshca@110 75
meshca@110 76 # Load up receipt template variables
meshca@110 77 PACKAGE=$(filter_vars "Package")
meshca@110 78 VERSION=$(filter_vars "Version")
meshca@110 79 MAINTAINER=$(filter_vars "Maintainer")
meshca@110 80 SHORT_DESC=$(filter_vars "Description")
meshca@110 81 WEB_SITE="http://openwrt.org/"
meshca@110 82
meshca@110 83 target=$(filter_vars "Architecture")
meshca@110 84 case "$target" in
meshca@110 85 i386|all)
meshca@110 86 local file="$PACKAGE-$VERSION"
meshca@110 87 local receipt="$tmp/$file/receipt"
meshca@110 88 local fs="$tmp/$file/fs"
meshca@110 89
meshca@110 90 mkdir -p $fs
meshca@110 91 tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs
meshca@110 92
meshca@110 93 unset CONFIG_FILES
meshca@110 94 [ -s $tmp/conffiles ] && $CONFIG_FILE=$(cat $tmp/conffiles)
meshca@110 95
meshca@110 96 generate_receipt $receipt $package_file
meshca@110 97
meshca@110 98 show_unresolved_lib $receipt
meshca@110 99
meshca@110 100 # Writes a ipk script to receipt function
meshca@110 101 # Usage: transpose_func $function_name $script
meshca@110 102 transpose_func() {
meshca@110 103 local func=$1
meshca@110 104 local script=$2
meshca@110 105 if [ -s $script ]; then
meshca@110 106 cat >> $receipt << EOT
meshca@110 107 $func()
meshca@110 108 {
meshca@110 109 $(cat $script)
meshca@110 110 }
meshca@110 111 EOT
meshca@110 112 }
meshca@110 113
meshca@110 114 # read functions into receipt
meshca@110 115 transpose_func pre_install $tmp/preinst
meshca@110 116 transpose_func post_install $tmp/postinst
meshca@110 117 transpose_func pre_remove $tmp/prerm
meshca@110 118 transpose_func post_remove $tmp/postrm
meshca@110 119
meshca@110 120 [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt
meshca@110 121
meshca@110 122 cd $tmp
meshca@110 123 tazpkg pack $file
meshca@110 124 cd - > /dev/null
meshca@110 125
meshca@110 126 mv $tmp/$file.tazpkg .
meshca@110 127 ;;
meshca@110 128 *)
meshca@110 129 gettext "Invalid target: $target (expected i386)"; newline
meshca@110 130 ;;
meshca@110 131 esac
meshca@110 132 unset_receipt
meshca@110 133 rm -rf $tmp
meshca@110 134 }
meshca@110 135
meshca@110 136 # convert a .pkg.tar.gz/.apk package to .tazpkg
meshca@110 137 # Usage: convert_arch $package_file
meshca@110 138 convert_arch() {
meshca@110 139 local package_file=$1
meshca@110 140
meshca@110 141 # Extract
meshca@110 142 local fs="$tmp/fs"
meshca@110 143 mkdir -p $fs
meshca@110 144 tar xzf $package_file -C $fs
meshca@110 145
meshca@110 146 local PKGINFO="$fs/.PKGINFO"
meshca@110 147 if [ -f $PKGINFO ]; then
meshca@110 148
meshca@110 149 # filter .PKGINFO file for variable
meshca@110 150 # Usage: filter_vars $search_var
meshca@110 151 filter_vars() {
meshca@110 152 local var=$1
meshca@110 153 echo $(grep ^$var $PKGINFO | sed 's/.*= //')
meshca@110 154 }
meshca@110 155
meshca@110 156 PACKAGE=$(filter_vars "pkgname")
meshca@110 157 VERSION=$(filter_vars "pkgver")
meshca@110 158 SHORT_DESC=$(filter_vars "pkgdesc")
meshca@110 159 WEB_SITE=$(filter_vars "url")
meshca@110 160 MAINTAINER=$(filter_vars "packager")
meshca@110 161
meshca@110 162 local file="$tmp/$package-$version"
meshca@110 163 local receipt="$file/receipt"
meshca@110 164
meshca@110 165 generate_receipt $receipt $package_file
meshca@110 166
meshca@110 167 mkdir $file
meshca@110 168 mv $fs $file
meshca@110 169
meshca@110 170 show_unresolved_lib $tmp/$file/receipt
meshca@110 171 rm -f $file/fs/.[A-Z]*
meshca@110 172
meshca@110 173 cd $tmp
meshca@110 174 tazpkg pack $file
meshca@110 175 cd - > /dev/null
meshca@110 176
meshca@110 177 mv $file.tazpkg .
meshca@110 178 else
meshca@110 179 eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline
meshca@110 180 fi
meshca@110 181 unset_receipt
meshca@110 182 rm -rf $tmp
meshca@110 183 }
meshca@110 184
meshca@110 185 # convert a .tgz package to .tazpkg
meshca@110 186 # Usage: convert_tgz $package_file
meshca@110 187 convert_tgz() {
meshca@110 188 local package_file=$1
meshca@110 189 local package=$(basename $package_file)
meshca@110 190
meshca@110 191 # Set package to current args
meshca@110 192 IFS='-'
meshca@110 193 set -- $package
meshca@110 194 unset IFS
meshca@110 195
meshca@110 196 local PACKAGE=$1
meshca@110 197 local VERSION=$2
meshca@110 198 local file="$tmp/$PACKAGE-$VERSION"
meshca@110 199 local receipt="$file/receipt"
meshca@110 200 local fs="$file/fs"
meshca@110 201
meshca@110 202 # Extract package
meshca@110 203 mkdir -p $fs
meshca@110 204 tar xzf $package_file -C $fs
meshca@110 205
meshca@110 206 if [ -d $fs/install ]; then
meshca@110 207 # Set other receipt vars
meshca@110 208 SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \
meshca@110 209 head -1 | sed 's/.*(\(.*\)).*/\1/')
meshca@110 210 WEB_SITE="http://www.slackware.com/packages/"
meshca@110 211 MAINTAINER="nobody@slitaz.org"
meshca@110 212
meshca@110 213 generate_receipt $receipt $package_file
meshca@110 214
meshca@110 215 show_unresolved_lib $receipt
meshca@110 216
meshca@110 217 # post_install function from doinst.sh
meshca@110 218 if [ -f $fs/install/doinst.sh ]; then
meshca@110 219 cat >> $receipt <<EOM
meshca@110 220
meshca@110 221 post_install()
meshca@110 222 {
meshca@110 223 chroot \$1/ sh - << EOT
meshca@110 224 cd /
meshca@110 225 $(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
meshca@110 226 EOT
meshca@110 227 }
meshca@110 228 EOM
meshca@110 229 # Get full description
meshca@110 230 if [ ! -z "$SHORT_DESC" ]; then
meshca@110 231 grep ^$PACKAGE $fs/install/slack-desc | \
meshca@110 232 sed "s/^$PACKAGE://" > $file/description.txt
meshca@110 233 fi
meshca@110 234
meshca@110 235 rm -rf $fs/install
meshca@110 236
meshca@110 237 cd $tmp
meshca@110 238 tazpkg pack $file
meshca@110 239 cd - /dev/null
meshca@110 240
meshca@110 241 mv $file.tazpkg .
meshca@110 242 else
meshca@110 243 eval_gettext "\$package_file does not look like a Slackware package !"; newline
meshca@110 244 fi
meshca@110 245 rm -rf $tmp
meshca@110 246 }
meshca@110 247
meshca@110 248 # convert a .deb package to .tazpkg
meshca@110 249 # Usage: convert_deb $package_file
meshca@110 250 convert_deb() {
meshca@110 251 local $package_file=$1
meshca@110 252
meshca@110 253 # Extract deb control
meshca@110 254 mkdir -p $tmp
meshca@110 255 dpkg-deb -e $package_file $tmp
meshca@110 256
meshca@110 257
meshca@110 258 # filter control file for variable
meshca@110 259 # Usage: filter_vars $search_var
meshca@110 260 filter_vars() {
meshca@110 261 local var=$1
meshca@110 262 local result=$(grep '^ *$var:' $tmp/control)
meshca@110 263 echo ${result##*:}
meshca@110 264 }
meshca@110 265
meshca@110 266 PACKAGE=$(filter_vars "Package")
meshca@110 267 VERSION=$(filter_vars "Version")
meshca@110 268 SHORT_DESC=$(filter_vars "Description")
meshca@110 269 WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE"
meshca@110 270 MAINTAINER="nobody@slitaz.org"
meshca@110 271 target="$(grep ^Architecture $tmp/control | sed 's/.*: //')"
meshca@110 272
meshca@110 273 case "$target" in
meshca@110 274 i386|all)
meshca@110 275 local file="$tmp/$PACKAGE-$VERSION"
meshca@110 276 local receipt="$file/receipt"
meshca@110 277 local fs="$file/fs"
meshca@110 278
meshca@110 279 # Extract deb contents
meshca@110 280 mkdir -p $fs
meshca@110 281 dpkg-deb -x $package_file $fs
meshca@110 282
meshca@110 283 generate_receipt $receipt $package_file
meshca@110 284
meshca@110 285 cd $TMP_DIR
meshca@110 286
meshca@110 287 if [ -s $tmp/conffiles ]; then
meshca@110 288 cat >> $receipt <<EOT
meshca@110 289 CONFIG_FILES="$(cat $tmp/conffiles)"
meshca@110 290 EOT
meshca@110 291 fi
meshca@110 292
meshca@110 293 show_unresolved_lib $file/receipt
meshca@110 294
meshca@110 295 # Description.txt
meshca@110 296 [ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/Description.txt
meshca@110 297
meshca@110 298 cd $tmp
meshca@110 299 tazpkg pack $file
meshca@110 300 cd - > /dev/null
meshca@110 301
meshca@110 302 mv $file.tazpkg .
meshca@110 303 ;;
meshca@110 304 *)
meshca@110 305 gettext "Invalid target: $target (expected i386 or all)"; newline
meshca@110 306 ;;
meshca@110 307 esac
meshca@110 308 rm -rf $tmp
meshca@110 309 }
meshca@110 310
meshca@110 311 # convert a .rpm package to .tazpkg
meshca@110 312 # Usage: convert_rpm $package_file
meshca@110 313 convert_rpm() {
meshca@110 314 local package_file=$1
meshca@110 315
meshca@110 316 # Move package_file to tmp
meshca@110 317 mkdir -p $tmp
meshca@110 318 cp $package_file $tmp
meshca@110 319 package_file=$TMP_DIR/$(basename $package_file)
meshca@110 320
meshca@110 321 # filter package_file for variable
meshca@110 322 # Usage: filter_vars $search_var
meshca@110 323 filter_vars() {
meshca@110 324 local var=$1
meshca@110 325 echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}')
meshca@110 326 }
meshca@110 327
meshca@110 328 PACKAGE=$(filter_vars "Name")
meshca@110 329 VERSION=$(filter_vars "Version")
meshca@110 330 SHORT_DESC=$(filter_vars "Summary")
meshca@110 331 WEB_SITE=$(filter_vars "URL")
meshca@110 332 if [ -z "$URL" ]; then
meshca@110 333 WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE"
meshca@110 334 fi
meshca@110 335 CATEGORY="misc";
meshca@110 336 MAINTAINER="nobody@slitaz.org";
meshca@110 337
meshca@110 338
meshca@110 339 local file="$tmp/$PACKAGE-$VERSION"
meshca@110 340 local receipt="$file/receipt"
meshca@110 341 local fs="$file/fs"
meshca@110 342
meshca@110 343 mkdir -p $fs
meshca@110 344
meshca@110 345 generate_receipt $receipt $package_file
meshca@110 346
meshca@110 347 rpm -qip $PACKAGE_FILE | \
meshca@110 348 grep "^Description*" -A 100 | \
meshca@110 349 grep -v "^Description*" > \
meshca@110 350 $file/description.txt
meshca@110 351
meshca@110 352 cd $fs
meshca@110 353 rpm2cpio $PACKAGE_FILE | cpio -idm --quiet
meshca@110 354 cd - > /dev/null
meshca@110 355
meshca@110 356 show_unresolved_lib $receipt
meshca@110 357
meshca@110 358 cd $tmp
meshca@110 359 tazpkg pack $file
meshca@110 360 cd -
meshca@110 361
meshca@110 362 mv $file.tazpkg .
meshca@110 363
meshca@110 364 unset_receipt
meshca@110 365 rm -rf $TMP_DIR
meshca@110 366 }
meshca@110 367
meshca@110 368
meshca@110 369 #
meshca@110 370 # Commands and exit
meshca@110 371 #
meshca@110 372
meshca@110 373 case "$1" in
meshca@110 374 ""|*usage|*help) usage ;;
meshca@110 375 esac
meshca@110 376
meshca@110 377 #
meshca@110 378 # Handle packages: package package.tazpkg ... packageN packageN.tazpkg
meshca@110 379 #
meshca@110 380
meshca@110 381 check_root
meshca@110 382
meshca@110 383 for pkg in $@
meshca@110 384 do
meshca@110 385 if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ];
meshca@110 386 then
meshca@110 387 convert_deb $pkg
meshca@110 388 else
meshca@110 389 case "$pkg" in
meshca@110 390 *.deb|*.udeb)
meshca@110 391 convert_deb $pkg;;
meshca@110 392 *.rpm)
meshca@110 393 convert_rpm $pkg;;
meshca@110 394 *.tgz)
meshca@110 395 convert_tgz $pkg;;
meshca@110 396 *.apk|*.pkg.tar.gz)
meshca@110 397 convert_arch $pkg;;
meshca@110 398 *.ipk|*.opk)
meshca@110 399 convert_ipk $pkg;;
meshca@110 400 *)
meshca@110 401 gettext "Unsupported format"; newline;;
meshca@110 402 esac
meshca@110 403 fi
meshca@110 404 done
meshca@110 405
meshca@110 406 exit 0