spk annotate spk-convert @ rev 111

Convert: Added missing funcitons, fixed a few bugs
author Christian Mesh <meshca@clarkson.edu>
date Sat Jun 09 10:22:38 2012 -0500 (2012-06-09)
parents e1c080f70e0a
children 73f0d4dec380
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 # Move tazpkg pack to shared lib?
meshca@110 37
meshca@110 38 # generate a receipt based on standard receipt vars
meshca@110 39 # Usage: generate_receipt $receipt $base_package
meshca@110 40 generate_receipt() {
meshca@110 41 local receipt=$1
meshca@110 42 local base_package=$2
meshca@110 43 cat > $receipt <<EOT
meshca@110 44 # SliTaz package receipt.
meshca@110 45 # generated by tazpkg from package $(basename $base_package)
meshca@110 46 PACKAGE="$PACKAGE"
meshca@110 47 VERSION="$VERSION"
meshca@110 48 CATEGORY="misc"
meshca@110 49 SHORT_DESC="$SHORT_DESC"
meshca@110 50 WEB_SITE="$WEB_SITE"
meshca@110 51 MAINTAINER="$MAINTAINER"
meshca@111 52 DEPENDS="$DEPENDS"
meshca@110 53 CONFIG_FILES="$CONFIG_FILES"
meshca@110 54 EOT
meshca@110 55
meshca@110 56 }
meshca@110 57
meshca@111 58 # search dependencies for files
meshca@111 59 # Usage: find_depends $fs
meshca@111 60 find_depends() {
meshca@111 61 local fs=$1
meshca@111 62
meshca@111 63 local DEFAULT_DEPENDS="glibc-base gcc-lib-base"
meshca@111 64
meshca@111 65 for chkfile in $(find $fs -type f); do
meshca@111 66 is_elf $chkfile || continue
meshca@111 67 case "$chkfile" in
meshca@111 68 *.o|*.ko|*.ko.gz) continue;;
meshca@111 69 esac
meshca@111 70
meshca@111 71 ldd $chkfile | \
meshca@111 72 while read lib rem; do
meshca@111 73 case "$lib" in
meshca@111 74 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
meshca@111 75 continue;;
meshca@111 76 esac
meshca@111 77
meshca@111 78 find $fs | grep -q /$lib$ && continue
meshca@111 79
meshca@111 80 for dep in $(fgrep $lib files.list | cut -d: -f1); do
meshca@111 81 case " $DEFAULT_DEPENDS " in
meshca@111 82 *\ $dep\ *) continue 2;;
meshca@111 83 esac
meshca@111 84 grep -qs "^$dep$" $tmpdir/depends && continue 2
meshca@111 85 done
meshca@111 86
meshca@111 87 if [ -n "$dep" ]; then
meshca@111 88 echo "$dep" >> $tmpdir/depends
meshca@111 89 else
meshca@111 90 grep -qs ^$lib$ $tmpdir/unresolved ||
meshca@111 91 echo "$lib" >> $tmpdir/unresolved
meshca@111 92 fi
meshca@111 93 done
meshca@111 94 done
meshca@111 95 unset spc
meshca@111 96 local spc
meshca@111 97 for file in $(cat $tmpdir/depends 2> /dev/null | sort | uniq); do
meshca@111 98 echo -n "$spc$file"
meshca@111 99 spc=" "
meshca@111 100 done
meshca@111 101 }
meshca@111 102
meshca@111 103 show_unresolved_lib() {
meshca@111 104 local receipt=$1
meshca@111 105 if [ -s $tmpdir/unresolved ]; then
meshca@111 106 echo -e "BUGS=\"$(gettext 'No dependency for')" >> $receipt
meshca@111 107 for lib in $(cat $tmpdir/unresolved | sort | uniq); do
meshca@111 108 eval_gettext "WARNING: unknown dependency for \$lib"; newline
meshca@111 109 echo -n " $lib" >> $receipt
meshca@111 110 done
meshca@111 111 echo "\"" >> $receipt
meshca@111 112 fi
meshca@111 113 }
meshca@111 114
meshca@111 115
meshca@111 116
meshca@110 117 # convert a .ipk package to .tazpkg
meshca@110 118 # Usage: convert_ipk $package_file
meshca@110 119 convert_ipk() {
meshca@110 120 local package_file=$1
meshca@110 121
meshca@111 122 mkdir -p $tmpdir
meshca@111 123 tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmpdir
meshca@110 124
meshca@111 125 local control="$tmpdir/control"
meshca@110 126
meshca@110 127 # filter ipk control file for variable
meshca@110 128 # Usage: filter_vars $search_var
meshca@110 129 filter_vars() {
meshca@110 130 local var=$1
meshca@110 131 echo "$(grep ^$var $control | sed 's/.*: //')"
meshca@110 132 }
meshca@110 133
meshca@110 134 # Load up receipt template variables
meshca@110 135 PACKAGE=$(filter_vars "Package")
meshca@110 136 VERSION=$(filter_vars "Version")
meshca@110 137 MAINTAINER=$(filter_vars "Maintainer")
meshca@110 138 SHORT_DESC=$(filter_vars "Description")
meshca@110 139 WEB_SITE="http://openwrt.org/"
meshca@110 140
meshca@110 141 target=$(filter_vars "Architecture")
meshca@110 142 case "$target" in
meshca@110 143 i386|all)
meshca@110 144 local file="$PACKAGE-$VERSION"
meshca@111 145 local receipt="$tmpdir/$file/receipt"
meshca@111 146 local fs="$tmpdir/$file/fs"
meshca@110 147
meshca@110 148 mkdir -p $fs
meshca@110 149 tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs
meshca@110 150
meshca@110 151 unset CONFIG_FILES
meshca@111 152 [ -s $tmpdir/conffiles ] && $CONFIG_FILE=$(cat $tmpdir/conffiles)
meshca@110 153
meshca@111 154
meshca@111 155
meshca@111 156 DEPENDS=$(find_depends $fs)
meshca@110 157 generate_receipt $receipt $package_file
meshca@110 158
meshca@110 159 show_unresolved_lib $receipt
meshca@110 160
meshca@110 161 # Writes a ipk script to receipt function
meshca@110 162 # Usage: transpose_func $function_name $script
meshca@110 163 transpose_func() {
meshca@110 164 local func=$1
meshca@110 165 local script=$2
meshca@110 166 if [ -s $script ]; then
meshca@110 167 cat >> $receipt << EOT
meshca@110 168 $func()
meshca@110 169 {
meshca@110 170 $(cat $script)
meshca@110 171 }
meshca@110 172 EOT
meshca@111 173 fi
meshca@110 174 }
meshca@110 175
meshca@110 176 # read functions into receipt
meshca@111 177 transpose_func pre_install $tmpdir/preinst
meshca@111 178 transpose_func post_install $tmpdir/postinst
meshca@111 179 transpose_func pre_remove $tmpdir/prerm
meshca@111 180 transpose_func post_remove $tmpdir/postrm
meshca@110 181
meshca@110 182 [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt
meshca@110 183
meshca@111 184 cd $tmpdir
meshca@110 185 tazpkg pack $file
meshca@110 186 cd - > /dev/null
meshca@110 187
meshca@111 188 mv $tmpdir/$file.tazpkg .
meshca@110 189 ;;
meshca@110 190 *)
meshca@110 191 gettext "Invalid target: $target (expected i386)"; newline
meshca@110 192 ;;
meshca@110 193 esac
meshca@110 194 unset_receipt
meshca@111 195 rm -rf $tmpdir
meshca@110 196 }
meshca@110 197
meshca@110 198 # convert a .pkg.tar.gz/.apk package to .tazpkg
meshca@110 199 # Usage: convert_arch $package_file
meshca@110 200 convert_arch() {
meshca@110 201 local package_file=$1
meshca@110 202
meshca@110 203 # Extract
meshca@111 204 local fs="$tmpdir/fs"
meshca@110 205 mkdir -p $fs
meshca@110 206 tar xzf $package_file -C $fs
meshca@110 207
meshca@110 208 local PKGINFO="$fs/.PKGINFO"
meshca@110 209 if [ -f $PKGINFO ]; then
meshca@110 210
meshca@110 211 # filter .PKGINFO file for variable
meshca@110 212 # Usage: filter_vars $search_var
meshca@110 213 filter_vars() {
meshca@110 214 local var=$1
meshca@110 215 echo $(grep ^$var $PKGINFO | sed 's/.*= //')
meshca@110 216 }
meshca@110 217
meshca@110 218 PACKAGE=$(filter_vars "pkgname")
meshca@110 219 VERSION=$(filter_vars "pkgver")
meshca@110 220 SHORT_DESC=$(filter_vars "pkgdesc")
meshca@110 221 WEB_SITE=$(filter_vars "url")
meshca@110 222 MAINTAINER=$(filter_vars "packager")
meshca@110 223
meshca@111 224 local file="$tmpdir/$package-$version"
meshca@110 225 local receipt="$file/receipt"
meshca@110 226
meshca@111 227 DEPENDS=$(find_depends $fs)
meshca@110 228 generate_receipt $receipt $package_file
meshca@110 229
meshca@110 230 mkdir $file
meshca@110 231 mv $fs $file
meshca@110 232
meshca@111 233 show_unresolved_lib $tmpdir/$file/receipt
meshca@110 234 rm -f $file/fs/.[A-Z]*
meshca@110 235
meshca@111 236 cd $tmpdir
meshca@110 237 tazpkg pack $file
meshca@110 238 cd - > /dev/null
meshca@110 239
meshca@110 240 mv $file.tazpkg .
meshca@110 241 else
meshca@110 242 eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline
meshca@110 243 fi
meshca@110 244 unset_receipt
meshca@111 245 rm -rf $tmpdir
meshca@110 246 }
meshca@110 247
meshca@110 248 # convert a .tgz package to .tazpkg
meshca@110 249 # Usage: convert_tgz $package_file
meshca@110 250 convert_tgz() {
meshca@110 251 local package_file=$1
meshca@110 252 local package=$(basename $package_file)
meshca@110 253
meshca@110 254 # Set package to current args
meshca@110 255 IFS='-'
meshca@110 256 set -- $package
meshca@110 257 unset IFS
meshca@110 258
meshca@110 259 local PACKAGE=$1
meshca@110 260 local VERSION=$2
meshca@111 261 local file="$tmpdir/$PACKAGE-$VERSION"
meshca@110 262 local receipt="$file/receipt"
meshca@110 263 local fs="$file/fs"
meshca@110 264
meshca@110 265 # Extract package
meshca@110 266 mkdir -p $fs
meshca@110 267 tar xzf $package_file -C $fs
meshca@110 268
meshca@110 269 if [ -d $fs/install ]; then
meshca@110 270 # Set other receipt vars
meshca@110 271 SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \
meshca@110 272 head -1 | sed 's/.*(\(.*\)).*/\1/')
meshca@110 273 WEB_SITE="http://www.slackware.com/packages/"
meshca@110 274 MAINTAINER="nobody@slitaz.org"
meshca@110 275
meshca@111 276 DEPENDS=$(find_depends $fs)
meshca@110 277 generate_receipt $receipt $package_file
meshca@110 278
meshca@110 279 show_unresolved_lib $receipt
meshca@110 280
meshca@110 281 # post_install function from doinst.sh
meshca@110 282 if [ -f $fs/install/doinst.sh ]; then
meshca@110 283 cat >> $receipt <<EOM
meshca@110 284
meshca@110 285 post_install()
meshca@110 286 {
meshca@110 287 chroot \$1/ sh - << EOT
meshca@110 288 cd /
meshca@110 289 $(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
meshca@110 290 EOT
meshca@110 291 }
meshca@110 292 EOM
meshca@111 293 fi
meshca@111 294
meshca@110 295 # Get full description
meshca@110 296 if [ ! -z "$SHORT_DESC" ]; then
meshca@110 297 grep ^$PACKAGE $fs/install/slack-desc | \
meshca@110 298 sed "s/^$PACKAGE://" > $file/description.txt
meshca@110 299 fi
meshca@110 300
meshca@110 301 rm -rf $fs/install
meshca@110 302
meshca@111 303 cd $tmpdir
meshca@110 304 tazpkg pack $file
meshca@110 305 cd - /dev/null
meshca@110 306
meshca@110 307 mv $file.tazpkg .
meshca@110 308 else
meshca@110 309 eval_gettext "\$package_file does not look like a Slackware package !"; newline
meshca@110 310 fi
meshca@111 311 rm -rf $tmpdir
meshca@110 312 }
meshca@110 313
meshca@110 314 # convert a .deb package to .tazpkg
meshca@110 315 # Usage: convert_deb $package_file
meshca@110 316 convert_deb() {
meshca@111 317 local $package_file="$1"
meshca@110 318
meshca@110 319 # Extract deb control
meshca@111 320 mkdir -p $tmpdir
meshca@111 321 dpkg-deb -e $package_file $tmpdir
meshca@110 322
meshca@110 323
meshca@110 324 # filter control file for variable
meshca@110 325 # Usage: filter_vars $search_var
meshca@110 326 filter_vars() {
meshca@110 327 local var=$1
meshca@111 328 local result=$(grep '^ *$var:' $tmpdir/control)
meshca@110 329 echo ${result##*:}
meshca@110 330 }
meshca@110 331
meshca@110 332 PACKAGE=$(filter_vars "Package")
meshca@110 333 VERSION=$(filter_vars "Version")
meshca@110 334 SHORT_DESC=$(filter_vars "Description")
meshca@110 335 WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE"
meshca@110 336 MAINTAINER="nobody@slitaz.org"
meshca@111 337 target="$(grep ^Architecture $tmpdir/control | sed 's/.*: //')"
meshca@110 338
meshca@110 339 case "$target" in
meshca@110 340 i386|all)
meshca@111 341 local file="$tmpdir/$PACKAGE-$VERSION"
meshca@110 342 local receipt="$file/receipt"
meshca@110 343 local fs="$file/fs"
meshca@110 344
meshca@110 345 # Extract deb contents
meshca@110 346 mkdir -p $fs
meshca@110 347 dpkg-deb -x $package_file $fs
meshca@110 348
meshca@111 349 DEPENDS=$(find_depends $fs)
meshca@110 350 generate_receipt $receipt $package_file
meshca@111 351
meshca@111 352 if [ -s $tmpdir/conffiles ]; then
meshca@110 353 cat >> $receipt <<EOT
meshca@111 354 CONFIG_FILES="$(cat $tmpdir/conffiles)"
meshca@110 355 EOT
meshca@110 356 fi
meshca@110 357
meshca@110 358 show_unresolved_lib $file/receipt
meshca@110 359
meshca@110 360 # Description.txt
meshca@110 361 [ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/Description.txt
meshca@110 362
meshca@111 363 cd $tmpdir
meshca@110 364 tazpkg pack $file
meshca@110 365 cd - > /dev/null
meshca@110 366
meshca@110 367 mv $file.tazpkg .
meshca@110 368 ;;
meshca@110 369 *)
meshca@110 370 gettext "Invalid target: $target (expected i386 or all)"; newline
meshca@110 371 ;;
meshca@110 372 esac
meshca@111 373 rm -rf $tmpdir
meshca@110 374 }
meshca@110 375
meshca@110 376 # convert a .rpm package to .tazpkg
meshca@110 377 # Usage: convert_rpm $package_file
meshca@110 378 convert_rpm() {
meshca@110 379 local package_file=$1
meshca@110 380
meshca@110 381 # Move package_file to tmp
meshca@111 382 mkdir -p $tmpdir
meshca@111 383 cp $package_file $tmpdir
meshca@111 384 package_file=$tmpdir/$(basename $package_file)
meshca@110 385
meshca@110 386 # filter package_file for variable
meshca@110 387 # Usage: filter_vars $search_var
meshca@110 388 filter_vars() {
meshca@110 389 local var=$1
meshca@110 390 echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}')
meshca@110 391 }
meshca@110 392
meshca@110 393 PACKAGE=$(filter_vars "Name")
meshca@110 394 VERSION=$(filter_vars "Version")
meshca@110 395 SHORT_DESC=$(filter_vars "Summary")
meshca@110 396 WEB_SITE=$(filter_vars "URL")
meshca@111 397 if [ -z "$WEB_SITE" ]; then
meshca@110 398 WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE"
meshca@110 399 fi
meshca@110 400 CATEGORY="misc";
meshca@110 401 MAINTAINER="nobody@slitaz.org";
meshca@110 402
meshca@110 403
meshca@111 404 local file="$tmpdir/$PACKAGE-$VERSION"
meshca@110 405 local receipt="$file/receipt"
meshca@110 406 local fs="$file/fs"
meshca@110 407
meshca@110 408 mkdir -p $fs
meshca@110 409
meshca@111 410 rpm -qip $package_file | \
meshca@110 411 grep "^Description*" -A 100 | \
meshca@110 412 grep -v "^Description*" > \
meshca@110 413 $file/description.txt
meshca@110 414
meshca@110 415 cd $fs
meshca@111 416 rpm2cpio $package_file | cpio -idm --quiet
meshca@110 417 cd - > /dev/null
meshca@110 418
meshca@111 419
meshca@111 420 DEPENDS=$(find_depends $fs)
meshca@111 421 generate_receipt $receipt $package_file
meshca@111 422
meshca@110 423 show_unresolved_lib $receipt
meshca@110 424
meshca@111 425 cd $tmpdir
meshca@110 426 tazpkg pack $file
meshca@110 427 cd -
meshca@110 428
meshca@110 429 mv $file.tazpkg .
meshca@110 430
meshca@110 431 unset_receipt
meshca@111 432 rm -rf $tmpdir
meshca@110 433 }
meshca@110 434
meshca@110 435
meshca@110 436 #
meshca@110 437 # Commands and exit
meshca@110 438 #
meshca@110 439
meshca@110 440 case "$1" in
meshca@110 441 ""|*usage|*help) usage ;;
meshca@110 442 esac
meshca@110 443
meshca@110 444 #
meshca@110 445 # Handle packages: package package.tazpkg ... packageN packageN.tazpkg
meshca@110 446 #
meshca@110 447
meshca@110 448 check_root
meshca@110 449
meshca@110 450 for pkg in $@
meshca@110 451 do
meshca@110 452 if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ];
meshca@110 453 then
meshca@110 454 convert_deb $pkg
meshca@110 455 else
meshca@110 456 case "$pkg" in
meshca@110 457 *.deb|*.udeb)
meshca@110 458 convert_deb $pkg;;
meshca@110 459 *.rpm)
meshca@110 460 convert_rpm $pkg;;
meshca@110 461 *.tgz)
meshca@110 462 convert_tgz $pkg;;
meshca@110 463 *.apk|*.pkg.tar.gz)
meshca@110 464 convert_arch $pkg;;
meshca@110 465 *.ipk|*.opk)
meshca@110 466 convert_ipk $pkg;;
meshca@110 467 *)
meshca@110 468 gettext "Unsupported format"; newline;;
meshca@110 469 esac
meshca@110 470 fi
meshca@110 471 done
meshca@110 472
meshca@110 473 exit 0