tazpkg view tazpkg-convert @ rev 695

Separate convert functions to tazpkg-convert; functions that are common to the tazpkg and tazpkg-convert moved to libs.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Tue Dec 02 02:22:09 2014 +0200 (2014-12-02)
parents
children bd0e2ed0e601
line source
1 #!/bin/sh
3 # This program is a part of TazPkg.
4 # /usr/bin/tazpkg-convert: toolset to convert alien package to the tazpkg format
6 # Usage: tazpkg-convert alien_package [ target_directory ]
9 PACKAGE_FILE="$1"
10 TARGET_DIR="$2"
11 TMP_DIR=$(mktemp -d)
12 TOP_DIR="$(pwd)"
14 . /etc/slitaz/slitaz.conf
15 . /lib/libtaz.sh
16 . /usr/lib/tazpkg/tazpkg-find-depends
18 # Internationalization.
19 export TEXTDOMAIN='tazpkg'
22 # FIXME: what does this mean?
23 [ -n "$TARGET_DIR" -a -s "$TARGET_DIR/files.list.lzma" ] && TMPLOCALSTATE="$TARGET_DIR"
26 show_unresolved_lib()
27 {
28 if [ -s $TMP_DIR/unresolved ]; then
29 echo -e "BUGS=\"`gettext \"No dependency for\"`" >> $1
30 sort < $TMP_DIR/unresolved | uniq | \
31 while read file; do
32 _ 'WARNING: unknown dependency for $lib'
33 echo -n " $file" >> $1
34 done
35 echo "\"" >> $1
36 fi
37 }
40 # convert a .tar.bz2 package to .tazpkg
42 convert_upkg()
43 {
44 mkdir -p $TMP_DIR/fs
45 tar xjf $PACKAGE_FILE -C $TMP_DIR/fs
46 if [ -d $TMP_DIR/fs/var/lib/upkg/packages ]; then
47 cd $TMP_DIR
48 package="$(sed '/^Package:/!d;s/.*: //' fs/var/lib/upkg/packages/*.info)"
49 version="$(sed '/^Version:/!d;s/.*: //' fs/var/lib/upkg/packages/*.info)"
50 url="http://www.paldo.org/"
51 file=$package-$version
52 mkdir $file
53 mv fs $file
54 maintainer=nobody@slitaz.org
55 descrip="$package package from paldo."
56 cat > $file/receipt <<EOT
57 # SliTaz package receipt.
58 # generated by tazpkg from package $(basename $PACKAGE_FILE)
59 PACKAGE="$package"
60 VERSION="$version"
61 CATEGORY="misc"
62 SHORT_DESC="$descrip"
63 WEB_SITE="$url"
64 MAINTAINER="$maintainer"
65 DEPENDS="$(find_depends)"
66 EOT
67 [ -s $file/var/lib/upkg/files/*.config.bz2 ] &&
68 cat >> $file/receipt <<EOT
69 CONFIG_FILES="$(bzcat $file/var/lib/upkg/files/*.config.bz2)"
70 EOT
71 while read ext func ; do
72 [ -s $file/fs/var/lib/upkg/scripts/*.$ext ] || continue
73 cat >> $file/receipt <<EOT
75 $func()
76 {
77 $(cat $file/fs/var/lib/upkg/scripts/*.$ext)
78 }
79 EOT
80 done <<EOT
81 prerm pre_remove
82 EOT
84 tazpkg pack $file
85 mv $TMP_DIR/$file.tazpkg $TOP_DIR
86 else
87 _ '$PACKAGE_FILE does not look like an upkg package!'
88 fi
89 cd $TOP_DIR
90 rm -rf $TMP_DIR
91 }
94 # convert a .spack package to .tazpkg
96 convert_spack()
97 {
98 mkdir -p $TMP_DIR
99 ( cd $TMP_DIR ; cpio -i ) < $PACKAGE_FILE
100 cd $TMP_DIR
101 package="$(sed '$!d;s/:.*//' about.txt)"
102 version="$(basename $PACKAGE_FILE | sed "s/$package-\([^-]*\).*/\1/")"
103 descrip="$(sed '$!d;s/.*: //' about.txt)"
104 url="http://0linux.org/"
105 maintainer=nobody@slitaz.org
106 file=$package-$version
107 mkdir -p $file/fs
108 xzcat files.xz | ( cd $file/fs ; cpio -idmu )
109 cat > $file/receipt <<EOT
110 # SliTaz package receipt.
111 # generated by tazpkg from package $(basename $PACKAGE_FILE)
112 PACKAGE="$package"
113 VERSION="$version"
114 CATEGORY="misc"
115 SHORT_DESC="$descrip"
116 WEB_SITE="$url"
117 MAINTAINER="$maintainer"
118 DEPENDS="$(find_depends)"
119 EOT
120 [ -s pre-install.sh ] && cat >> $file/receipt <<EOT
122 pre_install()
123 {
124 cd /
125 $(sed 1d pre-install.sh)
126 }
127 EOT
128 [ -s post-install.sh ] && cat >> $file/receipt <<EOT
130 post_install()
131 {
132 cd /
133 $(sed '1,/^}/d' post-install.sh)
134 }
135 EOT
136 tazpkg pack $file
137 cd $TOP_DIR
138 mv $TMP_DIR/$file.tazpkg .
139 rm -rf $TMP_DIR
140 }
143 # convert a .ipk package to .tazpkg
145 convert_ipk()
146 {
147 mkdir -p $TMP_DIR
148 tar xOzf $PACKAGE_FILE ./control.tar.gz | tar xzf - -C $TMP_DIR
149 package="$(grep ^Package $TMP_DIR/control | sed 's/.*: //')"
150 version="$(grep ^Version $TMP_DIR/control | sed 's/.*: //')"
151 maintainer="$(grep ^Maintainer $TMP_DIR/control | sed 's/.*: //')"
152 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
153 descrip="$(grep ^Description $TMP_DIR/control | sed 's/.*: //')"
154 url="http://openwrt.org/"
155 case "$target" in
156 i386|all)
157 file=$package-$version
158 mkdir -p $TMP_DIR/$file/fs
159 tar xOzf $PACKAGE_FILE ./data.tar.gz | tar xzf - -C $TMP_DIR/$file/fs
160 cd $TMP_DIR
161 cat > $file/receipt <<EOT
162 # SliTaz package receipt.
163 # generated by tazpkg from package $(basename $PACKAGE_FILE)
164 PACKAGE="$package"
165 VERSION="$version"
166 CATEGORY="misc"
167 SHORT_DESC="$descrip"
168 WEB_SITE="$url"
169 MAINTAINER="$maintainer"
170 DEPENDS="$(find_depends)"
171 EOT
172 show_unresolved_lib $file/receipt
173 [ -s conffiles ] && cat >> $file/receipt <<EOT
174 CONFIG_FILES="$(cat conffiles)"
175 EOT
176 show_unresolved_lib $file/receipt
177 while read script func; do
178 [ -s $script ] && cat >> $file/receipt <<EOT
180 $func()
181 {
182 $(cat $script)
183 }
184 EOT
185 done <<EOT
186 preinst pre_install
187 postinst post_install
188 prerm pre_remove
189 postrm post_remove
190 EOT
191 awk '
192 {
193 if (/^ / && show) print substr($0,2);
194 else show=0;
195 if (/^Description/) show=1;
196 }' < $TMP_DIR/control > $file/description.txt
197 sed -i 's/^\.$//' $file/description.txt
198 [ -s $file/description.txt ] || rm -f $file/description.txt
199 tazpkg pack $file
200 cd $TOP_DIR
201 mv $TMP_DIR/$file.tazpkg .
202 ;;
203 *)
204 _ 'Invalid target: $target (expected i386)'
205 ;;
206 esac
207 rm -rf $TMP_DIR
208 }
211 # convert a .pkg.tar.gz/.pkg.tar.xz/.apk package to .tazpkg
213 convert_arch()
214 {
215 mkdir -p $TMP_DIR/fs
216 busybox tar xf $PACKAGE_FILE -C $TMP_DIR/fs
217 if [ -f $TMP_DIR/fs/.PKGINFO ]; then
218 cd $TMP_DIR
219 package="$(grep ^pkgname fs/.PKGINFO | sed 's/.*= //')"
220 version="$(grep ^pkgver fs/.PKGINFO | sed 's/.*= //')"
221 descrip="$(grep ^pkgdesc fs/.PKGINFO | sed 's/.*= //')"
222 url="$(grep ^url fs/.PKGINFO | sed 's/.*= //')"
223 maintainer="$(grep ^packager fs/.PKGINFO | sed 's/.*= //')"
224 file=$package-$version
225 mkdir $file
226 mv fs $file
227 cat > $file/receipt <<EOT
228 # SliTaz package receipt.
229 # generated by tazpkg from Archlinux package $(basename $PACKAGE_FILE)
230 PACKAGE="$package"
231 VERSION="$version"
232 CATEGORY="misc"
233 SHORT_DESC="$descrip"
234 WEB_SITE="$url"
235 MAINTAINER="$maintainer"
236 DEPENDS="$(find_depends)"
237 EOT
238 show_unresolved_lib $file/receipt
239 rm -f $file/fs/.[A-Z]*
240 tazpkg pack $file
241 mv $file.tazpkg $TOP_DIR
242 else
243 _ '$PACKAGE_FILE does not look like an Archlinux/Alpine package!'
244 fi
245 cd $TOP_DIR
246 rm -rf $TMP_DIR
247 }
250 # get package and version from PACKAGE_FILE
252 parse_pkgname()
253 {
254 package=$(basename ${2:-$PACKAGE_FILE} $1)
255 IFS='-'
256 set -- $package
257 unset IFS
258 package=$1
259 version=$2
260 if [ -z "$version" ]; then
261 package=${1%%[0-9\.]*}
262 version=${1#$package}
263 fi
264 file="$package-$version"
265 mkdir $file
266 }
269 finish_convert_puppy()
270 {
271 rm -f fs/*.specs
272 mv fs $file
273 cat > $file/receipt <<EOT
274 # SliTaz package receipt.
275 # generated by tazpkg from puppy package $(basename $PACKAGE_FILE)
276 PACKAGE="$package"
277 VERSION="$version"
278 CATEGORY="misc"
279 SHORT_DESC="$desc"
280 WEB_SITE="http://puppylinux.org/"
281 MAINTAINER="nobody@slitaz.org"
282 DEPENDS="$(find_depends)"
283 EOT
284 show_unresolved_lib $file/receipt
285 for i in install uninstall ; do
286 [ -f $file/fs/p$i.sh ] && cat >> $file/receipt <<EOM
288 post_$i()
289 {
290 chroot \$1/ sh - << EOT
291 cd /
292 $(sed -e 's/\\/\\\\/g' -e 's/\$/\\$/g' < $file/fs/p$i.sh ; rm -f $file/fs/p$i.sh)
293 EOT
294 }
295 EOM
296 done
297 sed -i 's/post_uninstall/post_remove/' $file/receipt
298 tazpkg pack $file
299 mv $file.tazpkg $TOP_DIR
300 cd $TOP_DIR
301 rm -rf $TMP_DIR
302 }
305 # convert a .sfs package to .tazpkg
307 convert_sfs()
308 {
309 [ -n "$(which unsquashfs)" ] || tazpkg get-install squashfs
310 if ! unsquashfs -l $PACKAGE_FILE | grep -q squashfs-root/pet.specs$ ; then
311 _ '$PACKAGE_FILE does not look like a Puppy package!'
312 return 1
313 fi
314 mkdir -p $TMP_DIR
315 cd $TMP_DIR
316 parse_pkgname .sfs
317 unsquashfs $PACKAGE_FILE
318 mv squashfs-root fs
319 set -- $(cat fs/pet.specs)
320 desc="$10"
321 finish_convert_puppy
322 }
325 # convert a .pet package to .tazpkg
327 convert_pet()
328 {
329 mkdir -p $TMP_DIR
330 cd $TMP_DIR
331 parse_pkgname .pet
332 tar xzf $PACKAGE_FILE 2> /dev/null
333 . $package*/*.specs
334 desc="$PETMENUDESCR"
335 mv $package*/ fs
336 finish_convert_puppy
337 }
340 # convert a .sb package to .tazpkg
342 convert_sb()
343 {
344 [ -n "$(which unsquashfs)" ] || tazpkg get-install squashfs
345 if ! unsquashfs -l $PACKAGE_FILE | grep -q squashfs-root/var/log/removed_scripts ; then
346 _ '$PACKAGE_FILE does not look like a Slax package!'
347 return 1
348 fi
349 mkdir -p $TMP_DIR
350 cd $TMP_DIR
351 unsquashfs $PACKAGE_FILE
352 mv squashfs-root fs
353 parse_pkgname '' $(cat fs/var/log/packages/* | sed '/PACKAGE NAME:/!d;s/.*: *//')
354 desc="$(cat fs/var/log/packages/* | sed '/^PACKAGE DESCRIPTION:/,$!d;N;s/.*: //;q')"
355 cat fs/var/log/packages/* | sed '/^PACKAGE DESCRIPTION:/,/FILE LIST/!d;s/.*://;/^$/d' > $file/description.txt
356 mv fs $file
357 cat > $file/receipt <<EOT
358 # SliTaz package receipt.
359 # generated by tazpkg from slax package $(basename $PACKAGE_FILE)
360 PACKAGE="$package"
361 VERSION="$version"
362 CATEGORY="misc"
363 SHORT_DESC="$desc"
364 WEB_SITE="http://www.slax.org/"
365 MAINTAINER="nobody@slitaz.org"
366 DEPENDS="$(find_depends)"
367 EOT
368 show_unresolved_lib $file/receipt
369 [ -f $file/fs/var/log/scripts/$package* ] && cat >> $file/receipt <<EOM
371 post_install()
372 {
373 chroot \$1/ sh - << EOT
374 cd /
375 $(cat $file/fs/var/log/scripts/$package* | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
376 EOT
377 }
378 EOM
379 tazpkg pack $file
380 mv $file.tazpkg $TOP_DIR
381 cd $TOP_DIR
382 rm -rf $TMP_DIR
383 }
386 # convert a .tgz package to .tazpkg
388 convert_tgz()
389 {
390 parse_pkgname
391 mkdir -p $TMP_DIR/$file/fs
392 tar xzf $PACKAGE_FILE -C $TMP_DIR/$file/fs
393 cd $TMP_DIR
394 if [ -d $file/fs/install ]; then
395 descrip=$(grep ^$package $file/fs/install/slack-desc | \
396 head -1 | sed 's/.*(\(.*\)).*/\1/')
397 cat > $file/receipt <<EOT
398 # SliTaz package receipt.
399 # generated by tazpkg from slackware package $(basename $PACKAGE_FILE)
400 PACKAGE="$package"
401 VERSION="$version"
402 CATEGORY="misc"
403 SHORT_DESC="$descrip"
404 WEB_SITE="http://www.slackware.com/packages/"
405 MAINTAINER="nobody@slitaz.org"
406 DEPENDS="$(find_depends)"
407 EOT
408 show_unresolved_lib $file/receipt
409 [ -f $file/fs/install/doinst.sh ] && cat >> $file/receipt <<EOM
411 post_install()
412 {
413 chroot \$1/ sh - << EOT
414 cd /
415 $(sed -e 's/\\/\\\\/g' -e 's/\$/\\$/g' < $file/fs/install/doinst.sh)
416 EOT
417 }
418 EOM
419 grep ^$package $file/fs/install/slack-desc | \
420 sed "s/^$package://" > $file/description.txt
421 [ -s $file/description.txt ] || rm -f $file/description.txt
422 rm -rf $file/fs/install
423 tazpkg pack $file
424 mv $file.tazpkg $TOP_DIR
425 else
426 _ '$PACKAGE_FILE does not look like a Slackware package!'
427 fi
428 cd $TOP_DIR
429 rm -rf $TMP_DIR
430 }
433 # convert a .deb package to .tazpkg
435 convert_deb()
436 {
437 mkdir -p $TMP_DIR
438 dpkg-deb -e $PACKAGE_FILE $TMP_DIR
439 package=$(grep '^ *Package:' $TMP_DIR/control)
440 package=$(echo ${package##*:})
441 version=$(grep '^ *Version:' $TMP_DIR/control)
442 version=$(echo ${version##*:})
443 descrip=$(grep '^ *Description:' $TMP_DIR/control)
444 descrip=$(echo ${descrip##*:})
445 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
446 case "$target" in
447 i386|all)
448 file="$package-$version"
449 mkdir -p $TMP_DIR/$file/fs/
450 dpkg-deb -x $PACKAGE_FILE $TMP_DIR/$file/fs
451 cd $TMP_DIR
452 cat > $file/receipt <<EOT
453 # SliTaz package receipt.
454 # generated by tazpkg from debian package $(basename $PACKAGE_FILE)
455 PACKAGE="$package"
456 VERSION="$version"
457 CATEGORY="misc"
458 SHORT_DESC="$descrip"
459 WEB_SITE="http://packages.debian.org/search?keywords=$package"
460 MAINTAINER="nobody@slitaz.org"
461 EOT
462 LICENSE="$(grep /usr/share/common-licenses/ \
463 $PACKAGE_FILE $TMP_DIR/$file/fs/usr/share/doc/*/copyright | \
464 sed 's|.*common-licenses/\([-\.A-Za-z0-9]*\).*|\1|;s|[-\.]$||q')"
465 [ -n "$LICENSE" ] && echo "LICENSE=\"$LICENSE\"" >> $file/receipt
466 echo "DEPENDS=\"$(find_depends)\"" >> $file/receipt
467 [ -s conffiles ] && cat >> $file/receipt <<EOT
468 CONFIG_FILES="$(cat conffiles)"
469 EOT
470 show_unresolved_lib $file/receipt
471 awk '
472 {
473 if (/^ / && show) print substr($0,2);
474 else show=0;
475 if (/^Description/) show=1;
476 }' < $TMP_DIR/control > $file/description.txt
477 sed -i 's/^\.$//' $file/description.txt
478 [ -s $file/description.txt ] || rm -f $file/description.txt
479 tazpkg pack $file
480 mv $file.tazpkg $TOP_DIR
481 ;;
482 *)
483 _ 'Invalid target: $target (expected i386)'
484 ;;
485 esac
486 cd $TOP_DIR
487 rm -rf $TMP_DIR
488 }
491 # convert a .rpm package to .tazpkg
493 convert_rpm()
494 {
495 mkdir -p $TMP_DIR
496 cp $PACKAGE_FILE $TMP_DIR
497 PACKAGE_FILE=$TMP_DIR/$(basename $PACKAGE_FILE)
498 rpm -qip $PACKAGE_FILE | awk -v pkg=$(basename $PACKAGE_FILE) '
499 BEGIN {
500 goturl=0;
501 printf "# SliTaz package receipt.\n";
502 printf "# generated by tazpkg from rpm package %s\n",pkg;
503 }
504 {
505 if (/^Name/) { name=$3; printf "PACKAGE=\"%s\"\n",$3; }
506 if (/^Version/) printf "VERSION=\"%s-",$3;
507 if (/^Release/) printf "%s\"\n",$3;
508 if (/^Summary/) printf "SHORT_DESC=\"%s\"\n",substr($0,15);
509 if (/^URL/) { goturl=1; printf "WEB_SITE=\"%s\"\n",$3; }
510 }
511 END {
512 if (goturl == 0)
513 printf "WEB_SITE=\"http://rpmfind.net/linux/rpm2html/search.php?query=%s\"\n",name;
514 printf "CATEGORY=\"misc\"\n";
515 printf "MAINTAINER=\"nobody@slitaz.org\"\n";
516 }
517 ' > $TMP_DIR/receipt
518 . $TMP_DIR/receipt
519 file=$PACKAGE-$VERSION
520 mkdir -p $TMP_DIR/$file/fs/
521 mv $TMP_DIR/receipt $TMP_DIR/$file
522 rpm -qip $PACKAGE_FILE | awk '
523 BEGIN { show=0 }
524 {
525 if (show) print;
526 if (/^Description/) show=1;
527 }
528 ' > $TMP_DIR/$file/description.txt
529 cd $TMP_DIR/$file/fs/
530 rpm2cpio $PACKAGE_FILE | cpio -idm --quiet
531 # rpm2cpio can't extract some new RPMs
532 if [ $? == 1 ]; then
533 if [ ! -e $INSTALLED/p7zip-full/receipt ]; then
534 boldify $(_ 'Unable to extract the RPM using standard tools (rpm2cpio).')
535 _n "Do you want to install 'p7zip-full' package"; confirm
536 if [ $? = 0 ]; then
537 tazpkg -gi p7zip-full
538 else
539 rm -rf $TMP_DIR
540 exit 1
541 fi
542 fi
543 # we may already have 7z or may have just installed it in the step above
544 if [ -e $INSTALLED/p7zip-full/receipt ]; then
545 7z x -so $PACKAGE_FILE | cpio -idm --quiet
546 fi
547 fi
548 cd ../..
549 echo "DEPENDS=\"$(find_depends)\"" >> $TMP_DIR/$file/receipt
550 show_unresolved_lib $TMP_DIR/$file/receipt
551 tazpkg pack $file
552 mv $file.tazpkg $TOP_DIR
553 cd $TOP_DIR
554 rm -rf $TMP_DIR
555 }
560 if [ "$(dd if=$PACKAGE_FILE bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ]; then
561 convert_deb
562 else
563 case "$PACKAGE_FILE" in
564 *.deb|*.udeb)
565 convert_deb;;
566 *.rpm)
567 convert_rpm;;
568 *.sb)
569 convert_sb;;
570 *.sfs)
571 convert_sfs;;
572 *.pet)
573 convert_pet;;
574 *.tgz)
575 convert_tgz;;
576 *.apk|*.pkg.tar.gz|*.pkg.tar.xz)
577 convert_arch;;
578 *.ipk|*.opk)
579 convert_ipk;;
580 *.spack)
581 convert_spack;;
582 *.tar.bz2)
583 convert_upkg;;
584 *)
585 _ 'Unsupported format' ;;
586 esac
587 fi
589 exit 0