spk view 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
line source
1 #!/bin/sh
2 #
3 # Spk-convert - Convert other distrobution's packages to tazpkg form. Read the README before adding or
4 # modifing any code in spk!
5 #
6 # Copyright (C) SliTaz GNU/Linux - BSD License
7 # Author: See AUTHORS files
8 #
9 . /usr/lib/slitaz/libspk.sh
11 #
12 # Functions
13 #
15 # Help and usage
16 usage() {
17 name=$(basename $0)
18 cat << EOT
20 $(boldify $(gettext "Usage:")) $name [packages|--options]
22 $(gettext "Convert SliTaz Packages")
24 $(boldify $(gettext "Options:"))
25 --install $(gettext "Install package after conversion")
26 --root= $(gettext "Set the root file system path")
27 --debug $(gettext "Display some useful debug information")
29 $(boldify $(gettext "Examples:"))
30 $name package1.rpm package2.tgz packageN.ipk
32 EOT
33 exit 0
34 }
36 # Move tazpkg pack to shared lib?
38 # generate a receipt based on standard receipt vars
39 # Usage: generate_receipt $receipt $base_package
40 generate_receipt() {
41 local receipt=$1
42 local base_package=$2
43 cat > $receipt <<EOT
44 # SliTaz package receipt.
45 # generated by tazpkg from package $(basename $base_package)
46 PACKAGE="$PACKAGE"
47 VERSION="$VERSION"
48 CATEGORY="misc"
49 SHORT_DESC="$SHORT_DESC"
50 WEB_SITE="$WEB_SITE"
51 MAINTAINER="$MAINTAINER"
52 DEPENDS="$DEPENDS"
53 CONFIG_FILES="$CONFIG_FILES"
54 EOT
56 }
58 # search dependencies for files
59 # Usage: find_depends $fs
60 find_depends() {
61 local fs=$1
63 local DEFAULT_DEPENDS="glibc-base gcc-lib-base"
65 for chkfile in $(find $fs -type f); do
66 is_elf $chkfile || continue
67 case "$chkfile" in
68 *.o|*.ko|*.ko.gz) continue;;
69 esac
71 ldd $chkfile | \
72 while read lib rem; do
73 case "$lib" in
74 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
75 continue;;
76 esac
78 find $fs | grep -q /$lib$ && continue
80 for dep in $(fgrep $lib files.list | cut -d: -f1); do
81 case " $DEFAULT_DEPENDS " in
82 *\ $dep\ *) continue 2;;
83 esac
84 grep -qs "^$dep$" $tmpdir/depends && continue 2
85 done
87 if [ -n "$dep" ]; then
88 echo "$dep" >> $tmpdir/depends
89 else
90 grep -qs ^$lib$ $tmpdir/unresolved ||
91 echo "$lib" >> $tmpdir/unresolved
92 fi
93 done
94 done
95 unset spc
96 local spc
97 for file in $(cat $tmpdir/depends 2> /dev/null | sort | uniq); do
98 echo -n "$spc$file"
99 spc=" "
100 done
101 }
103 show_unresolved_lib() {
104 local receipt=$1
105 if [ -s $tmpdir/unresolved ]; then
106 echo -e "BUGS=\"$(gettext 'No dependency for')" >> $receipt
107 for lib in $(cat $tmpdir/unresolved | sort | uniq); do
108 eval_gettext "WARNING: unknown dependency for \$lib"; newline
109 echo -n " $lib" >> $receipt
110 done
111 echo "\"" >> $receipt
112 fi
113 }
117 # convert a .ipk package to .tazpkg
118 # Usage: convert_ipk $package_file
119 convert_ipk() {
120 local package_file=$1
122 mkdir -p $tmpdir
123 tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmpdir
125 local control="$tmpdir/control"
127 # filter ipk control file for variable
128 # Usage: filter_vars $search_var
129 filter_vars() {
130 local var=$1
131 echo "$(grep ^$var $control | sed 's/.*: //')"
132 }
134 # Load up receipt template variables
135 PACKAGE=$(filter_vars "Package")
136 VERSION=$(filter_vars "Version")
137 MAINTAINER=$(filter_vars "Maintainer")
138 SHORT_DESC=$(filter_vars "Description")
139 WEB_SITE="http://openwrt.org/"
141 target=$(filter_vars "Architecture")
142 case "$target" in
143 i386|all)
144 local file="$PACKAGE-$VERSION"
145 local receipt="$tmpdir/$file/receipt"
146 local fs="$tmpdir/$file/fs"
148 mkdir -p $fs
149 tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs
151 unset CONFIG_FILES
152 [ -s $tmpdir/conffiles ] && $CONFIG_FILE=$(cat $tmpdir/conffiles)
156 DEPENDS=$(find_depends $fs)
157 generate_receipt $receipt $package_file
159 show_unresolved_lib $receipt
161 # Writes a ipk script to receipt function
162 # Usage: transpose_func $function_name $script
163 transpose_func() {
164 local func=$1
165 local script=$2
166 if [ -s $script ]; then
167 cat >> $receipt << EOT
168 $func()
169 {
170 $(cat $script)
171 }
172 EOT
173 fi
174 }
176 # read functions into receipt
177 transpose_func pre_install $tmpdir/preinst
178 transpose_func post_install $tmpdir/postinst
179 transpose_func pre_remove $tmpdir/prerm
180 transpose_func post_remove $tmpdir/postrm
182 [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt
184 cd $tmpdir
185 tazpkg pack $file
186 cd - > /dev/null
188 mv $tmpdir/$file.tazpkg .
189 ;;
190 *)
191 gettext "Invalid target: $target (expected i386)"; newline
192 ;;
193 esac
194 unset_receipt
195 rm -rf $tmpdir
196 }
198 # convert a .pkg.tar.gz/.apk package to .tazpkg
199 # Usage: convert_arch $package_file
200 convert_arch() {
201 local package_file=$1
203 # Extract
204 local fs="$tmpdir/fs"
205 mkdir -p $fs
206 tar xzf $package_file -C $fs
208 local PKGINFO="$fs/.PKGINFO"
209 if [ -f $PKGINFO ]; then
211 # filter .PKGINFO file for variable
212 # Usage: filter_vars $search_var
213 filter_vars() {
214 local var=$1
215 echo $(grep ^$var $PKGINFO | sed 's/.*= //')
216 }
218 PACKAGE=$(filter_vars "pkgname")
219 VERSION=$(filter_vars "pkgver")
220 SHORT_DESC=$(filter_vars "pkgdesc")
221 WEB_SITE=$(filter_vars "url")
222 MAINTAINER=$(filter_vars "packager")
224 local file="$tmpdir/$package-$version"
225 local receipt="$file/receipt"
227 DEPENDS=$(find_depends $fs)
228 generate_receipt $receipt $package_file
230 mkdir $file
231 mv $fs $file
233 show_unresolved_lib $tmpdir/$file/receipt
234 rm -f $file/fs/.[A-Z]*
236 cd $tmpdir
237 tazpkg pack $file
238 cd - > /dev/null
240 mv $file.tazpkg .
241 else
242 eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline
243 fi
244 unset_receipt
245 rm -rf $tmpdir
246 }
248 # convert a .tgz package to .tazpkg
249 # Usage: convert_tgz $package_file
250 convert_tgz() {
251 local package_file=$1
252 local package=$(basename $package_file)
254 # Set package to current args
255 IFS='-'
256 set -- $package
257 unset IFS
259 local PACKAGE=$1
260 local VERSION=$2
261 local file="$tmpdir/$PACKAGE-$VERSION"
262 local receipt="$file/receipt"
263 local fs="$file/fs"
265 # Extract package
266 mkdir -p $fs
267 tar xzf $package_file -C $fs
269 if [ -d $fs/install ]; then
270 # Set other receipt vars
271 SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \
272 head -1 | sed 's/.*(\(.*\)).*/\1/')
273 WEB_SITE="http://www.slackware.com/packages/"
274 MAINTAINER="nobody@slitaz.org"
276 DEPENDS=$(find_depends $fs)
277 generate_receipt $receipt $package_file
279 show_unresolved_lib $receipt
281 # post_install function from doinst.sh
282 if [ -f $fs/install/doinst.sh ]; then
283 cat >> $receipt <<EOM
285 post_install()
286 {
287 chroot \$1/ sh - << EOT
288 cd /
289 $(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
290 EOT
291 }
292 EOM
293 fi
295 # Get full description
296 if [ ! -z "$SHORT_DESC" ]; then
297 grep ^$PACKAGE $fs/install/slack-desc | \
298 sed "s/^$PACKAGE://" > $file/description.txt
299 fi
301 rm -rf $fs/install
303 cd $tmpdir
304 tazpkg pack $file
305 cd - /dev/null
307 mv $file.tazpkg .
308 else
309 eval_gettext "\$package_file does not look like a Slackware package !"; newline
310 fi
311 rm -rf $tmpdir
312 }
314 # convert a .deb package to .tazpkg
315 # Usage: convert_deb $package_file
316 convert_deb() {
317 local $package_file="$1"
319 # Extract deb control
320 mkdir -p $tmpdir
321 dpkg-deb -e $package_file $tmpdir
324 # filter control file for variable
325 # Usage: filter_vars $search_var
326 filter_vars() {
327 local var=$1
328 local result=$(grep '^ *$var:' $tmpdir/control)
329 echo ${result##*:}
330 }
332 PACKAGE=$(filter_vars "Package")
333 VERSION=$(filter_vars "Version")
334 SHORT_DESC=$(filter_vars "Description")
335 WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE"
336 MAINTAINER="nobody@slitaz.org"
337 target="$(grep ^Architecture $tmpdir/control | sed 's/.*: //')"
339 case "$target" in
340 i386|all)
341 local file="$tmpdir/$PACKAGE-$VERSION"
342 local receipt="$file/receipt"
343 local fs="$file/fs"
345 # Extract deb contents
346 mkdir -p $fs
347 dpkg-deb -x $package_file $fs
349 DEPENDS=$(find_depends $fs)
350 generate_receipt $receipt $package_file
352 if [ -s $tmpdir/conffiles ]; then
353 cat >> $receipt <<EOT
354 CONFIG_FILES="$(cat $tmpdir/conffiles)"
355 EOT
356 fi
358 show_unresolved_lib $file/receipt
360 # Description.txt
361 [ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/Description.txt
363 cd $tmpdir
364 tazpkg pack $file
365 cd - > /dev/null
367 mv $file.tazpkg .
368 ;;
369 *)
370 gettext "Invalid target: $target (expected i386 or all)"; newline
371 ;;
372 esac
373 rm -rf $tmpdir
374 }
376 # convert a .rpm package to .tazpkg
377 # Usage: convert_rpm $package_file
378 convert_rpm() {
379 local package_file=$1
381 # Move package_file to tmp
382 mkdir -p $tmpdir
383 cp $package_file $tmpdir
384 package_file=$tmpdir/$(basename $package_file)
386 # filter package_file for variable
387 # Usage: filter_vars $search_var
388 filter_vars() {
389 local var=$1
390 echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}')
391 }
393 PACKAGE=$(filter_vars "Name")
394 VERSION=$(filter_vars "Version")
395 SHORT_DESC=$(filter_vars "Summary")
396 WEB_SITE=$(filter_vars "URL")
397 if [ -z "$WEB_SITE" ]; then
398 WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE"
399 fi
400 CATEGORY="misc";
401 MAINTAINER="nobody@slitaz.org";
404 local file="$tmpdir/$PACKAGE-$VERSION"
405 local receipt="$file/receipt"
406 local fs="$file/fs"
408 mkdir -p $fs
410 rpm -qip $package_file | \
411 grep "^Description*" -A 100 | \
412 grep -v "^Description*" > \
413 $file/description.txt
415 cd $fs
416 rpm2cpio $package_file | cpio -idm --quiet
417 cd - > /dev/null
420 DEPENDS=$(find_depends $fs)
421 generate_receipt $receipt $package_file
423 show_unresolved_lib $receipt
425 cd $tmpdir
426 tazpkg pack $file
427 cd -
429 mv $file.tazpkg .
431 unset_receipt
432 rm -rf $tmpdir
433 }
436 #
437 # Commands and exit
438 #
440 case "$1" in
441 ""|*usage|*help) usage ;;
442 esac
444 #
445 # Handle packages: package package.tazpkg ... packageN packageN.tazpkg
446 #
448 check_root
450 for pkg in $@
451 do
452 if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ];
453 then
454 convert_deb $pkg
455 else
456 case "$pkg" in
457 *.deb|*.udeb)
458 convert_deb $pkg;;
459 *.rpm)
460 convert_rpm $pkg;;
461 *.tgz)
462 convert_tgz $pkg;;
463 *.apk|*.pkg.tar.gz)
464 convert_arch $pkg;;
465 *.ipk|*.opk)
466 convert_ipk $pkg;;
467 *)
468 gettext "Unsupported format"; newline;;
469 esac
470 fi
471 done
473 exit 0