tazpkg view tazpkg @ rev 694

Code reformatting: use '_' and '_n' gettext functions, split solid "text" into "chapters" and "paragraphs", tiny misc.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon Dec 01 01:06:57 2014 +0200 (2014-12-01)
parents c82b727d2012
children 52d1418d89d7
line source
1 #!/bin/sh
2 #
3 # TazPKG - Tiny autonomous zone packages manager.
4 #
5 # This is a lightweight packages manager for *.tazpkg files written in SHell
6 # script. It works well with Busybox ash shell and bash. TazPKG lets you
7 # list, install, remove, download or get information about a package. You
8 # can use 'tazpkg usage' to get a list of commands with short descriptions.
9 # TazPKG also resolves dependencies and can upgrade packages from a mirror.
10 #
11 # (C) 2007-2014 SliTaz - GNU General Public License v3.
12 #
13 # Authors: See the AUTHORS files
14 #
16 ####################
17 # Script variables #
18 ####################
20 # TazPKG version
21 VERSION=5.3.2
23 . /etc/slitaz/slitaz.conf
24 . /etc/slitaz/tazpkg.conf
26 . /lib/libtaz.sh
27 . /usr/lib/slitaz/libpkg.sh
29 # Internationalization.
30 #. /usr/bin/gettext.sh
31 export TEXTDOMAIN='tazpkg'
34 #
35 # Functions set for translate categories
36 #
39 # No operations, only for xgettext collect
41 gettext_noop() {
42 _ 'base-system'; _ 'x-window'; _ 'utilities'; _ 'network'; _ 'graphics';
43 _ 'multimedia'; _ 'office'; _ 'development'; _ 'system-tools'; _ 'security';
44 _ 'games'; _ 'misc'; _ 'meta'; _ "non-free"
45 }
48 # Make array of pre-translated categories
50 cat_i18n=""
51 for c in "base-system" "x-window" "utilities" "network" "graphics" "multimedia" "office" "development" "system-tools" "security" "games" "misc" "meta" "non-free"; do
52 cat_i18n="$cat_i18n
53 $(gettext "$c") $c"
54 done
57 # If category is not one of those translated in native language, keep it
58 # untranslated. This allows both native and english language support.
59 # This also supports custom categories.
60 # And now we support spaces in translated categories
62 reverse_translate_category()
63 {
64 echo "$cat_i18n" | awk "BEGIN{FS=\" \"}{if (/^$@ /) a=\$2}END{if (a==\"\") a=\"$@\"; print a}"
65 }
69 #
70 # TazPKG output functions
71 #
74 # Print localized title
76 title() { newline; boldify "$(eval_gettext "$1")"; separator; }
79 # Print footer
81 footer() { separator; echo "$1"; [ -n "$1" ] && newline; }
84 # Print current action in brown color (separate from any other msgs)
86 action() {
87 case $output in
88 raw|gtk|html) eval_gettext "$@" ;;
89 *) echo -ne "\033[0;33m"$(eval_gettext "$@")"\033[0m" ;;
90 esac
91 }
94 # Initialize some variables to use words rather than numbers for functions
95 # and actions.
96 COMMAND=$1
97 PACKAGE=${2%/}
98 PACKAGE_DIR="$(cd $(dirname $PACKAGE 2>/dev/null) 2>/dev/null; pwd)"
99 [ -n "$PACKAGE" ] && PACKAGE_FILE="$PACKAGE_DIR/${PACKAGE##*/}"
100 if [ -f "$PACKAGE" ]; then
101 # Set pkg basename for install, extract
102 PACKAGE=$(basename $PACKAGE .tazpkg 2>/dev/null)
103 else
104 # Pkg name for remove, search and all other cmds
105 PACKAGE=${PACKAGE%.tazpkg}
106 fi
107 TARGET_DIR=$3
108 TOP_DIR=$(pwd)
109 TMP_DIR=/tmp/$RANDOM
110 INSTALL_LIST=""
111 SAVE_CACHE_DIR="$CACHE_DIR"
113 # Path to tazpkg used dir and configuration files
114 MIRROR=$LOCALSTATE/mirror
115 BLOCKED=$LOCALSTATE/blocked-packages.list
116 UP_LIST=$LOCALSTATE/packages.up
117 DEFAULT_MIRROR="$ONLINE_PKGS"
119 # Need by check_depends
120 TMPLOCALSTATE=
124 ####################
125 # Script functions #
126 ####################
129 # Print the usage.
131 usage () {
132 cat << EOT
134 $(_ 'SliTaz package manager - Version:') $(colorize 34 $VERSION)
136 $(boldify "$(_ 'Usage:')")
137 $(_ 'tazpkg [command] [package|dir|pattern|list|cat|--opt] [dir|--opt]')
139 $(boldify "$(_ 'SHell:')") tazpkg shell
141 $(boldify "$(_ 'Commands:')")
142 usage $(_ 'Print this short usage')
143 bugs $(_ 'Show known bugs in packages')
144 activity|-a $(_ 'Show TazPKG activity log')
145 list|-l $(_ 'List installed packages on the system by category or all')
146 list-mirror|-lm $(_ 'List all available packages on the mirror (--diff for new)')
147 info $(_ 'Print information about a package')
148 desc $(_ 'Print description of a package (if it exists)')
149 list-files|-lf $(_ 'List the files installed with a package')
150 list-config $(_ 'List the configuration files')
151 search|-s $(_ 'Search for a package by pattern or name (options: -i|-l|-m)')
152 search-pkgname $(_ 'Search on mirror for package having a particular file')
153 search-file|-sf $(_ 'Search for file(s) in all installed packages files')
154 install|-i $(_ 'Install a local (*.tazpkg) package (--forced to force)')
155 install-list $(_ 'Install all packages from a list of packages.')
156 remove|-r $(_ 'Remove the specified package and all installed files')
157 extract|-e $(_ 'Extract a (*.tazpkg) package into a directory')
158 pack $(_ 'Pack an unpacked or prepared package tree')
159 recharge $(_ 'Recharge your packages.list from the mirror')
160 up|help-up $(_ 'Check packages $CHECKSUM to list and install latest upgrades')
161 repack $(_ 'Create a package archive from an installed package')
162 repack-config $(_ 'Create a package archive with configuration files')
163 recompress $(_ 'Rebuild a package with a better compression ratio')
164 block|unblock $(_ 'Block an installed package version or unblock it for upgrade')
165 get $(_ 'Download a package into the current directory')
166 get-install|-gi $(_ 'Download and install a package from the mirror')
167 get-install-list $(_ 'Download and install a list of packages from the mirror')
168 check $(_ 'Verify consistency of installed packages')
169 add-flavor $(_ 'Install the flavor list of packages')
170 install-flavor $(_ 'Install the flavor list of packages and remove other ones')
171 set-release $(_ 'Change release and update packages')
172 clean-cache|-cc $(_ 'Clean all packages downloaded in cache directory')
173 depends $(_ 'Display dependencies tree')
174 rdepends $(_ 'Display reverse dependencies tree')
175 convert $(_ 'Convert deb/rpm/tgz/pet/sfs/sb/arch/ipk package to tazpkg)')
176 link $(_ 'Link a package from another slitaz installation')
177 setup-mirror|-sm $(_ 'Change the mirror url configuration')
178 list-undigest $(_ 'List undigest mirrors')
179 remove-undigest $(_ 'Remove an undigest mirror')
180 add-undigest $(_ 'Add an undigest mirror')
181 setup-undigest $(_ 'Update an undigest mirror')
182 reconfigure $(_ 'Replay post install script from package')
184 EOT
185 }
188 usage_up() {
189 cat << EOT
190 $(emsg "<b>$(_ 'Usage for command up:')</b>") tazpkg up [$(_ 'option')]
192 * $(_ 'Without options run in interactive mode and ask before install')
194 $(boldify "$(_ 'Where options are:')")
195 --check |-c $(_ 'Check only for available upgrades')
196 --recharge |-r $(_ 'Force recharge of packages list and check')
197 --install |-i $(_ 'Check for upgrades and install them all')
199 $(boldify "$(_ 'Example:')")
200 tazpkg up --recharge --install
201 tazpkg up -c -r
202 EOT
203 }
206 # Check if dir exists
208 check_dir()
209 {
210 if ! [ -d "$1" ]; then
211 FOLDER=$1
212 action 'Creating $FOLDER...'
213 mkdir -p "$FOLDER"
214 status
215 return 1
216 fi
217 }
220 # Check if the directories and files used by TazPKG
221 # exist. If not and user is root we create them.
223 check_base_dir()
224 {
225 if [ "$(id -u)" = "0" ]; then
226 check_dir $1$CACHE_DIR
227 check_dir $1$INSTALLED
228 check_dir $1$SLITAZ_LOGS
229 if [ ! -f "$1$LOCALSTATE/mirror" ]; then
230 echo "${DEFAULT_MIRROR%/}/" > $1$LOCALSTATE/mirror
231 [ -n "$1" ] && cp $LOCALSTATE/packages.* $1$LOCALSTATE/
232 fi
233 fi
234 }
235 check_base_dir
238 # Check for a package name on cmdline.
240 check_for_package_on_cmdline()
241 {
242 if [ -z "$PACKAGE" ]; then
243 newline
244 _ 'Please specify a package name on the command line.'
245 newline
246 exit 0
247 fi
248 }
251 # Check if the package (*.tazpkg) exists before installing or extracting.
253 check_for_package_file()
254 {
255 if [ ! -f "$PACKAGE_FILE" ]; then
256 newline
257 _ 'Unable to find: $PACKAGE_FILE'
258 newline
259 exit 0
260 fi
261 }
264 # Check for the receipt of an installed package.
266 check_for_receipt()
267 {
268 receipt_path="$1$INSTALLED/$PACKAGE/receipt"
269 if [ ! -f $receipt_path ]; then
270 newline
271 _ 'Unable to find the receipt: $receipt_path'
272 newline
273 exit 0
274 fi
275 }
278 # Get repositories priority using $LOCALSTATE/priority.
279 # In this files, undigest are called by their name and main mirror
280 # by main. Sort order: priority
282 look_for_priority()
283 {
284 [ -s $LOCALSTATE/priority ] && priority=$(cat $LOCALSTATE/priority)
285 for rep in main $(ls $LOCALSTATE/undigest 2>/dev/null); do
286 if [ ! -s $LOCALSTATE/priority ] || \
287 ! grep -q ^$rep$ $LOCALSTATE/priority; then
288 priority=$(echo -e "$priority\n$rep")
289 fi
290 done
291 priority=$(echo "$priority" | sed '/^$/d' | \
292 while read line; do
293 if [ "$line" = main ]; then
294 echo $LOCALSTATE
295 else
296 echo $LOCALSTATE/undigest/$line
297 fi
298 done)
299 }
302 # Get package name in a directory
304 package_fullname_in_dir()
305 {
306 [ -f $1/receipt ] || return
307 EXTRAVERSION=""
308 . $1/receipt
309 echo $PACKAGE-$VERSION$EXTRAVERSION
310 }
313 # Get package name that is already installed.
315 get_installed_package_pathname()
316 {
317 for i in $2$INSTALLED/${1%%-*}*; do
318 [ -d $i ] || continue
319 if [ "$1" = "$(package_fullname_in_dir $i)" ]; then
320 echo $i
321 return
322 fi
323 done
324 }
327 # Check if a package is already installed.
329 check_for_installed_package()
330 {
331 if [ -n "$(get_installed_package_pathname $PACKAGE $1)" ]; then
332 newline
333 # FIXME
334 cat << EOT
335 $(colorize 34 $PACKAGE) $(_ "package is already installed.
336 You can use the --forced option to force installation.")
337 EOT
338 newline
339 exit 0
340 fi
341 }
344 # Check for packages.list to download and install packages.
346 check_for_packages_list()
347 {
348 list_path="$LOCALSTATE/packages.list"
349 if [ ! -f "$list_path" ]; then
350 if test $(id -u) = 0 ; then
351 tazpkg recharge
352 else
353 newline
354 _ 'Unable to find the list: $list_path'
355 _ \
356 "You must probably run 'tazpkg recharge' as root to get the latest list of
357 packages available on the mirror."
358 newline
359 exit 0
360 fi
361 fi
362 }
365 get_cache_dir()
366 {
367 echo $rep > $tmp/rep
368 if [ "$rep" = "$LOCALSTATE" ]; then
369 CACHE_DIR="$SAVE_CACHE_DIR/$SLITAZ_RELEASE/packages"
370 elif [ "${rep%-incoming}" = "$rep" ]; then
371 CACHE_DIR="$SAVE_CACHE_DIR/${rep##*/}/packages"
372 else
373 rep="${rep%-incoming}"
374 CACHE_DIR="$SAVE_CACHE_DIR/${rep##*/}/packages-incoming"
375 fi
376 [ -d "$CACHE_DIR" ] || mkdir -p $CACHE_DIR
377 echo $CACHE_DIR > $tmp/cachedir
378 }
381 # get an already installed package from packages.equiv
383 equivalent_pkg()
384 {
385 for i in $(grep -hs "^$1=" $LOCALSTATE/packages.equiv \
386 $LOCALSTATE/undigest/*/packages.equiv | sed "s/^$1=//"); do
387 if echo $i | fgrep -q : ; then
388 # format 'alternative:newname'
389 # if alternative is installed then substitute newname
390 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
391 # substitute package dependency
392 echo ${i#*:}
393 return
394 fi
395 else
396 # if alternative is installed then nothing to install
397 if [ -f $2$INSTALLED/$i/receipt ]; then
398 # substitute installed package
399 echo $i
400 return
401 fi
402 fi
403 done
404 # if not found in packages.equiv then no substitution
405 echo $1
406 }
409 # get a virtual package from packages.equiv
411 virtual_pkg()
412 {
413 for i in $(for rep in $priority; do
414 grep -hs "^$1=" $rep/packages.equiv
415 done | sed "s/^$1=//"); do
416 if echo $i | fgrep -q : ; then
417 # format 'alternative:newname'
418 # if alternative is installed then substitute newname
419 if [ -f $2$INSTALLED/${i%:*}/receipt ]; then
420 # substitute package dependency
421 echo ${i#*:}
422 return
423 fi
424 else
425 # unconditional substitution
426 echo $i
427 return
428 fi
429 done
430 }
433 # Get package filename available on the mirror
435 get_package_filename()
436 {
437 local pkg
438 for rep in $priority; do
439 pkg=$(grep -A 1 -sh "^$1$" $rep/packages.txt | tail -1 | sed 's/^ *//')
440 [ "$pkg" ] && pkg=$(grep -sh "^$1-$pkg" $rep/packages.list | head -1)
442 # Allow user to call a package with his version number.
443 [ "$pkg" ] || pkg=$(grep -sh "^$1$" $rep/packages.list | head -1)
445 [ "$pkg" ] || pkg=$(grep -sh "^$1-[0-9]" $rep/packages.list | head -1)
446 [ "$pkg" ] || pkg=$(grep -sh "^$1-.[\.0-9]" $rep/packages.list | head -1)
447 [ "$pkg" ] && get_cache_dir && break
448 done
449 if [ -z "$pkg" ]; then
450 # Check for virtual package
451 local equiv
452 equiv=$(virtual_pkg $1)
453 if [ "$equiv" != "$1" ]; then
454 PACKAGE=$equiv
455 get_package_filename $PACKAGE
456 return
457 fi
458 fi
459 echo $pkg
460 }
463 # Check for a package in packages.list. Used by get and get-install to grep
464 # package basename.
466 check_for_package_in_list()
467 {
468 local filename
469 local check_only
470 check_only="$1"
471 filename=$(get_package_filename $PACKAGE)
472 if [ "$filename" ]; then
473 PACKAGE=$filename
474 CACHE_DIR=$(cat $tmp/cachedir)
475 rep=$(cat $tmp/rep)
476 rm -f $tmp/rep $tmp/cachedir
477 else
478 newline
479 _ 'Unable to find: $PACKAGE in the mirrored packages list.'
480 newline
481 [ -n "$check_only" ] && return 1
482 exit 0
483 fi
484 }
487 # Log this activity
488 # (there log_pkg because we have log() in libtaz.sh)
490 log_pkg()
491 {
492 local extra
494 [ "$1" = "Installed" ] && \
495 extra=" - $(fgrep $PACKAGE-$VERSION $LOCALSTATE/installed.$SUM | awk '{ print $1 }')"
497 [ -e $LOG ] || touch $LOG
499 [ -w $LOG ] &&
500 echo "$(date +'%F %T') - $1 - $PACKAGE ($VERSION$EXTRAVERSION)$extra" >> $LOG
501 }
504 # Download a get-package script from this mirror
506 download_get_script()
507 {
508 local p
509 for p in $priority ; do
510 local i
511 for i in $(cat $p/mirror) ; do
512 case "$i" in
513 http://*|ftp://*)
514 wget -O $2 ${i%packages/*}packages/get/$1 && return 0 ;;
515 esac
516 done
517 done
518 return 1
519 }
522 # Download a file from this mirror
524 download_from()
525 {
526 local i
527 local mirrors
528 mirrors="$1"
529 shift
530 for i in $mirrors; do
531 case "$i" in
532 # Mirror URL can have a trailing slash or not.
533 http://*|ftp://*)
534 busybox wget -c ${i%/}/$@ && break ;;
535 *)
536 ln -sf $i/$1 . && break ;;
537 esac
538 done
539 }
542 # Download a file trying all mirrors
544 download()
545 {
546 local i
547 case "$1" in
548 *.tazpkg)
549 for i in $priority ; do
550 grep -q "^${1%.tazpkg}$" $i/packages.list 2>/dev/null || continue
551 download_from "$(cat $i/mirror)" "$@" && return
552 done
553 esac
554 for i in $(cat $(for rep in $priority; do echo $rep/mirror; done) 2>/dev/null); do
555 download_from "$i" "$@" && break
556 done
557 }
560 # Extract a package with cpio and gzip/lzma.
562 extract_package()
563 {
564 action 'Extracting $PACKAGE...'
565 cpio -idm --quiet < ${PACKAGE_FILE##*/} && rm -f ${PACKAGE_FILE##*/}
566 status
567 if [ -f fs.cpio.lzma ]; then
568 unlzma -c fs.cpio.lzma | cpio -idm --quiet && rm fs.cpio.lzma
569 elif [ -f fs.cpio.gz ]; then
570 zcat fs.cpio.gz | cpio -idm --quiet && rm fs.cpio.gz
571 fi
572 }
575 remove_with_path()
576 {
577 # Avoid dirname errors by checking for argument.
578 [ "$1" ] || return
580 local dir
581 rm -f $1 2>/dev/null
582 dir="$1"
583 while [ "$dir" != "/" ]; do
584 dir="$(dirname $dir)"
585 rmdir $dir 2> /dev/null || break
586 done
587 }
590 grepesc()
591 {
592 sed 's/\[/\\[/g'
593 }
596 # This function installs a package in the rootfs.
598 install_package()
599 {
600 ROOT=$1
601 if [ -n "$ROOT" ]; then
602 # Get absolute path
603 ROOT=$(realpath $ROOT)
604 fi
605 {
606 # Create package path early to avoid dependencies loop
607 mkdir -p $TMP_DIR
608 { cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1; } < $PACKAGE_FILE
609 . $TMP_DIR/receipt
610 if grep -q ^pre_depends $TMP_DIR/receipt; then
611 pre_depends $ROOT
612 fi
614 # Keep modifiers and file list on upgrade
615 cp $ROOT$INSTALLED/$PACKAGE/modifiers \
616 $ROOT$INSTALLED/$PACKAGE/files.list $TMP_DIR 2> /dev/null
617 rm -rf $ROOT$INSTALLED/$PACKAGE 2> /dev/null
619 # Make the installed package data dir to store
620 # the receipt and the files list.
621 mkdir -p $ROOT$INSTALLED/$PACKAGE
622 cp $TMP_DIR/modifiers $ROOT$INSTALLED/$PACKAGE 2> /dev/null
623 cp $TMP_DIR/files.list $ROOT$INSTALLED/$PACKAGE 2> /dev/null
624 rm -rf $TMP_DIR 2> /dev/null
625 sed -i "/ $(basename $PACKAGE_FILE)$/d" \
626 $ROOT$LOCALSTATE/installed.$SUM 2> /dev/null
627 cd $(dirname $PACKAGE_FILE)
628 $CHECKSUM $(basename $PACKAGE_FILE) >> $ROOT$LOCALSTATE/installed.$SUM
629 }
631 # Resolve package deps.
632 check_for_deps $ROOT
633 if [ -n "$MISSING_PACKAGE" ]; then
634 install_deps $ROOT
635 fi
636 mkdir -p $TMP_DIR
637 [ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $ROOT$LOCALSTATE/$INSTALL_LIST-processed
639 title 'Installation of: $PACKAGE'
641 action 'Copying $PACKAGE...'
642 cp $PACKAGE_FILE $TMP_DIR
643 status
645 cd $TMP_DIR
646 extract_package
647 SELF_INSTALL=0
648 EXTRAVERSION=""
649 CONFIG_FILES=""
651 # Include temporary receipt to get the right variables.
652 . $PWD/receipt
653 cd $ROOT$INSTALLED
655 if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
656 action "Checking post install dependencies..."
657 [ -f $INSTALLED/$PACKAGE/receipt ]
658 if ! status; then
659 command="tazpkg install $PACKAGE_FILE"
660 _ "Please run '\$command' in / and retry."
661 rm -rf $TMP_DIR
662 exit 1
663 fi
664 fi
666 # Get files to remove if upgrading
667 if [ -f $PACKAGE/files.list ]; then
668 while read file; do
669 grep -q "^$(echo $file | grepesc)$" $TMP_DIR/files.list && continue
670 for i in $(cat $PACKAGE/modifiers 2> /dev/null ;
671 fgrep -sl $PACKAGE */modifiers | cut -d/ -f1 ); do
672 grep -qs "^$(echo $file | grepesc)$" $i/files.list && continue 2
673 done
674 echo $file
675 done < $PACKAGE/files.list > $TMP_DIR/files2remove.list
676 fi
678 # Remember modified packages
679 {
680 check=false
681 for i in $(fgrep -v [ $TMP_DIR/files.list); do
682 [ -e "$ROOT$i" ] || continue
683 [ -d "$ROOT$i" ] && continue
684 echo "- $i"
685 check=true
686 done ;
687 $check && \
688 for i in *; do
689 [ "$i" == "$PACKAGE" ] && continue
690 [ -s $i/files.list ] || continue
691 awk "{ printf \"$i %s\\n\",\$1 }" < $i/files.list
692 done;
693 } | awk '
694 {
695 if ($1 == "-" || file[$2] != "") {
696 file[$2] = file[$2] " " $1
697 if ($1 != "-") {
698 if (pkg[$1] == "") all = all " " $1
699 pkg[$1] = pkg[$1] " " $2
700 }
701 }
702 }
703 END {
704 for (i = split(all, p, " "); i > 0; i--)
705 for (j = split(pkg[p[i]], f, " "); j > 0; j--)
706 printf "%s %s\n",p[i],f[j];
707 }
708 ' | while read dir file; do
709 if grep -qs ^$dir$ $PACKAGE/modifiers; then
710 # Do not overload an overloaded file !
711 rm $TMP_DIR$file 2> /dev/null
712 continue
713 fi
714 grep -qs ^$PACKAGE$ $dir/modifiers && continue
715 if [ -s "$dir/volatile.cpio.gz" ]; then
716 # We can modify backed up files without notice
717 zcat $dir/volatile.cpio.gz | cpio -t --quiet | \
718 grep -q "^${file#/}$" && continue
719 fi
720 echo "$PACKAGE" >> $dir/modifiers
721 done
723 cd $TMP_DIR
724 cp receipt files.list $ROOT$INSTALLED/$PACKAGE
726 # Copy the description if found.
727 if [ -f "description.txt" ]; then
728 cp description.txt $ROOT$INSTALLED/$PACKAGE
729 fi
731 # Copy the md5sum if found.
732 if [ -f "$CHECKSUM" ]; then
733 cp $CHECKSUM $ROOT$INSTALLED/$PACKAGE
734 fi
736 # Pre install commands.
737 if grep -q ^pre_install $ROOT$INSTALLED/$PACKAGE/receipt; then
738 pre_install $ROOT
739 fi
740 if [ -n "$CONFIG_FILES" ]; then
741 # save 'official' configuration files
742 action 'Saving configuration files for $PACKAGE...'
743 for i in $CONFIG_FILES; do
744 { cd fs ; find ${i#/} -type f 2> /dev/null; cd ..; }
745 done | { cd fs ; cpio -o -H newc --quiet | gzip -9; cd ..; } > \
746 $ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz
748 # keep user configuration files
749 for i in $CONFIG_FILES; do
750 { cd fs ; find ${i#/} -type f 2> /dev/null; cd ..; }
751 done | while read i; do
752 [ -e $ROOT/$i ] || continue
753 cp -a $ROOT/$i fs/$i
754 done
755 status
756 fi
758 action 'Installing $PACKAGE...'
759 [ "$(busybox ls fs/* 2> /dev/null)" ] && cp -a fs/* $ROOT/
760 status
762 if [ -s files2remove.list ]; then
763 action 'Removing old $PACKAGE...'
764 while read file; do
765 remove_with_path $ROOT$file
766 done < files2remove.list
767 true
768 status
769 fi
771 # Remove the temporary random directory.
772 action "Removing all tmp files..."
773 cd ..; rm -rf $TMP_DIR
774 status
776 # Post install commands.
777 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
778 post_install $ROOT
779 fi
781 # Update-desktop-database if needed.
782 if [ "$(fgrep .desktop $ROOT$INSTALLED/$PACKAGE/files.list | fgrep /usr/share/applications/)" ]; then
783 updatedesktopdb=yes
784 fi
786 # Update-mime-database if needed.
787 if [ "$(fgrep /usr/share/mime $ROOT$INSTALLED/$PACKAGE/files.list)" ]; then
788 updatemimedb=yes
789 fi
791 # Update-icon-database
792 if [ "$(fgrep /usr/share/icon/hicolor $ROOT$INSTALLED/$PACKAGE/files.list)" ]; then
793 updateicondb=yes
794 fi
796 # Compile glib schemas if needed.
797 if [ "$(fgrep /usr/share/glib-2.0/schemas $ROOT$INSTALLED/$PACKAGE/files.list)" ]; then
798 compile_schemas=yes
799 fi
801 # Update depmod list
802 if [ "$(fgrep /lib/modules $ROOT$INSTALLED/$PACKAGE/files.list)" ]; then
803 updatedepmod=yes
804 fi
806 cd $TOP_DIR
807 pkg_name="$PACKAGE ($VERSION$EXTRAVERSION)"
808 footer "$(_ '$pkg_name is installed.')"
810 # Log this activity
811 [ -n "$ROOT" ] || log_pkg Installed
812 }
815 # This function may be called by a get script.
817 abort_package()
818 {
819 cd $CUR_DIR
820 rm -rf $TMP_DIR
821 echo "${1:-Abort $PACKAGE.}"
822 exit 1
823 }
826 # This function installs a package from a get script in the rootfs.
828 install_package_from_get_script()
829 {
830 SCRIPT="$1"
831 ROOT="$2"
832 [ -d $ROOT$INSTALLED/$PACKAGE ] && exit 1
834 grep -q no-check-certificate $SCRIPT &&
835 [ ! -d $INSTALLED/wget ] && tazpkg get-install wget
837 mkdir -p $TMP_DIR && cd $TMP_DIR
838 saved=$PACKAGE
839 unset_receipt
840 PACKAGE=$saved
842 set -e
843 . $SCRIPT
844 set +e
846 if [ ! -s $PACKAGE-$VERSION/receipt ]; then
847 cat > $PACKAGE-$VERSION/receipt <<EOT
848 # SliTaz package receipt.
850 PACKAGE="$PACKAGE"
851 VERSION="${VERSION:-unknown}"
852 CATEGORY="${CATEGORY:-non-free}"
853 WEB_SITE="$WEB_SITE"
854 SHORT_DESC="${SHORT_DESC:-$PACKAGE}"
855 MAINTAINER="${MAINTAINER:-nobody@slitaz.org}"
856 EOT
857 for i in LICENSE TARBALL WGET_URL CONFIG_FILES SUGGESTED \
858 PROVIDE DEPENDS HOST_ARCH TAGS ; do
859 eval "[ -n \"\$$i\" ] && echo \"$i=\\\"\$$i\\\"\""
860 done >> $PACKAGE-$VERSION/receipt
861 fi
863 DEPENDS="$(unset DEPENDS; . $PACKAGE-$VERSION/receipt ; echo $DEPENDS)"
864 for i in $(find_depends $PACKAGE-$VERSION/fs); do
865 case " $DEPENDS " in
866 *\ $i\ *) continue;;
867 esac
868 grep -q '^DEPENDS="' $PACKAGE-$VERSION/receipt ||
869 echo 'DEPENDS=""' >> $PACKAGE-$VERSION/receipt
870 sed -i "s/^DEPENDS=\"/&$i /" $PACKAGE-$VERSION/receipt
871 done
873 tazpkg pack $PACKAGE-$VERSION
875 # Clean to save RAM memory before installation
876 rm -rf $PACKAGE-$VERSION
878 # Install pseudo package
879 tazpkg install $PACKAGE-$VERSION.tazpkg --root=$ROOT
880 mv $PACKAGE-$VERSION.tazpkg $CACHE_DIR
882 # Clean
883 cd $TOP_DIR
884 rm -rf $TMP_DIR
885 }
888 # Check for loop in deps tree.
890 check_for_deps_loop()
891 {
892 local list
893 local pkg
894 local deps
895 pkg=$1
896 shift
897 [ -n "$1" ] || return
898 list=""
900 # Filter out already processed deps
901 for i in $@; do
902 case " $ALL_DEPS" in
903 *\ $i\ *);;
904 *) list="$list $i";;
905 esac
906 done
907 ALL_DEPS="$ALL_DEPS$list "
908 for i in $list; do
909 [ -f $i/receipt ] || continue
910 deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
911 case " $deps " in
912 *\ $pkg\ *) echo -e "$MSG $i"; MSG="";;
913 *) check_for_deps_loop $pkg $deps;;
914 esac
915 done
916 }
919 # Check for missing deps listed in a receipt packages.
921 check_for_deps()
922 {
923 local saved;
924 saved=$PACKAGE
925 mkdir -p $TMP_DIR
926 { cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1; } < $PACKAGE_FILE
927 . $TMP_DIR/receipt
928 PACKAGE=$saved
929 rm -rf $TMP_DIR
931 num=0
932 for pkgorg in $DEPENDS; do
933 i=$(equivalent_pkg $pkgorg $1)
934 if [ ! -d "$1$INSTALLED/$i" ]; then
935 MISSING_PACKAGE=$i
936 num=$(($num+1))
937 elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
938 _ 'WARNING Dependency loop between $PACKAGE and $i.'
939 fi
940 done
942 if [ ! "$MISSING_PACKAGE" = "" ]; then
943 title "$(_ 'Tracking dependencies for: $PACKAGE')"
944 for pkgorg in $DEPENDS; do
945 i=$(equivalent_pkg $pkgorg $1)
946 if [ ! -d "$1$INSTALLED/$i" ]; then
947 MISSING_PACKAGE=$i
948 _ 'Missing: $MISSING_PACKAGE'
949 fi
950 done
951 separator
952 eval_ngettext \
953 '$num missing package to install.' \
954 '$num missing packages to install.' $num; echo
955 fi
956 }
959 # Install all missing deps. Auto install or ask user then install all missing
960 # deps from local dir, cdrom, media or from the mirror. In case we want to
961 # install packages from local, we need a packages.list to find the version.
963 install_deps()
964 {
965 local root
966 root=""
967 [ -n "$1" ] && root="--root=$1"
968 if [ "$AUTO_INSTALL_DEPS" == "yes" ]; then
969 answer=0
970 else
971 newline
972 _n 'Install all missing dependencies'; confirm
973 answer=$?
974 newline
975 fi
976 if [ $answer = 0 ]; then
977 for pkgorg in $DEPENDS; do
978 pkg=$(equivalent_pkg $pkgorg $1)
979 if [ ! -d "$1$INSTALLED/$pkg" ]; then
980 local list
981 list="$INSTALL_LIST"
982 [ -n "$list" ] || list="$TOP_DIR/packages.list"
983 # We can install packages from a local dir by greping
984 # the TAZPKG_BASENAME in the local packages.list.
985 found=0
986 if [ -f "$list" ]; then
987 _ 'Checking if $pkg exists in local list...'
988 mkdir $TMP_DIR
989 for i in $pkg-*.tazpkg; do
990 [ -f $i ] || continue
991 { cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1; } < $i
992 [ "$(. $TMP_DIR/receipt; echo $PACKAGE)" = "$pkg" ] || continue
993 if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
994 then
995 found=1
996 tazpkg install $i $root --list=$list
997 break
998 fi
999 done
1000 rm -rf $TMP_DIR
1001 fi
1002 # Install deps from the mirror.
1003 if [ $found -eq 0 ]; then
1004 if [ ! -f "$LOCALSTATE/packages.list" ]; then
1005 tazpkg recharge
1006 fi
1007 tazpkg get-install $pkg $root
1008 fi
1009 fi
1010 done
1011 else
1012 newline
1013 _ \
1014 "Leaving dependencies for \$PACKAGE unresolved.
1015 The package is installed but will probably not work."
1016 newline
1017 fi
1021 # Search pattern in installed packages.
1023 search_in_installed_packages()
1025 _ 'Installed packages'
1026 separator
1027 list=`ls -1 $INSTALLED | grep -i "$PATTERN"`
1028 num=0
1029 for pkg in $list; do
1030 EXTRAVERSION=""
1031 [ -f $INSTALLED/$pkg/receipt ] || continue
1032 . $INSTALLED/$pkg/receipt
1033 emsg "$PACKAGE<i 24> $VERSION$EXTRAVERSION<i 42> $(_n $CATEGORY)"
1034 num=$(($num+1))
1035 done
1037 # Set correct ending messages.
1038 if [ x$num == x ]; then
1039 _ 'No installed packages found for: $PATTERN'
1040 newline
1041 else
1042 footer "$(eval_ngettext \
1043 '$num installed package found for: $PATTERN' \
1044 '$num installed packages found for: $PATTERN' $num)"
1045 fi
1049 # Search in packages.list for available pkgs.
1051 search_in_packages_list()
1053 _ 'Available packages name-version'
1054 separator
1055 num=0
1056 BPATTERN="$(emsg "<b>$PATTERN</b>")"
1057 for i in $LOCALSTATE/packages.list $LOCALSTATE/undigest/*/packages.list; do
1058 grep -is "$PATTERN" $i | sed "s|$PATTERN|$BPATTERN|"
1059 num=$(($num + `grep -is "$PATTERN" $i | wc -l`))
1060 done
1061 if [ ! -f "$LOCALSTATE/packages.list" ]; then
1062 newline
1063 _ \
1064 "No 'packages.list' found to check for mirrored packages. For more results,
1065 please run 'tazpkg recharge' once as root before searching."
1066 newline
1067 fi
1068 if [ "$num" = "0" ]; then
1069 _ 'No available packages found for: $PATTERN'
1070 newline
1071 else
1072 footer "$(eval_ngettext \
1073 '$num available package found for: $PATTERN' \
1074 '$num available packages found for: $PATTERN' $packages)"
1075 fi
1079 # search --mirror: Search in packages.txt for available pkgs and give more
1080 # info than --list or default.
1082 search_in_packages_txt()
1084 _ 'Matching packages name with version and desc'
1085 separator
1086 num=0
1087 for i in $LOCALSTATE/packages.txt $LOCALSTATE/undigest/*/packages.txt; do
1088 grep -is -A 2 "^$PATTERN" $i
1089 num=$(($num + `grep -is "^$PATTERN" $i | wc -l`))
1090 done
1091 if [ ! -f "$LOCALSTATE/packages.txt" ]; then
1092 newline
1093 _ \
1094 "No 'packages.txt' found to check for mirrored packages. For more results,
1095 please run 'tazpkg recharge' once as root before searching."
1096 newline
1097 fi
1098 if [ "$num" = "0" ]; then
1099 _ 'No available packages found for: $PATTERN'
1100 newline
1101 else
1102 footer "$(eval_ngettext \
1103 '$num available package found for: $PATTERN' \
1104 '$num available packages found for: $PATTERN' $packages)"
1105 fi
1109 # Install package-list from a flavor
1111 install_flavor()
1113 check_root $@
1115 # Get repositories priority list.
1116 look_for_priority
1118 FLAVOR=$1
1119 ARG=$2
1120 mkdir -p $TMP_DIR
1121 [ -f $FLAVOR.flavor ] && cp $FLAVOR.flavor $TMP_DIR
1122 cd $TMP_DIR
1123 if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
1124 zcat < $FLAVOR.flavor | cpio --quiet -i >/dev/null
1126 while read file; do
1127 for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
1128 [ -f $pkg/receipt ] || continue
1129 EXTRAVERSION=""
1130 . $pkg/receipt
1131 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && break
1132 done
1133 [ "$PACKAGE-$VERSION$EXTRAVERSION" = "$file" ] && continue
1134 cd $CACHE_DIR
1135 download $file.tazpkg
1136 cd $TMP_DIR
1137 tazpkg install $CACHE_DIR/$file.tazpkg --forced
1138 done < $FLAVOR.pkglist
1140 [ -f $FLAVOR.nonfree ] && while read pkg; do
1141 [ -d $INSTALLED/$pkg ] || continue
1142 [ -d $INSTALLED/get-$pkg ] && tazpkg get-install get-$pkg
1143 get-$pkg
1144 done < $FLAVOR.nonfree
1146 [ "$ARG" == "--purge" ] && for pkg in $(ls $INSTALLED); do
1147 [ -f $INSTALLED/$pkg/receipt ] || continue
1148 EXTRAVERSION=""
1149 . $INSTALLED/$pkg/receipt
1150 grep -q ^$PACKAGE-$VERSION$EXTRAVERSION$ $FLAVOR.pkglist && continue
1151 grep -qs ^$PACKAGE$ $FLAVOR.nonfree && continue
1152 tazpkg remove $PACKAGE
1153 done
1154 else
1155 _ "Can't find flavor \$FLAVOR. Abort."
1156 fi
1157 cd $TOP_DIR
1158 rm -rf $TMP_DIR
1162 # Update mirror urls
1164 setup_mirror()
1166 # Backup old list.
1167 if [ -f "$1/mirror" ]; then
1168 cp -f $1/mirror $1/mirror.bak
1169 fi
1170 title 'Current mirror(s)'
1171 echo " `cat $1/mirror 2> /dev/null`"
1172 _ \
1173 "Please enter URL of the new mirror (http, ftp or local path). You must specify
1174 the complete address to the directory of the packages and packages.list file."
1175 newline
1176 _n 'New mirror(s) URL: '
1177 NEW_MIRROR_URL=$2
1178 if [ -n "$NEW_MIRROR_URL" ]; then
1179 echo $NEW_MIRROR_URL
1180 else
1181 read NEW_MIRROR_URL
1182 fi
1183 if [ "$NEW_MIRROR_URL" = "" ]; then
1184 _ 'Nothing has been changed.'
1185 else
1186 _ 'Setting mirror(s) to: $NEW_MIRROR_URL'
1187 rm -f $1/mirror
1188 for i in $NEW_MIRROR_URL; do
1189 echo "${i%/}/" >> $1/mirror
1190 done
1191 fi
1192 newline
1196 # recursive dependencies scan
1198 dep_scan()
1200 for i in $1; do
1201 case " $ALL_DEPS " in
1202 *\ $i\ *) continue;;
1203 esac
1204 ALL_DEPS="$ALL_DEPS $i"
1205 [ -n "$2" ] && echo "$2$i ($(fgrep -A 3 $i $LOCALSTATE/packages.txt | \
1206 tail -1 | sed 's/.*(\([^ ]*\).*/\1/'))"
1207 [ -f $i/receipt ] || continue
1208 DEPENDS=""
1209 . $i/receipt
1210 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
1211 done
1215 # recursive reverse dependencies scan
1217 rdep_scan()
1219 SEARCH=$1
1221 for i in * ; do
1222 DEPENDS=""
1223 . $i/receipt
1224 echo "$i $(echo $DEPENDS)"
1225 done | busybox awk -v search=$SEARCH '
1226 function show_deps(deps, all_deps, pkg, space)
1228 if (all_deps[pkg] == 1) return
1229 all_deps[pkg] = 1
1230 if (space != "") printf "%s %s\n",space,pkg
1231 for (i = 1, n = split(deps[pkg], mydeps, " "); i <= n; i++) {
1232 show_deps(deps, all_deps, mydeps[i],"==" space)
1237 all_deps[$1] = 0
1238 for (i = 2; i <= NF; i++)
1239 deps[$i] = deps[$i] " " $1
1242 END {
1243 show_deps(deps, all_deps, search, "")
1245 ' | while read spc pkg; do
1246 echo -n $spc | sed 's/=/ /g'
1247 echo -n $pkg
1248 echo -n ' ('
1249 fgrep -A 3 $pkg $LOCALSTATE/packages.txt | tail -1 | \
1250 sed 's/.*(\([^ ]*\).*/\1)/'
1251 done
1255 # Check for ELF file
1257 is_elf()
1259 [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ]
1263 # Print shared library dependencies
1265 ldd()
1267 LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $1 2> /dev/null
1271 # search dependencies for files in $TMP_DIR/$file/fs
1273 find_depends()
1275 DEFAULT_DEPENDS="glibc-base gcc-lib-base"
1277 [ -n "$TMPLOCALSTATE" ] || TMPLOCALSTATE=$LOCALSTATE
1278 [ -f $TMPLOCALSTATE/files.list.lzma ] || tazpkg recharge > /dev/null
1279 for i in $TMPLOCALSTATE/files.list.lzma \
1280 $TMPLOCALSTATE/undigest/*/files.list.lzma ; do
1281 [ -f $i ] && lzma d $i -so >> $TMP_DIR/files.list
1282 done
1284 find ${1:-$TMP_DIR/$file/fs} -type f | \
1285 while read chkfile ; do
1286 is_elf $chkfile || continue
1287 case "$chkfile" in
1288 *.o|*.ko|*.ko.gz) continue;;
1289 esac
1291 ldd $chkfile | \
1292 while read lib rem; do
1293 case "$lib" in
1294 statically|linux-gate.so*|ld-*.so|*/ld-*.so) continue;;
1295 esac
1296 find ${1:-$TMP_DIR/$file/fs} | grep -q /$lib$ && continue
1298 for dep in $(fgrep $lib files.list | cut -d: -f1); do
1299 case " $DEFAULT_DEPENDS " in
1300 *\ $dep\ *) continue 2;;
1301 esac
1302 grep -qs "^$dep$" $TMP_DIR/depends && continue 2
1303 done
1305 if [ -n "$dep" ]; then
1306 echo "$dep" >> $TMP_DIR/depends
1307 else
1308 grep -qs ^$lib$ $TMP_DIR/unresolved ||
1309 echo "$lib" >> $TMP_DIR/unresolved
1310 fi
1311 done
1312 done
1314 spc=""
1315 sort < $TMP_DIR/depends 2> /dev/null | uniq | \
1316 while read file; do
1317 echo -n "$spc$file"
1318 spc=" "
1319 done
1323 show_unresolved_lib()
1325 if [ -s $TMP_DIR/unresolved ]; then
1326 echo -e "BUGS=\"`gettext \"No dependency for\"`" >> $1
1327 sort < $TMP_DIR/unresolved | uniq | \
1328 while read file; do
1329 _ 'WARNING: unknown dependency for $lib'
1330 echo -n " $file" >> $1
1331 done
1332 echo "\"" >> $1
1333 fi
1337 # convert a .tar.bz2 package to .tazpkg
1339 convert_upkg()
1341 mkdir -p $TMP_DIR/fs
1342 tar xjf $PACKAGE_FILE -C $TMP_DIR/fs
1343 if [ -d $TMP_DIR/fs/var/lib/upkg/packages ]; then
1344 cd $TMP_DIR
1345 package="$(sed '/^Package:/!d;s/.*: //' fs/var/lib/upkg/packages/*.info)"
1346 version="$(sed '/^Version:/!d;s/.*: //' fs/var/lib/upkg/packages/*.info)"
1347 url="http://www.paldo.org/"
1348 file=$package-$version
1349 mkdir $file
1350 mv fs $file
1351 maintainer=nobody@slitaz.org
1352 descrip="$package package from paldo."
1353 cat > $file/receipt <<EOT
1354 # SliTaz package receipt.
1355 # generated by tazpkg from package $(basename $PACKAGE_FILE)
1356 PACKAGE="$package"
1357 VERSION="$version"
1358 CATEGORY="misc"
1359 SHORT_DESC="$descrip"
1360 WEB_SITE="$url"
1361 MAINTAINER="$maintainer"
1362 DEPENDS="$(find_depends)"
1363 EOT
1364 [ -s $file/var/lib/upkg/files/*.config.bz2 ] &&
1365 cat >> $file/receipt <<EOT
1366 CONFIG_FILES="$(bzcat $file/var/lib/upkg/files/*.config.bz2)"
1367 EOT
1368 while read ext func ; do
1369 [ -s $file/fs/var/lib/upkg/scripts/*.$ext ] || continue
1370 cat >> $file/receipt <<EOT
1372 $func()
1374 $(cat $file/fs/var/lib/upkg/scripts/*.$ext)
1376 EOT
1377 done <<EOT
1378 prerm pre_remove
1379 EOT
1381 tazpkg pack $file
1382 mv $TMP_DIR/$file.tazpkg $TOP_DIR
1383 else
1384 _ '$PACKAGE_FILE does not look like an upkg package!'
1385 fi
1386 cd $TOP_DIR
1387 rm -rf $TMP_DIR
1391 # convert a .spack package to .tazpkg
1393 convert_spack()
1395 mkdir -p $TMP_DIR
1396 ( cd $TMP_DIR ; cpio -i ) < $PACKAGE_FILE
1397 cd $TMP_DIR
1398 package="$(sed '$!d;s/:.*//' about.txt)"
1399 version="$(basename $PACKAGE_FILE | sed "s/$package-\([^-]*\).*/\1/")"
1400 descrip="$(sed '$!d;s/.*: //' about.txt)"
1401 url="http://0linux.org/"
1402 maintainer=nobody@slitaz.org
1403 file=$package-$version
1404 mkdir -p $file/fs
1405 xzcat files.xz | ( cd $file/fs ; cpio -idmu )
1406 cat > $file/receipt <<EOT
1407 # SliTaz package receipt.
1408 # generated by tazpkg from package $(basename $PACKAGE_FILE)
1409 PACKAGE="$package"
1410 VERSION="$version"
1411 CATEGORY="misc"
1412 SHORT_DESC="$descrip"
1413 WEB_SITE="$url"
1414 MAINTAINER="$maintainer"
1415 DEPENDS="$(find_depends)"
1416 EOT
1417 [ -s pre-install.sh ] && cat >> $file/receipt <<EOT
1419 pre_install()
1421 cd /
1422 $(sed 1d pre-install.sh)
1424 EOT
1425 [ -s post-install.sh ] && cat >> $file/receipt <<EOT
1427 post_install()
1429 cd /
1430 $(sed '1,/^}/d' post-install.sh)
1432 EOT
1433 tazpkg pack $file
1434 cd $TOP_DIR
1435 mv $TMP_DIR/$file.tazpkg .
1436 rm -rf $TMP_DIR
1440 # convert a .ipk package to .tazpkg
1442 convert_ipk()
1444 mkdir -p $TMP_DIR
1445 tar xOzf $PACKAGE_FILE ./control.tar.gz | tar xzf - -C $TMP_DIR
1446 package="$(grep ^Package $TMP_DIR/control | sed 's/.*: //')"
1447 version="$(grep ^Version $TMP_DIR/control | sed 's/.*: //')"
1448 maintainer="$(grep ^Maintainer $TMP_DIR/control | sed 's/.*: //')"
1449 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
1450 descrip="$(grep ^Description $TMP_DIR/control | sed 's/.*: //')"
1451 url="http://openwrt.org/"
1452 case "$target" in
1453 i386|all)
1454 file=$package-$version
1455 mkdir -p $TMP_DIR/$file/fs
1456 tar xOzf $PACKAGE_FILE ./data.tar.gz | tar xzf - -C $TMP_DIR/$file/fs
1457 cd $TMP_DIR
1458 cat > $file/receipt <<EOT
1459 # SliTaz package receipt.
1460 # generated by tazpkg from package $(basename $PACKAGE_FILE)
1461 PACKAGE="$package"
1462 VERSION="$version"
1463 CATEGORY="misc"
1464 SHORT_DESC="$descrip"
1465 WEB_SITE="$url"
1466 MAINTAINER="$maintainer"
1467 DEPENDS="$(find_depends)"
1468 EOT
1469 show_unresolved_lib $file/receipt
1470 [ -s conffiles ] && cat >> $file/receipt <<EOT
1471 CONFIG_FILES="$(cat conffiles)"
1472 EOT
1473 show_unresolved_lib $file/receipt
1474 while read script func; do
1475 [ -s $script ] && cat >> $file/receipt <<EOT
1477 $func()
1479 $(cat $script)
1481 EOT
1482 done <<EOT
1483 preinst pre_install
1484 postinst post_install
1485 prerm pre_remove
1486 postrm post_remove
1487 EOT
1488 awk '
1490 if (/^ / && show) print substr($0,2);
1491 else show=0;
1492 if (/^Description/) show=1;
1493 }' < $TMP_DIR/control > $file/description.txt
1494 sed -i 's/^\.$//' $file/description.txt
1495 [ -s $file/description.txt ] || rm -f $file/description.txt
1496 tazpkg pack $file
1497 cd $TOP_DIR
1498 mv $TMP_DIR/$file.tazpkg .
1499 ;;
1500 *)
1501 _ 'Invalid target: $target (expected i386)'
1502 ;;
1503 esac
1504 rm -rf $TMP_DIR
1508 # convert a .pkg.tar.gz/.pkg.tar.xz/.apk package to .tazpkg
1510 convert_arch()
1512 mkdir -p $TMP_DIR/fs
1513 busybox tar xf $PACKAGE_FILE -C $TMP_DIR/fs
1514 if [ -f $TMP_DIR/fs/.PKGINFO ]; then
1515 cd $TMP_DIR
1516 package="$(grep ^pkgname fs/.PKGINFO | sed 's/.*= //')"
1517 version="$(grep ^pkgver fs/.PKGINFO | sed 's/.*= //')"
1518 descrip="$(grep ^pkgdesc fs/.PKGINFO | sed 's/.*= //')"
1519 url="$(grep ^url fs/.PKGINFO | sed 's/.*= //')"
1520 maintainer="$(grep ^packager fs/.PKGINFO | sed 's/.*= //')"
1521 file=$package-$version
1522 mkdir $file
1523 mv fs $file
1524 cat > $file/receipt <<EOT
1525 # SliTaz package receipt.
1526 # generated by tazpkg from Archlinux package $(basename $PACKAGE_FILE)
1527 PACKAGE="$package"
1528 VERSION="$version"
1529 CATEGORY="misc"
1530 SHORT_DESC="$descrip"
1531 WEB_SITE="$url"
1532 MAINTAINER="$maintainer"
1533 DEPENDS="$(find_depends)"
1534 EOT
1535 show_unresolved_lib $file/receipt
1536 rm -f $file/fs/.[A-Z]*
1537 tazpkg pack $file
1538 mv $file.tazpkg $TOP_DIR
1539 else
1540 _ '$PACKAGE_FILE does not look like an Archlinux/Alpine package!'
1541 fi
1542 cd $TOP_DIR
1543 rm -rf $TMP_DIR
1547 # get package and version from PACKAGE_FILE
1549 parse_pkgname()
1551 package=$(basename ${2:-$PACKAGE_FILE} $1)
1552 IFS='-'
1553 set -- $package
1554 unset IFS
1555 package=$1
1556 version=$2
1557 if [ -z "$version" ]; then
1558 package=${1%%[0-9\.]*}
1559 version=${1#$package}
1560 fi
1561 file="$package-$version"
1562 mkdir $file
1566 finish_convert_puppy()
1568 rm -f fs/*.specs
1569 mv fs $file
1570 cat > $file/receipt <<EOT
1571 # SliTaz package receipt.
1572 # generated by tazpkg from puppy package $(basename $PACKAGE_FILE)
1573 PACKAGE="$package"
1574 VERSION="$version"
1575 CATEGORY="misc"
1576 SHORT_DESC="$desc"
1577 WEB_SITE="http://puppylinux.org/"
1578 MAINTAINER="nobody@slitaz.org"
1579 DEPENDS="$(find_depends)"
1580 EOT
1581 show_unresolved_lib $file/receipt
1582 for i in install uninstall ; do
1583 [ -f $file/fs/p$i.sh ] && cat >> $file/receipt <<EOM
1585 post_$i()
1587 chroot \$1/ sh - << EOT
1588 cd /
1589 $(sed -e 's/\\/\\\\/g' -e 's/\$/\\$/g' < $file/fs/p$i.sh ; rm -f $file/fs/p$i.sh)
1590 EOT
1592 EOM
1593 done
1594 sed -i 's/post_uninstall/post_remove/' $file/receipt
1595 tazpkg pack $file
1596 mv $file.tazpkg $TOP_DIR
1597 cd $TOP_DIR
1598 rm -rf $TMP_DIR
1602 # convert a .sfs package to .tazpkg
1604 convert_sfs()
1606 [ -n "$(which unsquashfs)" ] || tazpkg get-install squashfs
1607 if ! unsquashfs -l $PACKAGE_FILE | grep -q squashfs-root/pet.specs$ ; then
1608 _ '$PACKAGE_FILE does not look like a Puppy package!'
1609 return 1
1610 fi
1611 mkdir -p $TMP_DIR
1612 cd $TMP_DIR
1613 parse_pkgname .sfs
1614 unsquashfs $PACKAGE_FILE
1615 mv squashfs-root fs
1616 set -- $(cat fs/pet.specs)
1617 desc="$10"
1618 finish_convert_puppy
1622 # convert a .pet package to .tazpkg
1624 convert_pet()
1626 mkdir -p $TMP_DIR
1627 cd $TMP_DIR
1628 parse_pkgname .pet
1629 tar xzf $PACKAGE_FILE 2> /dev/null
1630 . $package*/*.specs
1631 desc="$PETMENUDESCR"
1632 mv $package*/ fs
1633 finish_convert_puppy
1637 # convert a .sb package to .tazpkg
1639 convert_sb()
1641 [ -n "$(which unsquashfs)" ] || tazpkg get-install squashfs
1642 if ! unsquashfs -l $PACKAGE_FILE | grep -q squashfs-root/var/log/removed_scripts ; then
1643 _ '$PACKAGE_FILE does not look like a Slax package!'
1644 return 1
1645 fi
1646 mkdir -p $TMP_DIR
1647 cd $TMP_DIR
1648 unsquashfs $PACKAGE_FILE
1649 mv squashfs-root fs
1650 parse_pkgname '' $(cat fs/var/log/packages/* | sed '/PACKAGE NAME:/!d;s/.*: *//')
1651 desc="$(cat fs/var/log/packages/* | sed '/^PACKAGE DESCRIPTION:/,$!d;N;s/.*: //;q')"
1652 cat fs/var/log/packages/* | sed '/^PACKAGE DESCRIPTION:/,/FILE LIST/!d;s/.*://;/^$/d' > $file/description.txt
1653 mv fs $file
1654 cat > $file/receipt <<EOT
1655 # SliTaz package receipt.
1656 # generated by tazpkg from slax package $(basename $PACKAGE_FILE)
1657 PACKAGE="$package"
1658 VERSION="$version"
1659 CATEGORY="misc"
1660 SHORT_DESC="$desc"
1661 WEB_SITE="http://www.slax.org/"
1662 MAINTAINER="nobody@slitaz.org"
1663 DEPENDS="$(find_depends)"
1664 EOT
1665 show_unresolved_lib $file/receipt
1666 [ -f $file/fs/var/log/scripts/$package* ] && cat >> $file/receipt <<EOM
1668 post_install()
1670 chroot \$1/ sh - << EOT
1671 cd /
1672 $(cat $file/fs/var/log/scripts/$package* | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
1673 EOT
1675 EOM
1676 tazpkg pack $file
1677 mv $file.tazpkg $TOP_DIR
1678 cd $TOP_DIR
1679 rm -rf $TMP_DIR
1683 # convert a .tgz package to .tazpkg
1685 convert_tgz()
1687 parse_pkgname
1688 mkdir -p $TMP_DIR/$file/fs
1689 tar xzf $PACKAGE_FILE -C $TMP_DIR/$file/fs
1690 cd $TMP_DIR
1691 if [ -d $file/fs/install ]; then
1692 descrip=$(grep ^$package $file/fs/install/slack-desc | \
1693 head -1 | sed 's/.*(\(.*\)).*/\1/')
1694 cat > $file/receipt <<EOT
1695 # SliTaz package receipt.
1696 # generated by tazpkg from slackware package $(basename $PACKAGE_FILE)
1697 PACKAGE="$package"
1698 VERSION="$version"
1699 CATEGORY="misc"
1700 SHORT_DESC="$descrip"
1701 WEB_SITE="http://www.slackware.com/packages/"
1702 MAINTAINER="nobody@slitaz.org"
1703 DEPENDS="$(find_depends)"
1704 EOT
1705 show_unresolved_lib $file/receipt
1706 [ -f $file/fs/install/doinst.sh ] && cat >> $file/receipt <<EOM
1708 post_install()
1710 chroot \$1/ sh - << EOT
1711 cd /
1712 $(sed -e 's/\\/\\\\/g' -e 's/\$/\\$/g' < $file/fs/install/doinst.sh)
1713 EOT
1715 EOM
1716 grep ^$package $file/fs/install/slack-desc | \
1717 sed "s/^$package://" > $file/description.txt
1718 [ -s $file/description.txt ] || rm -f $file/description.txt
1719 rm -rf $file/fs/install
1720 tazpkg pack $file
1721 mv $file.tazpkg $TOP_DIR
1722 else
1723 _ '$PACKAGE_FILE does not look like a Slackware package!'
1724 fi
1725 cd $TOP_DIR
1726 rm -rf $TMP_DIR
1730 # convert a .deb package to .tazpkg
1732 convert_deb()
1734 mkdir -p $TMP_DIR
1735 dpkg-deb -e $PACKAGE_FILE $TMP_DIR
1736 package=$(grep '^ *Package:' $TMP_DIR/control)
1737 package=$(echo ${package##*:})
1738 version=$(grep '^ *Version:' $TMP_DIR/control)
1739 version=$(echo ${version##*:})
1740 descrip=$(grep '^ *Description:' $TMP_DIR/control)
1741 descrip=$(echo ${descrip##*:})
1742 target="$(grep ^Architecture $TMP_DIR/control | sed 's/.*: //')"
1743 case "$target" in
1744 i386|all)
1745 file="$package-$version"
1746 mkdir -p $TMP_DIR/$file/fs/
1747 dpkg-deb -x $PACKAGE_FILE $TMP_DIR/$file/fs
1748 cd $TMP_DIR
1749 cat > $file/receipt <<EOT
1750 # SliTaz package receipt.
1751 # generated by tazpkg from debian package $(basename $PACKAGE_FILE)
1752 PACKAGE="$package"
1753 VERSION="$version"
1754 CATEGORY="misc"
1755 SHORT_DESC="$descrip"
1756 WEB_SITE="http://packages.debian.org/search?keywords=$package"
1757 MAINTAINER="nobody@slitaz.org"
1758 EOT
1759 LICENSE="$(grep /usr/share/common-licenses/ \
1760 $PACKAGE_FILE $TMP_DIR/$file/fs/usr/share/doc/*/copyright | \
1761 sed 's|.*common-licenses/\([-\.A-Za-z0-9]*\).*|\1|;s|[-\.]$||q')"
1762 [ -n "$LICENSE" ] && echo "LICENSE=\"$LICENSE\"" >> $file/receipt
1763 echo "DEPENDS=\"$(find_depends)\"" >> $file/receipt
1764 [ -s conffiles ] && cat >> $file/receipt <<EOT
1765 CONFIG_FILES="$(cat conffiles)"
1766 EOT
1767 show_unresolved_lib $file/receipt
1768 awk '
1770 if (/^ / && show) print substr($0,2);
1771 else show=0;
1772 if (/^Description/) show=1;
1773 }' < $TMP_DIR/control > $file/description.txt
1774 sed -i 's/^\.$//' $file/description.txt
1775 [ -s $file/description.txt ] || rm -f $file/description.txt
1776 tazpkg pack $file
1777 mv $file.tazpkg $TOP_DIR
1778 ;;
1779 *)
1780 _ 'Invalid target: $target (expected i386)'
1781 ;;
1782 esac
1783 cd $TOP_DIR
1784 rm -rf $TMP_DIR
1788 # convert a .rpm package to .tazpkg
1790 convert_rpm()
1792 mkdir -p $TMP_DIR
1793 cp $PACKAGE_FILE $TMP_DIR
1794 PACKAGE_FILE=$TMP_DIR/$(basename $PACKAGE_FILE)
1795 rpm -qip $PACKAGE_FILE | awk -v pkg=$(basename $PACKAGE_FILE) '
1796 BEGIN {
1797 goturl=0;
1798 printf "# SliTaz package receipt.\n";
1799 printf "# generated by tazpkg from rpm package %s\n",pkg;
1802 if (/^Name/) { name=$3; printf "PACKAGE=\"%s\"\n",$3; }
1803 if (/^Version/) printf "VERSION=\"%s-",$3;
1804 if (/^Release/) printf "%s\"\n",$3;
1805 if (/^Summary/) printf "SHORT_DESC=\"%s\"\n",substr($0,15);
1806 if (/^URL/) { goturl=1; printf "WEB_SITE=\"%s\"\n",$3; }
1808 END {
1809 if (goturl == 0)
1810 printf "WEB_SITE=\"http://rpmfind.net/linux/rpm2html/search.php?query=%s\"\n",name;
1811 printf "CATEGORY=\"misc\"\n";
1812 printf "MAINTAINER=\"nobody@slitaz.org\"\n";
1814 ' > $TMP_DIR/receipt
1815 . $TMP_DIR/receipt
1816 file=$PACKAGE-$VERSION
1817 mkdir -p $TMP_DIR/$file/fs/
1818 mv $TMP_DIR/receipt $TMP_DIR/$file
1819 rpm -qip $PACKAGE_FILE | awk '
1820 BEGIN { show=0 }
1822 if (show) print;
1823 if (/^Description/) show=1;
1825 ' > $TMP_DIR/$file/description.txt
1826 cd $TMP_DIR/$file/fs/
1827 rpm2cpio $PACKAGE_FILE | cpio -idm --quiet
1828 # rpm2cpio can't extract some new RPMs
1829 if [ $? == 1 ]; then
1830 if [ ! -e $INSTALLED/p7zip-full/receipt ]; then
1831 boldify $(_ 'Unable to extract the RPM using standard tools (rpm2cpio).')
1832 _n "Do you want to install 'p7zip-full' package"; confirm
1833 if [ $? = 0 ]; then
1834 tazpkg -gi p7zip-full
1835 else
1836 rm -rf $TMP_DIR
1837 exit 1
1838 fi
1839 fi
1840 # we may already have 7z or may have just installed it in the step above
1841 if [ -e $INSTALLED/p7zip-full/receipt ]; then
1842 7z x -so $PACKAGE_FILE | cpio -idm --quiet
1843 fi
1844 fi
1845 cd ../..
1846 echo "DEPENDS=\"$(find_depends)\"" >> $TMP_DIR/$file/receipt
1847 show_unresolved_lib $TMP_DIR/$file/receipt
1848 tazpkg pack $file
1849 mv $file.tazpkg $TOP_DIR
1850 cd $TOP_DIR
1851 rm -rf $TMP_DIR
1855 update_desktop_database()
1857 if [ -f $1/usr/bin/update-desktop-database ] && [ -n "$updatedesktopdb" ]; then
1858 chroot "$1/" /usr/bin/update-desktop-database /usr/share/applications 2>/dev/null
1859 fi
1863 update_mime_database()
1865 if [ -f $1/usr/bin/update-mime-database ] && [ -n "$updatemimedb" ]; then
1866 chroot "$1/" /usr/bin/update-mime-database /usr/share/mime
1867 fi
1871 update_icon_database()
1873 if [ -f $1/usr/bin/gtk-update-icon-cache ] && [ -n "$updateicondb" ]; then
1874 chroot "$1/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
1875 fi
1879 compile_glib_schemas()
1881 if [ -f $1/usr/bin/glib-compile-schemas ] && [ -n "$compile_schemas" ]; then
1882 chroot "$1/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
1883 fi
1887 update_kernel_modules()
1889 if [ -f $1/sbin/depmod ] && [ -n "$updatedepmod" ]; then
1890 chroot "$1/" /sbin/depmod -a
1891 fi
1898 ###################
1899 # TazPKG commands #
1900 ###################
1902 case "$COMMAND" in
1903 list|-l)
1904 shift
1906 # List all installed packages or a specific category.
1907 if [ "$1" = "blocked" ]; then
1908 title 'Blocked packages'
1909 if [ -s "$BLOCKED" ];then
1910 cat $BLOCKED
1911 else
1912 _ 'No blocked packages found.'
1913 fi
1914 newline; exit 0
1915 fi
1917 # Display the list of categories.
1918 if [ "$1" = "cat" -o "$1" = "categories" ]; then
1919 title 'Packages categories'
1920 num=0
1921 for i in $PKGS_CATEGORIES; do
1922 _ $i
1923 num=$(($num+1))
1924 done
1925 footer "$(eval_ngettext '$num category' '$num categories' $num)"; echo
1926 exit 0
1927 fi
1929 # Check for an asked category.
1930 ASKED_CATEGORY_I18N="$@"
1931 if [ -n "$ASKED_CATEGORY_I18N" ]; then
1932 ASKED_CATEGORY=$(reverse_translate_category "$ASKED_CATEGORY_I18N")
1933 title 'Installed packages of category: $ASKED_CATEGORY_I18N'
1934 for pkg in $INSTALLED/*; do
1935 [ -f $pkg/receipt ] || continue
1936 EXTRAVERSION=""
1937 . $pkg/receipt
1938 if [ "$CATEGORY" == "$ASKED_CATEGORY" ]; then
1939 echo -e "$PACKAGE\033[24G $VERSION$EXTRAVERSION"
1940 packages=$(($packages+1))
1941 fi
1942 done
1943 num="<c 32>$packages</c>"; cat_name="<c 34>$ASKED_CATEGORY_I18N</c>"
1944 footer "$(emsg $(eval_ngettext \
1945 '$num package installed of category $cat_name.' \
1946 '$num packages installed of category $cat_name.' \
1947 $packages))"; echo
1948 else
1950 # By default list all packages and versions.
1951 title 'List of all installed packages'
1952 for pkg in $INSTALLED/*; do
1953 [ -f $pkg/receipt ] || continue
1954 EXTRAVERSION=""
1955 . $pkg/receipt
1956 echo -e "$PACKAGE\033[35G $VERSION$EXTRAVERSION\033[53G $(_ $CATEGORY)"
1957 packages=$(($packages+1))
1958 done
1959 num="<c 32>$packages</c>"
1960 footer "$(emsg $(eval_ngettext \
1961 '$num package installed.' \
1962 '$num packages installed.' $packages))"
1963 fi ;;
1966 list-mirror|-lm)
1967 # List all available packages on the mirror. Option --diff displays
1968 # last mirrored packages diff (see recharge).
1969 check_for_packages_list
1970 case $2 in
1971 --diff)
1972 if [ -f "$LOCALSTATE/packages.diff" ]; then
1973 title 'Mirrored packages diff'
1974 cat $LOCALSTATE/packages.diff
1975 num=$(wc -l < $LOCALSTATE/packages.diff)
1976 footer "$(eval_ngettext \
1977 '$num new package listed on the mirror.' \
1978 '$num new packages listed on the mirror.' $num)"
1979 else
1980 newline
1981 _ 'Unable to list anything, no packages.diff found.'
1982 _ 'Recharge your current list to create a first diff.'
1983 newline
1984 fi; exit 0 ;;
1985 --text|--txt|--raw|*)
1986 title 'List of available packages on the mirror'
1987 cat $LOCALSTATE/packages.txt ;;
1988 esac
1989 pkgs=$(wc -l < $LOCALSTATE/packages.list)
1990 num=$(emsg "<c 32>$pkgs</c>")
1991 footer "$(eval_ngettext \
1992 '$num package in the last recharged list.' \
1993 '$num packages in the last recharged list.' $pkgs)"
1994 ;;
1997 list-files|-lf)
1998 # List files installed with the package.
1999 check_for_package_on_cmdline
2000 check_for_receipt
2001 title 'Installed files by: $PACKAGE'
2002 sort < $INSTALLED/$PACKAGE/files.list
2003 files=$(wc -l < $INSTALLED/$PACKAGE/files.list)
2004 num=$(emsg "<c 32>$files</c>")
2005 footer "$(eval_ngettext \
2006 '$num file installed with $PACKAGE' \
2007 '$num files installed with $PACKAGE' $files)"
2008 ;;
2011 info)
2012 # Information about package.
2013 check_for_package_on_cmdline
2014 check_for_receipt
2015 EXTRAVERSION=""
2016 . $INSTALLED/$PACKAGE/receipt
2017 title 'TazPKG information'
2018 # Display localized short description
2019 if [ -e "$LOCALSTATE/packages-desc.$LANG" ]; then
2020 LOCDESC=$(grep -e "^$PACKAGE " $LOCALSTATE/packages-desc.$LANG | cut -d' ' -f2)
2021 [ "x$LOCDESC" != "x" ] && SHORT_DESC="$LOCDESC"
2022 fi
2023 emsg "\
2024 <b>$(_ 'Package :')</b> $PACKAGE
2025 <b>$(_ 'Version :')</b> $VERSION$EXTRAVERSION
2026 <b>$(_ 'Category :')</b> $(_ $CATEGORY)
2027 <b>$(_ 'Short desc :')</b> $SHORT_DESC
2028 <b>$(_ 'Maintainer :')</b> $MAINTAINER"
2029 [ -n "$LICENSE" ] && emsg "<b>$(_ 'License :')</b> $LICENSE"
2030 [ -n "$DEPENDS" ] && emsg "<b>$(_ 'Depends :')</b> $DEPENDS"
2031 [ -n "$SUGGESTED" ] && emsg "<b>$(_ 'Suggested :')</b> $SUGGESTED"
2032 [ -n "$BUILD_DEPENDS" ] && emsg "<b>$(_ 'Build deps :')</b> $BUILD_DEPENDS"
2033 [ -n "$WANTED" ] && emsg "<b>$(_ 'Wanted src :')</b> $WANTED"
2034 [ -n "$WEB_SITE" ] && emsg "<b>$(_ 'Web site :')</b> $WEB_SITE"
2035 footer ;;
2038 desc)
2039 # Display package description.txt if available.
2040 if [ -f "$INSTALLED/$PACKAGE/description.txt" ]; then
2041 title 'Description of: $PACKAGE'
2042 cat $INSTALLED/$PACKAGE/description.txt
2043 footer
2044 else
2045 newline
2046 _ 'Sorry, no description available for this package.'
2047 newline
2048 fi ;;
2051 activity|log|-a)
2052 # Show activity log
2053 [ "$nb" ] || nb=18
2054 title 'TazPKG Activity'
2055 IFS=" "
2056 tail -n ${nb} ${LOG} | \
2057 while read date hour none action none pkg vers none; do
2058 case $action in
2059 Installed)
2060 action=$(colorize 32 $action) ;;
2061 Removed)
2062 action=$(colorize 31 $action) ;;
2063 *)
2064 action=$(boldify $action) ;;
2065 esac
2066 echo "$date $hour : $action $pkg $vers"
2067 done
2068 unset IFS
2069 footer ;;
2072 search|-s)
2073 # Search for a package by pattern or name.
2074 PATTERN="$2"
2075 if [ -z "$PATTERN" ]; then
2076 newline
2077 _ 'Please specify a pattern or package name to search for.'
2078 echo "$(_ 'Example:') 'tazpkg search paint'"
2079 newline
2080 exit 0
2081 fi
2082 title 'Search result for: $PATTERN'
2083 # Default is to search in installed pkgs and the raw list.
2084 case "$3" in
2085 -i|--installed)
2086 search_in_installed_packages ;;
2087 -l|--list)
2088 search_in_packages_list ;;
2089 -m|--mirror)
2090 search_in_packages_txt ;;
2091 *)
2092 search_in_installed_packages
2093 search_in_packages_list ;;
2094 esac ;;
2097 search-file|-sf)
2098 # Search for a file by pattern or name in all files.list.
2099 if [ -z "$2" ]; then
2100 newline
2101 _ 'Please specify a pattern or file name to search for.'
2102 echo "$(_ 'Example:') 'tazpkg search-file libnss'"
2103 newline
2104 exit 0
2105 fi
2106 s_file="$2"
2107 title 'Search result for file $s_file'
2109 if [ "$3" == "--mirror" ]; then
2111 match=0
2112 for i in $LOCALSTATE/files.list.lzma \
2113 $LOCALSTATE/undigest/*/files.list.lzma; do
2114 [ -f $i ] || continue
2115 unlzma -c $i | grep -- ".*:.*$2" | awk '
2116 BEGIN { last="" }
2118 pkg=substr($0,0,index($0,":")-1);
2119 file=substr($0,index($0,":")+2);
2120 if (last != pkg) {
2121 last = pkg;
2122 printf("\n%c[1mPackage %s:%c[0m\n",27,pkg,27);
2124 printf("%s\n",file);
2125 }'
2126 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | wc -l`))
2127 done
2129 else
2131 # Check all pkg files.list in search match which specify the package
2132 # name and the full path to the file(s).
2133 for pkg in $INSTALLED/*; do
2134 if grep -qs "$2" $pkg/files.list; then
2135 . $pkg/receipt
2136 newline
2137 boldify "$(_ 'Package $PACKAGE:')"
2138 grep "$2" $pkg/files.list
2139 files=`grep $2 $pkg/files.list | wc -l`
2140 match=$(($match+$files))
2141 fi
2142 done
2144 fi
2145 pkg=$2
2146 if [ "$match" = "" ]; then
2147 # FIXME
2148 _ '0 files found for: $pkg'
2149 else
2150 num=$(emsg "<c 32>$files</c>")
2151 footer "$(eval_ngettext \
2152 '$num file found for: $pkg' \
2153 '$num files found for: $pkg' $match)"
2154 fi
2155 ;;
2158 search-pkgname)
2159 # Search for a package name
2160 if [ -z "$2" ]; then
2161 newline
2162 _ 'Please specify a pattern or file name to search for.'
2163 echo "$(_ 'Example:') 'tazpkg search-pkgname libnss'"
2164 newline
2165 exit 0
2166 fi
2167 s_pkg="$2"
2168 title 'Search result for package $s_pkg'
2170 # Search for a file on mirror and output only the package name
2171 match=0
2172 for i in $LOCALSTATE/files.list.lzma \
2173 $LOCALSTATE/undigest/*/files.list.lzma; do
2174 [ -f $i ] || continue
2175 unlzma -c $i | grep -- ".*:.*$2" | cut -d: -f1 | uniq | awk '{ print $1 }'
2176 match=$(($match + `unlzma -c $i | grep -- ".*:.*$2" | cut -d: -f1 | uniq | wc -l`))
2177 done
2178 file=$2
2179 if [ "$match" = "0" ]; then
2180 _ 'No file found for: $file'
2181 newline
2182 else
2183 num=$(emsg "<c 32>$files</c>")
2184 footer "$(eval_ngettext \
2185 '$num package found with file: $file' \
2186 '$num packages found with file: $file' $match)"
2187 fi
2188 ;;
2191 install|-i)
2192 # Install .tazpkg packages.
2193 check_root $@
2194 check_for_package_on_cmdline
2195 check_for_package_file
2197 [ "$root" ] && ROOT="$root" && check_base_dir "$root"
2198 [ "$list" ] && INSTALL_LIST="$list"
2199 if [ "$rootconfig" ]; then
2200 if [ "$root" ]; then
2201 CACHE_DIR=$root/$CACHE_DIR
2202 SAVE_CACHE_DIR=$CACHE_DIR
2203 LOCALSTATE=$root/$LOCALSTATE
2204 else
2205 echo "rootconfig needs --root= option used." >&2
2206 exit 1
2207 fi
2208 fi
2210 # Get repositories priority list.
2211 look_for_priority
2213 # Check if forced install.
2214 if ! [ "$forced" ]; then
2215 check_for_installed_package $ROOT
2216 fi
2217 install_package $ROOT
2218 update_desktop_database $ROOT
2219 update_mime_database $ROOT
2220 update_icon_database $ROOT
2221 compile_glib_schemas $ROOT ;;
2224 install-list|get-install-list)
2225 # Install a set of packages from a list.
2226 check_root $@
2227 if [ -z "$2" ]; then
2228 newline
2229 _ \
2230 "Please change directory (cd) to the packages repository and specify the
2231 list of packages to install. Example: tazpkg install-list packages.list"
2232 exit 0
2233 fi
2234 # Check if the packages list exist.
2235 list_file=$2
2236 if [ ! -f "$list_file" ]; then
2237 _ 'Unable to find: $list_file'
2238 exit 0
2239 else
2240 LIST=$(cat $2)
2241 fi
2243 # Remember processed list
2244 export INSTALL_LIST="$2"
2246 # Set $COMMAND and install all packages.
2247 if [ "$1" = "get-install-list" ]; then
2248 COMMAND=get-install
2249 else
2250 COMMAND=install
2251 fi
2252 touch $2-processed
2254 # Upgrade tazpkg first. It may handle new features/formats...
2255 # then upgrade essential packages early
2256 for pkg in busybox-pam busybox gcc-lib-base glibc-base \
2257 slitaz-base-files tazpkg ; do
2258 pkg=$(egrep $pkg-[0-9] $INSTALL_LIST)
2259 [ -n "$pkg" ] || continue
2260 _ 'Adding implicit depends $pkg...'
2261 LIST="$pkg
2262 $LIST"
2263 done
2265 for pkg in $LIST; do
2266 grep -qs ^$pkg$ $2-processed && continue
2267 [ -d "$root/var/lib/tazpkg/installed" ] && continue
2268 tazpkg $COMMAND $pkg --list="$2" "$3" "$4" "$5"
2269 done
2270 rm -f $2-processed ;;
2273 add-flavor)
2274 # Install a set of packages from a flavor.
2275 install_flavor $2 ;;
2278 install-flavor)
2279 # Install a set of packages from a flavor and purge other ones.
2280 install_flavor $2 --purge ;;
2283 set-release)
2284 # Change current release and upgrade packages.
2285 RELEASE=$2
2286 if [ -z "$RELEASE" ]; then
2287 newline
2288 _ 'Please specify the release you want on the command line.'
2289 echo "$(_ 'Example:') tazpkg set-release cooking"
2290 newline
2291 exit 0
2292 fi
2293 rm $LOCALSTATE/mirror
2294 echo "$RELEASE" > /etc/slitaz-release
2295 tazpkg recharge && tazpkg upgrade
2297 # Install missing depends
2298 cd $INSTALLED
2299 for i in * ; do
2300 DEPENDS=""
2301 . $i/receipt
2302 for j in $DEPENDS ; do
2303 [ -d $j ] || tazpkg get-install $j
2304 done
2305 done ;;
2308 remove|-r)
2309 # Remove packages.
2310 check_root $@
2311 check_for_package_on_cmdline
2313 [ -n "$root" ] && ROOT="$root"
2314 if [ ! -f "$ROOT$INSTALLED/$PACKAGE/receipt" ]; then
2315 newline
2316 _ '$PACKAGE is not installed.'
2317 exit 0
2318 else
2319 ALTERED=""
2320 THE_PACKAGE=$PACKAGE # altered by receipt
2321 for i in $(cd $ROOT$INSTALLED ; ls); do
2322 [ -f $ROOT$INSTALLED/$i/receipt ] || continue
2323 DEPENDS=""
2324 . $ROOT$INSTALLED/$i/receipt
2325 case " $(echo $DEPENDS) " in
2326 *\ $THE_PACKAGE\ *) ALTERED="$ALTERED $i";;
2327 esac
2328 done
2329 EXTRAVERSION=""
2330 . $ROOT$INSTALLED/$THE_PACKAGE/receipt
2331 fi
2332 newline
2333 if [ -n "$ALTERED" ]; then
2334 _ 'The following packages depend on $PACKAGE:'
2335 for i in $ALTERED; do
2336 echo " $i"
2337 done
2338 fi
2339 REFRESH=$(cd $ROOT$INSTALLED ; grep -sl ^$PACKAGE$ */modifiers)
2340 if [ -n "$REFRESH" ]; then
2341 _ 'The following packages have been modified by $PACKAGE:'
2342 for i in $REFRESH; do
2343 echo " ${i%/modifiers}"
2344 done
2345 fi
2346 if [ "$auto" ]; then
2347 answer=0
2348 else
2349 _n 'Remove $PACKAGE ($VERSION$EXTRAVERSION)'; confirm
2350 answer=$?
2351 fi
2352 if [ $answer = 0 ]; then
2353 title 'Removing: $PACKAGE'
2354 # Pre remove commands.
2355 if grep -q ^pre_remove $ROOT$INSTALLED/$PACKAGE/receipt; then
2356 pre_remove $ROOT
2357 fi
2358 action "Removing all files installed..."
2359 if [ -f $ROOT$INSTALLED/$PACKAGE/modifiers ]; then
2360 for file in $(cat $ROOT$INSTALLED/$PACKAGE/files.list); do
2361 for mod in $(cat $ROOT$INSTALLED/$PACKAGE/modifiers); do
2362 [ -f $ROOT$INSTALLED/$mod/files.list ] && [ $(grep "^$(echo $file | grepesc)$" $ROOT$INSTALLED/$mod/files.list | wc -l) -gt 1 ] && continue 2
2363 done
2364 remove_with_path $ROOT$file
2365 done
2366 else
2367 for file in $(cat $ROOT$INSTALLED/$PACKAGE/files.list); do
2368 remove_with_path $ROOT$file
2369 done
2370 fi
2371 status
2372 if grep -q ^post_remove $ROOT$INSTALLED/$PACKAGE/receipt; then
2373 post_remove $ROOT
2374 fi
2376 # Remove package receipt.
2377 action "Removing package receipt..."
2378 rm -rf $ROOT$INSTALLED/$PACKAGE
2379 status
2381 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
2382 $LOCALSTATE/installed.$SUM 2> /dev/null
2384 # Log this activity
2385 log_pkg Removed
2386 if [ "$ALTERED" ]; then
2387 if [ "$auto" ]; then
2388 answer=0
2389 else
2390 _n 'Remove packages depending on $PACKAGE'; confirm
2391 answer=$?
2392 fi
2393 if [ $answer = 0 ]; then
2394 for i in $ALTERED; do
2395 if [ -d "$ROOT$INSTALLED/$i" ]; then
2396 tazpkg remove $i $ROOTOPTS
2397 fi
2398 done
2399 fi
2400 fi
2401 if [ "$REFRESH" ]; then
2402 if [ "$auto" ]; then
2403 answer=0
2404 else
2405 _n 'Reinstall packages modified by $PACKAGE'; confirm
2406 answer=$?
2407 fi
2408 if [ $answer = 0 ]; then
2409 for i in $REFRESH; do
2410 if [ $(wc -l < $ROOT$INSTALLED/$i) -gt 1 ]; then
2411 _ 'Check $INSTALLED/$i for reinstallation'
2412 continue
2413 fi
2414 rm -r $ROOT$INSTALLED/$i
2415 tazpkg get-install ${i%/modifiers} $ROOTOPTS --forced
2416 done
2417 fi
2418 fi
2419 else
2420 newline
2421 _ 'Uninstallation of $PACKAGE cancelled.'
2422 fi
2423 newline ;;
2426 extract|-e)
2427 # Extract .tazpkg cpio archive into a directory.
2428 check_for_package_on_cmdline
2429 check_for_package_file
2430 title 'Extracting: $PACKAGE'
2432 # If no directory destination is found on the cmdline
2433 # we create one in the current dir using the package name.
2434 if [ -n "$TARGET_DIR" ]; then
2435 DESTDIR=$TARGET_DIR/$PACKAGE
2436 else
2437 DESTDIR=$PACKAGE
2438 fi
2439 mkdir -p $DESTDIR
2441 action "Copying original package..."
2442 cp $PACKAGE_FILE $DESTDIR
2443 status
2445 cd $DESTDIR
2446 extract_package
2447 [ -e "receipt" ] && footer "$(_ '$PACKAGE is extracted to: $DESTDIR')"
2448 ;;
2451 recompress)
2452 # Recompress .tazpkg cpio archive with lzma.
2453 check_for_package_on_cmdline
2454 check_for_package_file
2455 title 'Recompressing: $PACKAGE'
2456 mkdir -p $TMP_DIR
2458 action "Copying original package..."
2459 cp $PACKAGE_FILE $TMP_DIR
2460 status
2462 cd $TMP_DIR
2463 extract_package
2465 action "Recompressing the fs..."
2466 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
2467 rm -rf fs
2468 status
2470 action "Creating new package..."
2471 find . -print | cpio -o -H newc --quiet > \
2472 $TOP_DIR/$(basename $PACKAGE_FILE).$$ && mv -f \
2473 $TOP_DIR/$(basename $PACKAGE_FILE).$$ \
2474 $TOP_DIR/$(basename $PACKAGE_FILE)
2475 status
2477 cd $TOP_DIR
2478 rm -rf $TMP_DIR
2479 separator; newline ;;
2482 list-config)
2483 # List configuration files installed.
2484 if [ "$2" = "--box" ]; then
2485 mkdir -p $TMP_DIR && cd $TMP_DIR
2486 FILES="$INSTALLED/*/volatile.cpio.gz"
2487 [ -n "$3" ] && FILES="$INSTALLED/$3/volatile.cpio.gz"
2488 for i in $FILES; do
2489 zcat $i | cpio -idm --quiet > /dev/null
2490 find * -type f 2>/dev/null | while read file; do
2491 if [ ! -e /$file ]; then
2492 echo -n "----------|----|----|$(_n 'File lost')"
2493 else
2494 echo -n "$(stat -c "%A|%U|%G|%s|" /$file)"
2495 cmp $file /$file > /dev/null 2>&1 || \
2496 echo -n "$(stat -c "%.16y" /$file)"
2497 fi
2498 echo "|/$file"
2499 done
2500 rm -rf *
2501 done
2502 cd $TOP_DIR
2503 rm -rf $TMP_DIR
2504 else
2505 title 'Configuration files'
2506 for i in $INSTALLED/*/volatile.cpio.gz; do
2507 [ -n "$2" -a "$i" != "$INSTALLED/$2/volatile.cpio.gz" ] && continue
2508 [ -f "$i" ] || continue
2509 zcat $i | cpio -t --quiet
2510 done | sed 's|^|/|' | sort
2511 separator
2512 newline
2513 fi ;;
2516 repack-config)
2517 # Create SliTaz package archive from configuration files.
2518 mkdir -p $TMP_DIR && cd $TMP_DIR
2519 CONFIG_VERSION=1.0
2520 mkdir config-$CONFIG_VERSION
2521 cd config-$CONFIG_VERSION
2522 for i in $INSTALLED/*/volatile.cpio.gz; do
2523 zcat $i | cpio -t --quiet
2524 done > files.list
2525 mkdir fs
2526 cd fs
2527 ( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null
2528 mkdir -p etc/tazlito
2529 for i in $INSTALLED/*/receipt; do
2530 EXTRAVERSION=""
2531 . $i
2532 echo "$PACKAGE-$VERSION$EXTRAVERSION"
2533 done > etc/tazlito/config-packages.list
2534 cd ..
2535 echo "etc/tazlito/config-packages.list" >> files.list
2536 pkg_date=$(date +"%x %X")
2537 cat > receipt <<EOT
2538 # SliTaz package receipt.
2540 PACKAGE="config"
2541 VERSION="$CONFIG_VERSION"
2542 CATEGORY="base-system"
2543 SHORT_DESC="$(_n 'User configuration backup on $pkg_date')"
2544 DEPENDS="$(ls $INSTALLED)"
2545 EOT
2546 cd ..
2547 tazpkg pack config-$CONFIG_VERSION
2548 cp config-$CONFIG_VERSION.tazpkg $TOP_DIR
2549 cd $TOP_DIR
2550 rm -rf $TMP_DIR
2551 ;;
2554 repack)
2555 # Create SliTaz package archive from an installed package.
2556 check_for_package_on_cmdline
2557 check_for_receipt
2558 EXTRAVERSION=""
2559 . $INSTALLED/$PACKAGE/receipt
2560 title 'Repacking: $PACKAGE-$VERSION$EXTRAVERSION.tazpkg'
2561 if grep -qs ^NO_REPACK= $INSTALLED/$PACKAGE/receipt; then
2562 _ "Can't repack \$PACKAGE"
2563 exit 1
2564 fi
2565 if [ -s $INSTALLED/$PACKAGE/modifiers ]; then
2566 _ "Can't repack, \$PACKAGE files have been modified by:"
2567 for i in $(cat $INSTALLED/$PACKAGE/modifiers); do
2568 echo " $i"
2569 done
2570 exit 1
2571 fi
2572 MISSING=""
2573 while read i; do
2574 [ -e "$i" ] && continue
2575 [ -L "$i" ] || MISSING="$MISSING\n $i"
2576 done < $INSTALLED/$PACKAGE/files.list
2577 if [ -n "$MISSING" ]; then
2578 _n "Can't repack, the following files are lost:"
2579 echo -e "$MISSING"
2580 exit 1
2581 fi
2582 mkdir -p $TMP_DIR && cd $TMP_DIR
2583 FILES="fs.cpio.lzma\n"
2584 for i in $(ls $INSTALLED/$PACKAGE) ; do
2585 [ "$i" = "volatile.cpio.gz" ] && continue
2586 [ "$i" = "modifiers" ] && continue
2587 cp $INSTALLED/$PACKAGE/$i . && FILES="$FILES$i\n"
2588 done
2589 ln -s / rootfs
2590 mkdir tmp
2591 sed 's/^/rootfs/' < files.list | cpio -o -H newc --quiet |\
2592 { cd tmp ; cpio -idm --quiet >/dev/null; cd ..; }
2593 mv tmp/rootfs fs
2594 if [ -f $INSTALLED/$PACKAGE/volatile.cpio.gz ]; then
2595 zcat $INSTALLED/$PACKAGE/volatile.cpio.gz | \
2596 { cd fs; cpio -idm --quiet; cd ..; }
2597 fi
2598 if fgrep -q repack_cleanup $INSTALLED/$PACKAGE/receipt; then
2599 . $INSTALLED/$PACKAGE/receipt
2600 repack_cleanup fs
2601 fi
2602 if [ -f $INSTALLED/$PACKAGE/$CHECKSUM ]; then
2603 sed 's, , fs,' < $INSTALLED/$PACKAGE/$CHECKSUM | \
2604 $CHECKSUM -s -c || {
2605 _ "Can't repack, \$CHECKSUM error."
2606 cd $TOP_DIR
2607 rm -rf $TMP_DIR
2608 exit 1
2610 fi
2611 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
2612 echo -e "$FILES" | cpio -o -H newc --quiet > \
2613 $TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg
2614 cd $TOP_DIR
2615 \rm -R $TMP_DIR
2616 _ 'Package $PACKAGE repacked successfully.'
2617 pkg_size=$(du -sh $PACKAGE-$VERSION$EXTRAVERSION.tazpkg)
2618 _ 'Size: $pkg_size'
2619 newline ;;
2622 pack)
2623 # Create SliTaz package archive using cpio and lzma.
2624 # TODO: Cook also pack packages, we should share code in libpkg.sh
2625 check_for_package_on_cmdline
2626 cd $PACKAGE
2627 if [ ! -f "receipt" ]; then
2628 _ 'Receipt is missing. Please read the documentation.'
2629 exit 0
2630 else
2631 title 'Packing: $PACKAGE'
2632 # Create files.list with redirecting find outpout.
2633 action "Creating the list of files..."
2634 cd fs
2635 find . -type f -print > ../files.list
2636 find . -type l -print >> ../files.list
2637 cd .. && sed -i s/'^.'/''/ files.list
2638 status
2639 action 'Creating $CHECKSUM of files...'
2640 while read file; do
2641 [ -L "fs$file" ] && continue
2642 [ -f "fs$file" ] || continue
2643 case "$file" in
2644 /lib/modules/*/modules.*|*.pyc) continue;;
2645 esac
2646 $CHECKSUM "fs$file" | sed 's/ fs/ /'
2647 done < files.list > $CHECKSUM
2648 status
2649 UNPACKED_SIZE=$(du -chs fs receipt files.list $CHECKSUM \
2650 description.txt 2> /dev/null | awk \
2651 '{ sz=$1 } END { print sz }')
2652 # Build cpio archives.
2653 action "Compressing the fs..."
2654 find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
2655 rm -rf fs
2656 status
2657 PACKED_SIZE=$(du -chs fs.cpio.lzma receipt files.list \
2658 $CHECKSUM description.txt 2> /dev/null | awk \
2659 '{ sz=$1 } END { print sz }')
2660 action "Updating receipt sizes..."
2661 sed -i s/^PACKED_SIZE.*$// receipt
2662 sed -i s/^UNPACKED_SIZE.*$// receipt
2663 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
2664 status
2665 action "Creating full cpio archive..."
2666 find . -print | cpio -o -H newc --quiet > ../$PACKAGE.tazpkg
2667 status
2668 action "Restoring original package tree..."
2669 unlzma -c fs.cpio.lzma | cpio -idm --quiet
2670 status
2671 rm fs.cpio.lzma && cd ..
2672 footer "$(_ 'Package $PACKAGE compressed successfully.')"
2673 pkg_size=$(du -sh $PACKAGE.tazpkg)
2674 _ 'Size: $pkg_size'
2675 newline
2676 fi ;;
2679 recharge)
2680 # Recharge packages.list from a mirror.
2682 # WARNING: The 'mirrors' file has all SliTaz mirrors but 'mirror'
2683 # must have only the chosen main mirror.
2685 check_root $@
2687 ARG=$2
2688 if [ "$root" ]; then
2689 LOCALSTATE=$root$LOCALSTATE
2690 [ "${2#--}" != "$2" ] && ARG=$3
2691 fi
2692 if [ "$ARG" = main ]; then
2693 repository_to_recharge=$LOCALSTATE
2694 elif [ "$ARG" ]; then
2695 if [ -d "$LOCALSTATE/undigest/$ARG" ]; then
2696 repository_to_recharge=$LOCALSTATE/undigest/$ARG
2697 else
2698 repo="$LOCALSTATE/undigest/$ARG"
2699 _ "\$repo doesn't exist." >&2
2700 exit 1
2701 fi
2702 else
2703 repository_to_recharge="$LOCALSTATE $LOCALSTATE/undigest/*"
2704 fi
2705 for path in $repository_to_recharge; do
2706 [ -f $path/mirror ] || continue
2707 cd $path
2709 # Quietly check if recharging is needed.
2710 [ -f ID ] && mv ID ID.bak
2711 download_from "$(cat mirror)" ID >/dev/null 2>/dev/null
2712 if [ -f ID ] && fgrep -q $(cat ID.bak 2>/dev/null || echo "null") ID; then
2713 if [ "$path" = "$LOCALSTATE" ]; then
2714 repository_name=Main
2715 else
2716 base_path="$(basename $path)"
2717 repository_name="$(_n 'Undigest $base_path')"
2718 fi
2719 _ '$repository_name is up to date.'
2720 rm ID.bak
2721 continue
2722 fi
2724 # Don't let ID be a symlink when using local repository.
2725 if [ -f ID ]; then
2726 mv -f ID ID.bak
2727 cat ID.bak > ID
2728 rm ID.bak
2729 fi
2731 newline
2732 if [ "$path" != "$LOCALSTATE" ]; then
2733 base_path="$(basename $path)"
2734 _ 'Recharging undigest $base_path:'
2735 fi
2737 if [ -f "packages.list" ]; then
2738 action "Creating backup of the last packages list..."
2739 for i in packages.desc packages.$SUM packages.txt \
2740 packages.list packages.equiv files.list.lzma \
2741 extra.list mirrors
2742 do
2743 mv -f $i $i.bak 2>/dev/null
2744 done
2745 status
2746 fi
2748 for i in desc md5 txt list equiv; do
2749 download_from "$(cat mirror)" packages.$i
2750 done
2751 download_from "$(cat mirror)" files.list.lzma
2752 download_from "$(cat mirror)" extra.list
2753 download_from "$(sed 's|packages/.*||' < mirror)" mirrors
2755 if [ -f "packages.list.bak" ]; then
2756 diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
2757 [ -f "extra.list.bak" ] &&
2758 diff -u extra.list.bak extra.list | grep ^+[a-z] >> packages.diff
2759 sed -i s/+// packages.diff
2760 title 'Mirrored packages diff'
2761 cat packages.diff
2762 new_pkgs=$(wc -l < packages.diff)
2763 if [ "$new_pkgs" != 0 ]; then
2764 num=$(emsg "<c 32>$new_pkgs</c>")
2765 footer "$(eval_ngettext \
2766 '$num new package on the mirror.' \
2767 '$num new packages on the mirror.' $new_pkgs)"
2768 else
2769 _ 'No new packages on the mirror.'
2770 newline
2771 fi
2772 else
2773 footer "$(_ \
2774 'Last packages.list is ready to use. Note that next time you recharge the
2775 list, a list of differences will be displayed to show new and upgradeable
2776 packages.')"
2777 fi
2778 done ;;
2781 help-up)
2782 # Options available for the command: up
2783 newline; usage_up; newline
2784 exit 1 ;;
2787 up|upgrade)
2789 # This is the new way to upgrade packages making 'upgrade' and
2790 # upgradeable out-of-date. This new way is much, much more faster!
2791 # Look into installed packages and get data from receipt, it is fast
2792 # and easy to handle vars after using only md5sum to compare packages
2794 for opt in $@; do
2795 case "$opt" in
2796 --recharge|-r) tazpkg recharge ;;
2797 --install|-i) install="y" ;;
2798 --check|-c) install="n" ;;
2799 esac
2800 done
2801 time=$(date +%s)
2802 installed_sum=$LOCALSTATE/installed.$SUM
2803 look_for_priority
2804 for repo in $priority; do
2805 pkg_list=$repo/packages.list
2806 mtime=$(find $pkg_list -mtime +7)
2807 if [ "$mtime" ]; then
2808 if [ "$repo" = "$LOCALSTATE" ]; then
2809 repo_name=main
2810 else
2811 repo_name="${repo##*/}"
2812 fi
2813 _ '$pkg_list is older than one week... recharging'
2814 tazpkg recharge $repo_name
2815 fi
2816 done
2817 emsg "<n><b>$(_ 'Package')</b><i 28> $(_ 'Version')<i 48> $(_ 'Status')<->"
2818 cd $INSTALLED
2819 newline > $UP_LIST
2820 blocked_count=0
2821 for pkg in *; do
2822 [ ! -d $pkg ] && continue
2823 unset VERSION EXTRAVERSION
2824 . $pkg/receipt
2825 md5=$(fgrep " $PACKAGE-${VERSION}$EXTRAVERSION.tazpkg" \
2826 $installed_sum | awk '{print $1}')
2827 for repo in $priority; do
2828 pkg_desc=$repo/packages.desc
2829 pkg_list=$repo/packages.list
2830 pkg_sum=$repo/packages.$SUM
2832 if ! fgrep -q "$md5 $PACKAGE-" $pkg_sum; then
2833 # Jump to next repository in priority if pkg doesn't exist
2834 # in this one.
2835 grep -q ^$PACKAGE- $pkg_list || continue
2837 emsg -n "$PACKAGE<i 28> $VERSION"
2839 # Skip pkgs listed in $LOCALSTATE/blocked-packages.list
2840 if $(grep -qs "^$PACKAGE" $BLOCKED); then
2841 blocked_count=$(($blocked_count + 1))
2842 emsg "<i 48><c 31> $(_ 'Blocked')</c>"
2843 break
2844 fi
2846 new=$(grep "^$PACKAGE |" $pkg_desc | awk '{print $3}')
2848 if [ "$VERSION" == "$new" ]; then
2849 emsg "<i 48><c 34> $(_ 'New build')</c>"
2850 else
2851 emsg "<i 48><c 32> $(_ 'New version $new')</c>"
2852 fi
2853 echo "$PACKAGE" >> $UP_LIST
2854 break
2855 fi
2856 done
2857 done
2858 sed -i /^$/d $UP_LIST
2859 upnb=$(wc -l < $UP_LIST)
2860 pkgs=$(ls | wc -l)
2861 time=$(($(date +%s) - $time))
2862 if [ "$upnb" = 0 ]; then
2863 install="n"
2864 _ 'System is up-to-date...'
2865 fi
2866 num=$(emsg "<c 32>$pkgs</c>")
2867 footer "$(eval_ngettext \
2868 '$num installed package scanned in ${time}s' \
2869 '$num installed packages scanned in ${time}s' $pkgs)"
2870 if [ "$upnb" != 0 ]; then
2871 if [ "$blocked_count" -gt 0 ]; then
2872 num=$blocked_count
2873 blocked=$(eval_ngettext '$num blocked' '$num blocked' $num)
2874 else
2875 # FIXME
2876 blocked="$(_ '0 blocked')"
2877 fi
2878 num=$upnb
2879 boldify "$(eval_ngettext \
2880 'You have $num available upgrade ($blocked)' \
2881 'You have $num available upgrades ($blocked)' $num)"
2882 newline
2883 fi
2884 # Pkgs to upgrade ? Skip, let install them all or ask user
2885 [ "$install" == "n" ] && exit 0
2886 if [ "$upnb" -gt 0 ]; then
2887 if [ "$install" == "y" ]; then
2888 continue
2889 else
2890 _n 'Do you wish to install them now: y/n ? '
2891 read install
2892 fi
2893 case "$install" in
2894 y|Y|yes|YES|Yes)
2895 for pkg in $(cat $UP_LIST); do
2896 echo 'y' | tazpkg get-install $pkg --forced
2897 done
2898 # List is generated each time and must be cleaned so
2899 # tazpkg-notify doesn't find upgrades anymore.
2900 rm $UP_LIST && touch $UP_LIST ;;
2901 *)
2902 _ 'Leaving without any upgrades installed.'
2903 newline
2904 exit 0 ;;
2905 esac
2906 fi
2907 newline ;;
2910 bugs)
2911 # Show known bugs in package(s)
2912 cd $INSTALLED
2913 shift
2914 LIST=$@
2915 [ -n "$LIST" ] || LIST=$(ls)
2916 MSG=$(_n 'No known bugs.')
2917 for PACKAGE in $LIST; do
2918 BUGS=""
2919 EXTRAVERSION=""
2920 . $PACKAGE/receipt
2921 if [ -n "$BUGS" ]; then
2922 MSG=$(_n 'Bug list completed')
2923 newline
2924 _ 'Bugs in package $PACKAGE version $VERSION$EXTRAVERSION:'
2925 cat <<EOT
2926 $BUGS
2927 EOT
2928 fi
2929 done
2930 echo "$MSG" ;;
2933 check)
2934 # Check installed packages set.
2935 check_root $@
2937 # Get repositories priority list.
2938 look_for_priority
2940 cd $INSTALLED
2941 for PACKAGE in $(ls); do
2942 if [ ! -f $PACKAGE/receipt ]; then
2943 _ 'The package $PACKAGE installation has not completed'
2944 continue
2945 fi
2946 DEPENDS=""
2947 EXTRAVERSION=""
2948 . $PACKAGE/receipt
2949 if [ -s $PACKAGE/modifiers ]; then
2950 _ 'The package $PACKAGE-$VERSION$EXTRAVERSION has been modified by:'
2951 for i in $(cat $PACKAGE/modifiers); do
2952 echo " $i"
2953 done
2954 fi
2955 MSG="$(_n 'Files lost from $PACKAGE-$VERSION$EXTRAVERSION:')\n"
2956 while read file; do
2957 [ -e "$file" ] && continue
2958 if [ -L "$file" ]; then
2959 MSG="$MSG $(_n 'target of symlink')"
2960 fi
2961 echo -e "$MSG $file"
2962 MSG=""
2963 done < $PACKAGE/files.list
2964 MSG="$(_n 'Missing dependencies for $PACKAGE-$VERSION$EXTRAVERSION:')\n"
2965 for i in $DEPENDS; do
2966 [ -d $i ] && continue
2967 [ -d $(equivalent_pkg $i) ] && continue
2968 echo -e "$MSG $i"
2969 MSG=""
2970 done
2971 MSG="$(_n 'Dependencies loop between $PACKAGE and:')\n"
2972 ALL_DEPS=""
2973 check_for_deps_loop $PACKAGE $DEPENDS
2974 done
2976 _ 'Looking for known bugs...'
2977 tazpkg bugs
2979 if [ "$PACKAGE_FILE" = "--full" ]; then
2980 for file in */$CHECKSUM; do
2981 CONFIG_FILES=""
2982 . $(dirname "$file")/receipt
2983 [ -s "$file" ] || continue
2984 while read md5 f; do
2985 [ -f $f ] || continue
2986 for i in $CONFIG_FILES; do
2987 case "$f" in
2988 $i|$i/*) continue 2;;
2989 esac
2990 done
2991 echo "$md5 $f"
2992 done < "$file" | $CHECKSUM -c - 2> /dev/null | \
2993 grep -v OK$ | sed 's/FAILED$/$CHECKSUM MISMATCH/'
2994 done
2995 FILES=" "
2996 for file in $(cat */files.list); do
2997 [ -d "$file" ] && continue
2998 case "$FILES" in *\ $file\ *) continue;; esac
2999 [ $(grep "^$(echo $file | grepesc)$" */files.list 2> /dev/null | \
3000 wc -l) -gt 1 ] || continue
3001 FILES="$FILES$file "
3002 _ 'The following packages provide $file:'
3003 grep -l "^$(echo $file | grepesc)$" */files.list | \
3004 while read f; do
3005 pkg=${f%/files.list}
3006 if [ -f $pkg/modifiers ]; then
3007 pkg_list="$(cat $pkg/modifiers)"
3008 overriders=$(_n '(overridden by $pkg_list)')
3009 else
3010 overriders=''
3011 fi
3012 echo -n " $pkg $overriders"
3013 newline
3014 done
3015 done
3016 MSG="$(_n 'No package has installed the following files:')\n"
3017 find /etc /bin /sbin /lib /usr /var/www -not -type d 2>/dev/null | \
3018 while read file; do
3019 case "$file" in *\[*) continue;; esac
3020 grep -q "^$(echo $file | grepesc)$" */files.list && continue
3021 echo -e "$MSG $file"
3022 MSG=""
3023 done
3024 fi
3025 _ 'Check completed.'; echo ;;
3028 block)
3029 # Add a pkg name to the list of blocked packages.
3030 check_root $@
3031 check_for_package_on_cmdline
3032 newline
3033 if grep -qs "^$PACKAGE" $BLOCKED; then
3034 _ '$PACKAGE is already in the blocked packages list.'
3035 else
3036 action 'Add $PACKAGE to: $BLOCKED...'
3037 echo $PACKAGE >> $BLOCKED
3038 status
3039 # Log this activity
3040 . $INSTALLED/$PACKAGE/receipt
3041 log_pkg Blocked
3042 fi
3043 newline ;;
3046 unblock)
3047 # Remove a pkg name from the list of blocked packages.
3048 check_root $@
3049 check_for_package_on_cmdline
3050 newline
3051 if grep -qs "^$PACKAGE" $BLOCKED; then
3052 action 'Removing $PACKAGE from: $BLOCKED...'
3053 sed -i s/$PACKAGE/''/ $BLOCKED
3054 sed -i '/^$/d' $BLOCKED
3055 status
3056 # Log this activity
3057 . $INSTALLED/$PACKAGE/receipt
3058 log_pkg Unblocked
3059 else
3060 _ '$PACKAGE is not in the blocked packages list.'
3061 fi
3062 newline ;;
3065 get)
3066 # Download a package with wget.
3067 check_root $@
3068 check_for_package_on_cmdline
3069 check_for_packages_list
3071 [ "$root" ] && ROOT="$root" && check_base_dir "$root"
3072 if [ "$rootconfig" ]; then
3073 if [ "$root" ]; then
3074 CACHE_DIR=$root/$CACHE_DIR
3075 SAVE_CACHE_DIR=$CACHE_DIR
3076 LOCALSTATE=$root/$LOCALSTATE
3077 else
3078 _ 'rootconfig needs --root= option used.' >&2
3079 exit 1
3080 fi
3081 fi
3083 # Get repositories priority list.
3084 look_for_priority
3086 CURRENT_DIR=$PWD
3087 check_for_package_in_list
3088 cd $CACHE_DIR
3089 if [ -f "$PACKAGE.tazpkg" ]; then
3090 _ '$PACKAGE already in the cache'
3091 # Check package download was finished
3092 tail -c 2k $PACKAGE.tazpkg | fgrep -q 00000000TRAILER || {
3093 _ 'Continuing $PACKAGE download'
3094 download $PACKAGE.tazpkg
3096 if [ "$($CHECKSUM $PACKAGE.tazpkg)" != "$(fgrep " $PACKAGE.tazpkg" $rep/packages.$SUM)" ]; then
3097 rm -f $PACKAGE.tazpkg
3098 download $PACKAGE.tazpkg
3099 fi
3100 else
3101 download $PACKAGE.tazpkg
3102 fi
3103 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
3104 cp -a $PACKAGE_FILE $CURRENT_DIR ;;
3107 get-install|-gi)
3108 # Download and install a package.
3109 check_root $@
3110 check_for_package_on_cmdline
3111 check_for_packages_list
3113 DO_CHECK=""
3114 [ "$forced" ] && DO_CHECK=no
3115 [ "$root" ] && ROOT="$root" && check_base_dir "$root"
3116 [ "$list" ] && INSTALL_LIST="$list"
3117 if [ "$rootconfig" ]; then
3118 if [ "$root" ]; then
3119 CACHE_DIR=$root/$CACHE_DIR
3120 SAVE_CACHE_DIR=$CACHE_DIR
3121 LOCALSTATE=$root/$LOCALSTATE
3122 else
3123 _ 'rootconfig needs --root= option used.' >&2
3124 exit 1
3125 fi
3126 fi
3128 # Get repositories priority list.
3129 look_for_priority
3131 AUTOEXEC="no"
3132 if ! check_for_package_in_list check; then
3133 CACHE_DIR="${CACHE_DIR%/*}/get"
3134 [ -d "$CACHE_DIR" ] || mkdir -p $CACHE_DIR
3135 if download_get_script $PACKAGE /tmp/$PACKAGE.$$ ; then
3136 install_package_from_get_script /tmp/$PACKAGE.$$ $ROOT
3137 exit 0
3138 else
3139 PACKAGE=get-$PACKAGE
3140 AUTOEXEC=$PACKAGE
3141 check_for_package_in_list
3142 if [ -n "$(get_installed_package_pathname $PACKAGE $ROOT)" ]; then
3143 $AUTOEXEC $ROOT
3144 exit 0
3145 fi
3146 fi
3147 fi
3148 # Check if forced install.
3149 if ! [ "$forced" ]; then
3150 check_for_installed_package $ROOT
3151 fi
3152 cd $CACHE_DIR
3153 if [ -f "$PACKAGE.tazpkg" ]; then
3154 _ '$PACKAGE already in the cache: $CACHE_DIR'
3155 # Check package download was finished
3156 tail -c 2k $PACKAGE.tazpkg | fgrep -q 00000000TRAILER || {
3157 _ 'Continuing $PACKAGE download'
3158 download $PACKAGE.tazpkg
3160 if [ "$($CHECKSUM $PACKAGE.tazpkg)" != "$(fgrep " $PACKAGE.tazpkg" $rep/packages.$SUM)" ]; then
3161 rm -f $PACKAGE.tazpkg
3162 download $PACKAGE.tazpkg
3163 fi
3164 else
3165 newline
3166 download $PACKAGE.tazpkg
3167 fi
3168 PACKAGE_FILE=$CACHE_DIR/$PACKAGE.tazpkg
3169 [ "$rootconfig" ] && LOCALSTATE=${LOCALSTATE#$root}
3170 install_package $ROOT
3171 [ "$AUTOEXEC" != "no" ] && $PACKAGE $ROOT
3172 update_desktop_database $ROOT
3173 update_mime_database $ROOT ;;
3176 clean-cache|-cc)
3177 # Remove all downloaded packages.
3178 check_root $@
3179 files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
3180 title 'Path: $CACHE_DIR'
3181 action "Cleaning cache directory..."
3182 rm -rf $CACHE_DIR/*
3183 status
3184 num=$(colorize 32 "$files")
3186 footer "$(eval_ngettext \
3187 '$num file removed from cache.' \
3188 '$num files removed from cache.' \
3189 $files)"
3190 ;;
3193 list-undigest)
3194 # list undigest URLs.
3195 if [ "$2" = "--box" ]; then
3196 for i in $LOCALSTATE/undigest/*/mirror; do
3197 [ -f $i ] || continue
3198 echo "$(basename $(dirname $i))|$(cat $i)"
3199 done
3200 else
3201 title 'Current undigest(s)'
3202 for i in $LOCALSTATE/undigest/*/mirror; do
3203 if [ ! -f $i ]; then
3204 _ 'No undigest mirror found.'
3205 exit 1
3206 fi
3207 echo "$(basename $(dirname $i)) $(cat $i)"
3208 done
3209 newline
3210 fi ;;
3213 remove-undigest)
3214 # remove undigest URL.
3215 check_root $@
3216 undigest="$2"
3217 if [ -d $LOCALSTATE/undigest/$2 ]; then
3218 _n 'Remove $undigest undigest'; confirm
3219 if [ $? = 0 ]; then
3220 action 'Removing $undigest undigest...'
3221 rm -rf $LOCALSTATE/undigest/$2
3222 status
3223 rmdir $LOCALSTATE/undigest 2> /dev/null
3224 fi
3225 else
3226 _ 'Undigest $undigest not found'
3227 fi ;;
3230 add-undigest|setup-undigest)
3231 # Add undigest URL.
3232 check_root $@
3233 undigest=$2
3234 [ -d $LOCALSTATE/undigest ] || mkdir $LOCALSTATE/undigest
3235 if [ -z "$undigest" ]; then
3236 i=1
3237 while [ -d $LOCALSTATE/undigest/$i ]; do
3238 i=$(($i+1))
3239 done
3240 undigest=$i
3241 fi
3242 if [ ! -d $LOCALSTATE/undigest/$undigest ]; then
3243 _ 'Creating new undigest $undigest.'
3244 mkdir $LOCALSTATE/undigest/$undigest
3245 fi
3246 setup_mirror $LOCALSTATE/undigest/$undigest $3 ;;
3249 setup-mirror|-sm)
3250 # Change mirror URL.
3251 check_root $@
3252 setup_mirror $LOCALSTATE $2 ;;
3255 reconfigure)
3256 # Replay post_install from receipt
3257 check_for_package_on_cmdline
3258 check_root $@
3259 ROOT=""
3260 while [ -n "$3" ]; do
3261 case "$3" in
3262 --root=*)
3263 ROOT="${3#--root=}/" ;;
3264 *)
3265 shift 2
3266 u_opt="$*"
3267 newline >&2
3268 _ 'Unknown option $u_opt.' >&2
3269 exit 1 ;;
3270 esac
3271 shift
3272 done
3273 if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
3274 check_for_receipt $ROOT
3275 # Check for post_install
3276 if grep -q ^post_install $ROOT$INSTALLED/$PACKAGE/receipt; then
3277 . $ROOT$INSTALLED/$PACKAGE/receipt
3278 post_install $ROOT
3279 # Log this activity
3280 [ -n "$ROOT" ] || log_pkg Reconfigured
3281 else
3282 newline
3283 _ 'Nothing to do for $PACKAGE.'
3284 fi
3285 else
3286 newline
3287 _ 'Package $PACKAGE is not installed.'
3288 _ "Install package with 'tazpkg install' or 'tazpkg get-install'"
3289 newline
3290 fi ;;
3293 shell)
3294 # TazPKG SHell
3295 if test $(id -u) = 0 ; then
3296 PROMPT="\\033[1;33mtazpkg\\033[0;39m# "
3297 else
3298 PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
3299 fi
3300 if [ ! "$2" = "--noheader" ]; then
3301 clear
3302 title 'TazPKG SHell.'
3303 _ "Type 'usage' to list all available commands or 'quit' or 'q' to exit."
3304 newline
3305 fi
3306 while true; do
3307 echo -en "$PROMPT"; read cmd
3308 case $cmd in
3309 q|quit)
3310 break ;;
3311 shell)
3312 _ 'You are already running a TazPKG SHell.' ;;
3313 su)
3314 su -c 'exec tazpkg shell --noheader' && break ;;
3315 "")
3316 continue ;;
3317 *)
3318 tazpkg $cmd ;;
3319 esac
3320 done ;;
3323 depends)
3324 # Display dependencies tree
3325 cd $INSTALLED
3326 ALL_DEPS=""
3327 if [ -f $2/receipt ]; then
3328 dep_scan $2 ""
3329 fi ;;
3332 rdepends)
3333 # Display reverse dependencies tree
3334 cd $INSTALLED
3335 ALL_DEPS=""
3336 if [ -f $2/receipt ]; then
3337 rdep_scan $2
3338 fi ;;
3341 convert|-c)
3342 # convert misc package format to .tazpkg
3343 check_for_package_file
3344 [ -n "$TARGET_DIR" -a -s "$TARGET_DIR/files.list.lzma" ] &&
3345 TMPLOCALSTATE="$TARGET_DIR"
3346 if [ "$(dd if=$PACKAGE_FILE bs=8 count=1 skip=1 2> /dev/null)" \
3347 == "debian-b" ]; then
3348 convert_deb
3349 else
3350 case "$PACKAGE_FILE" in
3351 *.deb|*.udeb)
3352 convert_deb;;
3353 *.rpm)
3354 convert_rpm;;
3355 *.sb)
3356 convert_sb;;
3357 *.sfs)
3358 convert_sfs;;
3359 *.pet)
3360 convert_pet;;
3361 *.tgz)
3362 convert_tgz;;
3363 *.apk|*.pkg.tar.gz|*.pkg.tar.xz)
3364 convert_arch;;
3365 *.ipk|*.opk)
3366 convert_ipk;;
3367 *.spack)
3368 convert_spack;;
3369 *.tar.bz2)
3370 convert_upkg;;
3371 *)
3372 _ 'Unsupported format' ;;
3373 esac
3374 fi ;;
3377 link)
3378 # link a package from another slitaz installation
3379 PACKAGE=$2
3380 if [ ! -d "$TARGET_DIR" -o \
3381 ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
3382 _n "
3383 usage: tazpkg link package_name slitaz_root
3384 example: 'tazpkg link openoffice /mnt' will use less than 100k in
3385 your running system ram.
3387 exit 1
3388 fi
3389 if [ -e "$INSTALLED/$PACKAGE" ]; then
3390 _ '$PACKAGE is already installed.'
3391 exit 1
3392 fi
3393 ln -s $TARGET_DIR$INSTALLED/$PACKAGE $INSTALLED
3394 DEPENDS="$(. $INSTALLED/$PACKAGE/receipt ; echo $DEPENDS)"
3395 MISSING=""
3396 for i in $DEPENDS; do
3397 [ -e $INSTALLED/$i ] && continue
3398 MISSING="$MISSING$i "
3399 _ 'Missing: $i'
3400 done
3401 if [ -n "$MISSING" ]; then
3402 newline
3403 _n 'Link all missing dependencies'; confirm
3404 answer=$?
3405 newline
3406 if [ $answer = 0 ]; then
3407 for i in $MISSING; do
3408 tazpkg link $i $TARGET_DIR
3409 done
3410 else
3411 newline
3412 _ 'Leaving dependencies unresolved for: $PACKAGE'
3413 _ 'The package is installed but probably will not work.'
3414 newline
3415 fi
3416 fi
3417 . $INSTALLED/$PACKAGE/receipt
3418 if grep -q ^pre_install $INSTALLED/$PACKAGE/receipt; then
3419 pre_install
3420 fi
3421 while read path; do
3422 [ -e $path ] && continue
3423 while true; do
3424 dir=$(dirname $path)
3425 [ -e $dir ] && break
3426 path=$dir
3427 done
3428 ln -s $TARGET_DIR$path $dir
3429 done < $INSTALLED/$PACKAGE/files.list
3430 if grep -q ^post_install $INSTALLED/$PACKAGE/receipt; then
3431 post_install
3432 fi ;;
3435 usage|*)
3436 # Print a short help or give usage for an unknown or empty command.
3437 usage ;;
3438 esac
3440 exit 0