3 # $Id: pkg_chk.sh,v 1.65 2009/07/22 21:56:13 sketch Exp $
5 # TODO: Make -g check dependencies and tsort
6 # TODO: Make -g list user-installed packages first, followed by commented
7 # out automatically installed packages
8 # TODO: List user-installed packages that are not in config
10 PATH=${PATH}:/usr/sbin:/usr/bin
12 SUMMARY_FILE=pkg_summary.gz
13 OLD_SUMMARY_FILE=pkg_chk-summary
17 if [ -n "$PKGDB" ]; then
18 for iba_pkg in $PKGDB; do
27 if [ -f "$PACKAGES/$1$PKG_SUFX" ]; then
37 ${AWK} '/^PKGNAME=/ {sub("^PKGNAME=", ""); PKGNAME=$0} \
38 /^PKGPATH=/ {sub("^PKGPATH=", ""); printf("%s:%s ", $0, PKGNAME)}'
41 check_packages_installed()
48 if [ -n "$opt_B" ];then
49 extract_pkg_vars $pkgdir PKGNAME FILESDIR PKGDIR DISTINFO_FILE PATCHDIR
50 elif [ -n "$opt_s" ] ; then
51 extract_pkg_vars $pkgdir PKGNAME
53 PKGNAME=`pkgdir2pkgname $pkgdir`
55 if [ -z "$PKGNAME" ]; then
56 MISS_DONE=$MISS_DONE" "$pkgdir
59 if [ ! -d $PKG_DBDIR/$PKGNAME ];then
61 pkg=$(echo $PKGNAME | ${SED} 's/-[0-9].*//')
62 pkginstalled=$(sh -c "${PKG_INFO} -e $pkg" || true)
64 if [ -n "$pkginstalled" ];then
65 msg_n "$pkginstalled < $PKGNAME"
66 MISMATCH_TODO="$MISMATCH_TODO $pkginstalled"
68 msg_n "$PKGNAME missing"
69 MISSING_TODO="$MISSING_TODO $PKGNAME $pkgdir"
71 if is_binary_available $PKGNAME ;then
72 msg_n " (binary package available)"
76 if [ -n "$opt_B" ];then
77 # sort here temporarily to handle older +BUILD_VERSION
78 current_build_ver=$(get_build_ver | ${SED} 's|.*\$Net''BSD\: ||' | ${SORT} -u)
79 installed_build_ver=$(${SED} 's|.*\$Net''BSD\: ||' $PKG_DBDIR/$PKGNAME/+BUILD_VERSION | ${SORT} -u)
80 if [ x"$current_build_ver" != x"$installed_build_ver" ];then
81 msg "$pkgdir - $PKGNAME build_version mismatch"
83 verbose "$current_build_ver"
84 verbose "--installed--"
85 verbose "$installed_build_ver"
87 MISMATCH_TODO="$MISMATCH_TODO $PKGNAME"
89 verbose "$PKGNAME: OK"
92 verbose "$PKGNAME: OK"
108 if [ -d $PKG_DBDIR/$pkg ] ; then
109 run_cmd_su "${PKG_DELETE} -r $pkg" 1
118 MAKEDATA=".PHONY: x\nx:\n";
120 MAKEDATA=$MAKEDATA"\t@echo $var=\${$var}\n"
122 eval $(printf "$MAKEDATA" | ${MAKE} -f - -f $MAKEFILE x | \
123 ${SED} -e 's/[^=]*=/&"/' -e 's/$/"/')
129 # $1 = name of variable
133 if [ -z "`eval echo \\$$1`" ] ; then
134 eval $(printf "BSD_PKG_MK=1\n.PHONY: x\nx:\n\t@echo $1="'$'"{$1}\n" | ${MAKE} -f - -f $MAKECONF x)
135 if [ -z "`eval echo \\$$1`" ]; then
137 verbose_var $1 '(using default)'
149 if [ ! -f $PKGSRCDIR/$pkgdir/Makefile ];then
150 msg "WARNING: No $pkgdir/Makefile - package moved or obsolete?"
153 cd $PKGSRCDIR/$PKGDIR
154 extract_make_vars Makefile "$@"
155 if [ -z "$PKGNAME" ]; then
156 fatal "Unable to extract PKGNAME for $pkgdir"
162 extract_mk_var PKGSRCDIR ''
163 extract_mk_var LOCALBASE ''
164 if [ -z "$PKGSRCDIR" ] ; then
165 for dir in $LOCALBASE/pkgsrc /usr/pkgsrc . .. ../.. ; do
166 if [ -f "${dir}/mk/bsd.pkg.mk" ]; then
168 /*) PKGSRCDIR="${dir}" ;;
169 *) PKGSRCDIR="$( cd "${dir}" >/dev/null 2>&1 && pwd )" ;;
176 if [ -z "$opt_g" ]; then
177 # Now we have PKGSRCDIR, use it to determine PACKAGES, and PKGCHK_CONF
178 # as well as AWK, GREP, SED, PKGCHK_TAGS and PKGCHK_NOTAGS
180 if [ ! -d "$PKGSRCDIR" -a \( -z "$opt_b" -o -n "$opt_s" \) ] ; then
181 fatal "Unable to locate PKGSRCDIR (${PKGSRCDIR:-not set})"
183 if [ -z "$opt_b" -o -n "$opt_s" -o -d $PKGSRCDIR/pkgtools/pkg_chk ] ;
185 cd $PKGSRCDIR/pkgtools/pkg_chk
186 extract_make_vars Makefile \
187 AWK GREP GZCAT GZIP_CMD ID PACKAGES PKGCHK_CONF PKGCHK_NOTAGS \
188 PKGCHK_TAGS PKGCHK_UPDATE_CONF PKG_ADD PKG_DBDIR \
189 PKG_DELETE PKG_ADMIN PKG_INFO PKG_SUFX SED SORT SU_CMD TSORT
190 if [ -z "$PACKAGES" ];then
191 PACKAGES=$PKGSRCDIR/packages
193 elif [ $MAKECONF != /dev/null ] ; then
194 extract_make_vars $MAKECONF PACKAGES PKGCHK_CONF \
195 PKGCHK_UPDATE_CONF PKGCHK_TAGS PKGCHK_NOTAGS PKG_SUFX
196 if [ -z "$PACKAGES" ] ; then
202 # .tgz/.tbz to regexp
203 PKG_SUFX_RE=`echo $PKG_SUFX | ${SED} 's/[.]/[.]/'`
205 if [ ! -d $PKG_DBDIR ] ; then
206 fatal "Unable to access PKG_DBDIR ($PKG_DBDIR)"
209 if [ -z "$PKGCHK_CONF" ];then
210 PKGCHK_CONF=$PKGSRCDIR/pkgchk.conf
212 if [ -z "$PKGCHK_UPDATE_CONF" ];then
213 PKGCHK_UPDATE_CONF=$PKGSRCDIR/pkgchk_update-$(hostname).conf
231 if [ "$fatal_later" = 1 ] ; then
238 if [ -z "$opt_k" ];then
245 generate_conf_from_installed()
248 if [ -r $FILE ]; then
251 echo "# Generated automatically at $(date)" > $FILE
252 echo $(pkgdirs_from_installed) | tr ' ' '\n' >> $FILE
257 summary_file=$PACKAGES/$SUMMARY_FILE
258 if [ -f $summary_file ] ; then
259 if [ -z "$(find $PACKAGES -type f -newer $summary_file -name '*.t[bg]z')" ] ; then
260 msg_progress Reading $summary_file
261 ${GZCAT} $summary_file
264 echo "*** Ignoring $SUMMARY_FILE as PACKAGES contains newer files" >&2
266 msg_progress Scan $PACKAGES
267 list_bin_pkgs | ${XARGS} ${PKG_INFO} -X
272 if [ -n "$opt_b" -a -z "$opt_s" ] ; then
273 ${PKG_INFO} -q -b $PACKAGES/$PKGNAME$PKG_SUFX | ${GREP} .
276 # Unfortunately pkgsrc always outputs to a file, but it does
277 # helpfully allows us to specify the name
279 ${MAKE} _BUILD_VERSION_FILE=$MY_TMPFILE $MY_TMPFILE
285 ls -t $PACKAGES | grep "$PKG_SUFX_RE"'$' | ${SED} "s|^|$PACKAGES/|"
288 # Given a binary package filename as the first argumennt, return a list
289 # of exact package versions against which it was built and on which it
294 ${PKG_INFO} -q -n $1 | ${GREP} .. || true
297 # Pass a list of pkgdirs, outputs a tsorted list including any dependencies
301 # Convert passed in list of pkgdirs to a list of binary package files
303 for pkgdir in $* ; do
304 pkgname=`pkgdir2pkgname $pkgdir`
305 if [ -z "$pkgname" ]; then
306 fatal_later "$pkgdir - Unable to extract pkgname"
309 if is_binary_available $pkgname ; then
310 pkglist="$pkglist $pkgname$PKG_SUFX"
312 fatal_later "$pkgname - no binary package found"
316 # Variables used in this loop:
317 # pkglist: Current list of binary package files to check for dependencies
318 # next_pkglist: List of binary package files to check after pkglist
319 # pairlist: completed list of package + dependency for use in tsort
320 while [ -n "$pkglist" ] ; do
321 verbose "pkglist: $pkglist"
322 for pkg in $pkglist ; do
324 deplist="$(list_dependencies $PACKAGES/$pkg)"
325 verbose "$pkg: dependencies - `echo $deplist`"
326 if [ -n "$deplist" ] ; then
327 for depmatch in $deplist ; do
328 dep=`${PKG_ADMIN} -b -d $PACKAGES lsbest "$depmatch"`
329 if [ -z "$dep" ] ; then
330 fatal_later "$depmatch: dependency missing for $pkg"
332 pairlist="$pairlist$dep $pkg\n"
335 # depmatch_cache is a quick cache of already
336 verbose "$pkg: $deplist - cached"
339 next_pkglist="$next_pkglist $dep"
340 dep_cache="$dep_cache $dep "
346 pairlist="$pairlist$pkg $pkg\n"
350 pkglist="$next_pkglist"
353 if [ -z "$opt_k" ] ; then
356 printf "$pairlist" | ${TSORT}
362 for pkgline in $PKGDB ; do
365 echo $pkgline | ${SED} 's/[^:]*://'
376 if [ ! -r $CONF ];then
377 fatal "Unable to read PKGCHK_CONF '$CONF'"
380 # Determine list of tags
382 if [ "$PKGSRCDIR" = NONE ]; then
384 OS_VERSION=$(uname -r)
385 MACHINE_ARCH=$(uname -p)
387 extract_make_vars Makefile OPSYS OS_VERSION MACHINE_ARCH
390 TAGS="$(hostname | ${SED} -e 's,\..*,,'),$(hostname),$OPSYS-$OS_VERSION-$MACHINE_ARCH,$OPSYS-$OS_VERSION,$OPSYS-$MACHINE_ARCH,$OPSYS,$OS_VERSION,$MACHINE_ARCH"
391 if [ -f /usr/X11R6/lib/libX11.so -o -f /usr/X11R6/lib/libX11.a ];then
394 if [ -n "$PKGCHK_TAGS" ];then
395 TAGS="$TAGS,$PKGCHK_TAGS"
397 if [ -n "$PKGCHK_NOTAGS" ];then
398 if [ -n "$opt_U" ];then
399 opt_U="$opt_U,$PKGCHK_NOTAGS"
401 opt_U="$PKGCHK_NOTAGS"
405 # If '-U' contains a '*' then we need to unset TAGS and PKGCHK_TAGS, but
406 # still pick up -D, and even package specific -U options
407 verbose "unset TAGS=$opt_U"
413 if [ -n "$TAGS" ];then
414 if [ -n "$opt_D" ];then
420 verbose "set TAGS=$opt_D"
422 # Extract list of valid pkgdirs (skip any 'alreadyset' in $LIST)
424 LIST="$LIST "$(${AWK} -v alreadyset="$LIST" -v setlist="$opt_D" -v unsetlist="$opt_U" '
426 split(alreadyset, tmp, " ");
427 for (tag in tmp) { skip[tmp[tag]] = 1; }
429 split(setlist, tmp, ",");
430 for (tag in tmp) { taglist[tmp[tag]] = 1; }
432 split(unsetlist, tmp, ",");
433 for (tag in tmp) { skip[tmp[tag]] = 1; nofile[tmp[tag]] = 1 ;
434 delete taglist[tmp[tag]] }
438 function and_expr_with_dict(expr, dict, ary, i, r, d) {
439 split(expr,ary,/\+/);
442 if (ary[i] ~ /^\// && ! nofile[ary[i]]) {
443 if (getline d < ary[i] == -1)
446 else if (! (ary[i] in dict))
457 split($0, tmp, "[ \t]*=");
464 if (NF == 1) # If only one arg, we want pkg
467 for (f = 2 ; f<=NF ; ++f) { # For each word on the line
468 if (sub("^-", "", $f)) { # If it begins with a '-'
469 if (f == 2) # If first entry '-', assume '*'
471 if (and_expr_with_dict($f, taglist))
472 next; # If it is true, discard
474 if (and_expr_with_dict($f, taglist))
475 need = 1; # If it is true, note needed
480 taglist[taggroup] = 1
489 pkgdirs_from_installed()
491 ${PKG_INFO} -Bqa | ${AWK} -F= '/^PKGPATH=/{print $2}' | ${SORT}
496 if [ -n "$opt_L" ] ; then
497 echo "$@" >> "$opt_L"
499 if [ -n "$opt_l" ] ; then
508 if [ -z "$opt_q" ] ; then
523 run_cmd "cd $PKGSRCDIR/$PKGDIR && ${MAKE} fetch-list | sh"
524 if [ -n "$FAIL" ]; then
525 FAIL_DONE=$FAIL_DONE" "$PKGNAME
527 FETCH_DONE=$FETCH_DONE" "$PKGNAME
535 while [ $# != 0 ]; do
548 if [ -d $PKG_DBDIR/$PKGNAME ];then
549 msg "$PKGNAME installed in previous stage"
550 run_cmd_su "${PKG_ADMIN} unset automatic $PKGNAME"
551 elif [ -n "$opt_b" ] && is_binary_available $PKGNAME; then
552 if [ -n "$saved_PKG_PATH" ] ; then
553 export PKG_PATH=$saved_PKG_PATH
555 run_cmd_su "${PKG_ADD} $PACKAGES/$PKGNAME$PKG_SUFX"
556 if [ -n "$saved_PKG_PATH" ] ; then
559 elif [ -n "$opt_s" ]; then
560 run_cmd "cd $PKGSRCDIR/$PKGDIR && ${MAKE} update CLEANDEPENDS=yes"
563 if [ -z "$opt_n" -a -z "$opt_q" -a ! -d $PKG_DBDIR/$PKGNAME ];then
567 if [ -n "$FAIL" ]; then
568 FAIL_DONE=$FAIL_DONE" "$PKGNAME
570 INSTALL_DONE=$INSTALL_DONE" "$PKGNAME
577 msg_progress $INSTALL
578 while [ $# != 0 ]; do
579 pkg_install $1 $2 $INSTALL
592 if [ -z "$opt_q" ];then
595 if [ -z "$opt_n" -a -z "$opt_q" ];then
596 if [ -n "$opt_L" ] ; then
597 sh -c "$1" >> "$opt_L" 2>&1 || FAIL=1
601 if [ -n "$FAIL" ] ; then
603 if [ -n "$opt_L" ] ; then
604 tail -100 "$opt_L" | egrep -v '^(\*\*\* Error code 1|Stop\.)' |\
607 if [ "$FAILOK" != 1 ]; then
608 fatal "** '$1' failed"
616 if [ -n "$SU_CMD" ]; then
617 run_cmd "${SU_CMD} '$1'" "$2"
629 *) echo $basedir/$arg ;;
635 if [ -n "$1" ] ; then
639 echo 'Usage: pkg_chk [opts]
640 -a Add all missing packages
641 -B Check the "Build version" of packages
642 -b Use binary packages
643 -C conf Use pkgchk.conf file 'conf'
644 -D tags Comma separated list of additional pkgchk.conf tags to set
645 -f Perform a 'make fetch' for all required packages
646 -g Generate an initial pkgchk.conf file
648 -k Continue with further packages if errors are encountered
649 -L file Redirect output from commands run into file (should be fullpath)
650 -l List binary packages including dependencies
651 -N List installed packages for which a newer version is in TODO
652 -n Display actions that would be taken, but do not perform them
653 -p Display the list of pkgdirs that match the current tags
654 -P dir Set PACKAGES dir (overrides any other setting)
655 -q Do not display actions or take any action; only list packages
656 -r Recursively remove mismatches (use with care)
657 -s Use source for building packages
658 -U tags Comma separated list of pkgchk.conf tags to unset ('*' for all)
659 -u Update all mismatched packages
662 pkg_chk verifies installed packages against pkgsrc.
663 The most common usage is 'pkg_chk -u -q' to check all installed packages or
664 'pkg_chk -u' to update all out of date packages.
665 For more advanced usage, including defining a set of desired packages based
666 on hostname and type, see pkg_chk(8).
668 If neither -b nor -s is given, both are assumed with -b preferred.
675 if [ -n "$opt_v" ] ; then
682 if [ -n "$opt_v" ] ; then
685 verbose Variable $var = $(eval echo \$$var) $@
689 args=$(getopt BC:D:L:P:U:abcfghiklNnpqrsuv "$@")
693 set -o noglob # -U can be '*'
696 while [ $# != 0 ]; do
701 -C ) opt_C="$2" ; shift ;;
702 -c ) opt_a=1 ; opt_q=1 ; echo "-c is deprecated - use -a -q" ;;
703 -D ) opt_D="$2" ; shift ;;
707 -i ) opt_u=1 ; opt_q=1 ; echo "-i is deprecated - use -u -q" ;;
709 -L ) opt_L="$2" ; shift ;;
714 -P ) opt_P="$2" ; shift ;;
718 -U ) opt_U="$2" ; shift ;;
726 if [ -z "$opt_b" -a -z "$opt_s" ];then
730 if [ -z "$opt_a$opt_g$opt_l$opt_p$opt_r$opt_u$opt_N" ];
732 usage "Must specify at least one of -a, -g, -l, -p, -r, -u or -N";
735 if [ -n "$opt_h" ];then
740 usage "Additional argument ($*) given"
743 # Hide PKG_PATH to avoid breakage in 'make' calls
744 saved_PKG_PATH=$PKG_PATH
745 unset PKG_PATH || true
747 test -n "$AWK" || AWK="@AWK@"
748 test -n "$GREP" || GREP="@GREP@"
749 test -n "$GZCAT" || GZCAT="@GZCAT@"
750 test -n "$GZIP_CMD" || GZIP_CMD="@GZIP_CMD@"
752 test -n "$ID" || ID="@ID@"
753 test -n "$MAKE" || MAKE="@MAKE@"
754 test -n "$MAKECONF" || MAKECONF="@MAKECONF@"
755 test -n "$MKTEMP" || MKTEMP="@MKTEMP@"
756 test -n "$PKG_ADD" || PKG_ADD="@PKG_ADD@"
757 test -n "$PKG_ADMIN" || PKG_ADMIN="@PKG_ADMIN@"
758 test -n "$PKG_DBDIR" || PKG_DBDIR="@PKG_DBDIR@"
759 test -n "$PKG_DELETE" || PKG_DELETE="@PKG_DELETE@"
760 test -n "$PKG_INFO" || PKG_INFO="@PKG_INFO@"
761 test -n "$SED" || SED="@SED@"
762 test -n "$SORT" || SORT="@SORT@"
763 test -n "$TSORT" || TSORT="@TSORT@"
764 test -n "$XARGS" || XARGS="@XARGS@"
766 MY_TMPDIR=`${MKTEMP} -d ${TMPDIR-/tmp}/${0##*/}.XXXXXX`
767 test -n "$MY_TMPDIR" || fatal "Couldn't create temporary directory."
768 MY_TMPFILE=$MY_TMPDIR/tmp
770 if [ -z "$MAKECONF" ] ; then
771 for mkconf in "@MAKECONF@" "@PREFIX@/etc/mk.conf" /etc/mk.conf ; do
772 if [ -f "$mkconf" ] ; then
778 if [ -z "$MAKECONF" -o ! -f "$MAKECONF" ] ; then
783 # grabbed from GNU configure
784 if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
785 # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
786 if (echo -n testing; echo 1,2,3) | ${SED} s/-n/xn/ | grep xn >/dev/null; then
793 ac_n= ac_c='\c' ac_t=
796 if [ -n "$opt_L" ] ; then
802 if [ -n "$opt_C" ] ; then
803 PKGCHK_CONF="$(set_path $opt_C)"
805 if [ -n "$opt_P" ] ; then
806 PACKAGES="$(set_path $opt_P)"
808 if [ -d $PACKAGES/All ] ; then
809 PACKAGES="$PACKAGES/All"
812 if [ "`${ID} -u`" = 0 ] ; then
816 if [ -n "$opt_N" ]; then
818 ${SED} -e "s/[ ].*//" -e "s/-[^-]*$//" \
819 -e "s/py[0-9][0-9]pth-/py-/" \
820 -e "s/py[0-9][0-9]-/py-/" | \
823 b=$(grep "o $a-[0-9]" $PKGSRCDIR/doc/TODO | \
824 ${SED} -e "s/[ ]*o //")
832 AWK_PARSE_SUMMARY='$1=="PKGNAME"{pkgname=$2} $1=="PKGPATH"{pkgpath=$2} NF==0{if (pkgpath && pkgname) print pkgpath ":" pkgname; pkgpath=""; pkgname=""} END{if (pkgpath && pkgname) print pkgpath ":" pkgname}'
834 if [ -n "$opt_b" -a -z "$opt_s" ] ; then
837 PKGDB=`ftp -o - $PACKAGES/$SUMMARY_FILE | ${GZIP_CMD} -cd \
838 | ${AWK} -F= "$AWK_PARSE_SUMMARY"`
841 PKGDB=`ftp -o - $PACKAGES/$OLD_SUMMARY_FILE`
844 if [ -d "$PACKAGES" ] ; then
845 PKGDB=$(get_bin_pkg_info | bin_pkg_info2pkgdb)
851 if [ -n "$opt_g" ]; then
852 verbose "Write $PKGCHK_CONF based on installed packages"
853 generate_conf_from_installed $PKGCHK_CONF
856 if [ -n "$opt_r" -o -n "$opt_u" ];then
857 verbose "Enumerate PKGDIRLIST from installed packages"
858 PKGDIRLIST=$(pkgdirs_from_installed)
861 if [ -n "$opt_p" ] ; then
862 pkgdirs_from_conf $PKGCHK_CONF $PKGDIRLIST | tr ' ' '\n'
866 if [ -n "$opt_a" -o -n "$opt_l" ];then # Append to PKGDIRLIST based on conf
867 verbose "Append to PKGDIRLIST based on config $PKGCHK_CONF"
868 PKGDIRLIST="$(pkgdirs_from_conf $PKGCHK_CONF $PKGDIRLIST)"
871 if [ -n "$opt_l" ] ; then
872 list_packages $PKGDIRLIST
874 check_packages_installed $PKGDIRLIST
877 if [ -n "$MISMATCH_TODO" ]; then
879 elif [ -n "$opt_u" -a -f $PKGCHK_UPDATE_CONF ] ; then
883 if [ -n "$delete_and_recheck" ]; then
884 if [ -n "$opt_u" ] ; then # Save current installed list
885 if [ -f $PKGCHK_UPDATE_CONF ] ; then
886 msg "Merging in previous $PKGCHK_UPDATE_CONF"
887 if [ -z "$opt_n" -a -z "$opt_q" ] ; then
888 tmp=$(cat $PKGCHK_UPDATE_CONF)
889 echo $tmp $(pkgdirs_from_installed) | tr ' ' '\n' | ${SORT} -u \
890 > $PKGCHK_UPDATE_CONF
894 if [ -z "$opt_n" -a -z "$opt_q" ] ; then
895 echo $(pkgdirs_from_installed) | tr ' ' '\n' \
896 > $PKGCHK_UPDATE_CONF
900 if [ -n "$opt_r" -o -n "$opt_u" ] ; then
901 if [ -n "$MISMATCH_TODO" ]; then
902 delete_pkgs $MISMATCH_TODO
903 msg_progress Rechecking packages after deletions
905 if [ -n "$opt_u" ]; then
906 PKGDIRLIST="$(pkgdirs_from_conf $PKGCHK_UPDATE_CONF $PKGDIRLIST)"
908 if [ -n "$opt_a" -o -n "$opt_u" ]; then
909 check_packages_installed $PKGDIRLIST # May need to add more
914 if [ -n "$opt_f" ] ; then
915 pkg_fetchlist $MISSING_TODO
918 if [ -n "$MISSING_TODO" ] ; then
919 if [ -n "$opt_a" -o -n "$opt_u" ] ; then
920 pkg_installlist Install $MISSING_TODO
924 if [ -n "$opt_u" -a -z "$FAIL_DONE" -a -f $PKGCHK_UPDATE_CONF ] ; then
925 run_cmd "rm -f $PKGCHK_UPDATE_CONF"
928 [ -z "$MISS_DONE" ] || msg "Missing:$MISS_DONE"
929 [ -z "$INSTALL_DONE" ] || msg "Installed:$INSTALL_DONE"
931 if [ -n "$FAIL_DONE" ] ; then
932 msg "Failed:$FAIL_DONE"