Date: Sun, 12 Dec 2010 00:07:56 +0000 (UTC) From: Doug Barton <dougb@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r216388 - user/dougb/portmaster Message-ID: <201012120007.oBC07ud5022012@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dougb Date: Sun Dec 12 00:07:56 2010 New Revision: 216388 URL: http://svn.freebsd.org/changeset/base/216388 Log: Introduce get_answer() to handle processing of y/n questions that we want to be able to override on the command line with either -y or -n Utilize this new function to provide -y|n support for the following: -e, -s, --clean-distfiles, --clean-packages, --check-port-dbdir, and --check-depends. This also allows me to deprecate the horribly hacky --clean-distfiles-all and --clean-packages-all in favor of -y. Sort usage() to group features that use -y|n support, which also better reflects "do stuff" features vs. "list stuff" Update recommendations to use --clean-distfiles to include [-y], not [-all] For -s, if the user chooses not to delete the stale port flip the question about continuing to list it as a dependency, and correspondingly flip the default. This has no effect on -y (the condition is never reached) but allows -n to work reliably, and preserving the same default action (to delete the empty +REQUIRED_BY) reduces POLA. Modified: user/dougb/portmaster/portmaster Modified: user/dougb/portmaster/portmaster ============================================================================== --- user/dougb/portmaster/portmaster Sun Dec 12 00:07:27 2010 (r216387) +++ user/dougb/portmaster/portmaster Sun Dec 12 00:07:56 2010 (r216388) @@ -295,22 +295,20 @@ usage () { echo '' echo "${0##*/} -[l|L]" echo '' - echo "${0##*/} [-b D|d] -e <name/glob of a single port directory in $pdb>" - echo "${0##*/} [-b D|d] -s" + echo "${0##*/} --list-origins" echo '' echo "${0##*/} [--force-config|-G] [-aftv] -F" echo '' - echo "${0##*/} [-t] --clean-distfiles" - echo "${0##*/} [-t] --clean-distfiles-all" + echo "${0##*/} [-n|y] [-b D|d] -e <name/glob of a single port directory in $pdb>" + echo "${0##*/} [-n|y] [-b D|d] -s" echo '' - echo "${0##*/} [--index] --clean-packages" - echo "${0##*/} [--index] --clean-packages-all" + echo "${0##*/} [-n|y] [-t] --clean-distfiles" echo '' - echo "${0##*/} --check-depends" + echo "${0##*/} [-n|y] [--index] --clean-packages" echo '' - echo "${0##*/} --check-port-dbdir [-v]" + echo "${0##*/} [-n|y] --check-depends" echo '' - echo "${0##*/} --list-origins" + echo "${0##*/} [-n|y] [-v] --check-port-dbdir" echo '' echo "${0##*/} -h|--help" echo "${0##*/} --version" @@ -375,11 +373,11 @@ usage () { echo '[--force-config|-G] [-aftv] -F fetch distfiles only' echo '' echo '[-t] --clean-distfiles offer to delete stale distfiles' - echo '[-t] --clean-distfiles-all delete stale distfiles without prompting' + echo '[-t] -y --clean-distfiles delete stale distfiles without prompting' echo ' with -t distfile is valid from any port, not just those installed' echo '' echo '[--index] --clean-packages offer to delete stale packages' - echo '[--index] --clean-packages-all delete stale packages without prompting' + echo '[--index] -y --clean-packages delete stale packages without prompting' echo '' echo '--check-depends cross-check and update dependency information for all ports' echo '' @@ -504,9 +502,11 @@ for var in "$@" ; do --help) usage 0 ;; --version) version ; exit 0 ;; --clean-distfiles) CLEAN_DISTFILES=clean_distfiles ;; - --clean-distfiles-all) CLEAN_DISTFILES=clean_distfiles_all ; ALL=cda ;; + --clean-distfiles-all) echo "===>>> The -all form is deprecated, please use -y instead" + CLEAN_DISTFILES=clean_distfiles ; PM_YES=yopt ;; --clean-packages) CLEAN_PACKAGES=clean_packages ;; - --clean-packages-all) CLEAN_PACKAGES=clean_packages_all ; ALL=cdp ;; + --clean-packages-all) echo "===>>> The -all form is deprecated, please use -y instead" + CLEAN_PACKAGES=clean_packages ; PM_YES=yopt ;; --check-depends) CHECK_DEPENDS=check_depends ;; --check-port-dbdir) CHECK_PORT_DBDIR=check_port_dbdir ;; --list-origins) LIST_ORIGINS=list_origins ;; @@ -832,6 +832,38 @@ check_dependency_files () { return 0 } +# Takes a default value and message as input +# Return values: +# 0 - Answer is "Yes" +# 1 - Answer is "No" +# +get_answer () { + local default answer + + default=$1 ; shift + + while : ; do + if [ -z "$PM_YES" -a -z "$NO_ACTION" ]; then + echo -n " ===>>> ${*}? y/n [${default}] " + read answer + echo '' + else + if [ -n "$PM_YES" ]; then + answer=y + elif [ -n "$NO_ACTION" ]; then + answer=n + fi + fi + + case "$answer" in + [yY]) return 0 ;; + [nN]) return 1 ;; + '') [ "$default" = y ] && return 0 || return 1 ;; + *) echo " ===>>> $answer is not a valid response" ; echo '' ;; + esac + done +} + update_contents () { local IFS delete contents origin n_port old_origin iport new_cont local o_seen line d_missing d_origin d_iport prev_line answer @@ -871,20 +903,8 @@ IFS=' echo " ===>>> but there is no installed version" echo '' if [ -n "$CHECK_DEPENDS" ]; then - if [ -z "$PM_YES" -a -z "$NO_ACTION" ]; then - echo -n " ===>>> Delete this dependency data? y/n [n] " - read answer - echo '' - else - if [ -n "$PM_YES" ]; then - answer=y - elif [ -n "$NO_ACTION" ]; then - answer=n - fi - fi - case "$answer" in - [yY]) unset prev_line line ; continue ;; - esac + get_answer n Delete this dependency data + case "$?" in 0) unset prev_line line ; continue ;; esac else echo " ===>>> Try ${0##*/} --check-depends" echo '' @@ -1182,16 +1202,11 @@ if [ -n "$CLEAN_DISTFILES" ]; then for df in `find $DISTDIR -type f | sort`; do f=${df#$DISTDIR} if ! grep -ql $f $DI_FILES; then - if [ -z "$ALL" ]; then - echo -n "===>>> Delete stale file: ${f}? y/n [y] " - read answer - else - answer=y - fi - case "$answer" in - [yY]|'') echo " Deleting $f" ; echo '' - pm_unlink $df ;; - *) continue ;; + get_answer n Delete stale file: ${f} + case "$?" in + 0) echo " Deleting $f" ; echo '' + pm_unlink $df ;; + *) continue ;; esac fi done @@ -1227,14 +1242,13 @@ if [ -n "$CLEAN_PACKAGES" ]; then if [ -n "$port_ver" ]; then if [ "${port_ver}.tbz" = "${package##*/}" ]; then echo "===>>> ${package##*/} is up to date" - if [ -z "$ALL" ]; then + if [ -z "$PM_YES" ]; then if [ ! -d "${pdb}/${pkg_dir}" ]; then echo " ===>>> $pkg_dir is not installed" - echo -n " ===>>> Delete stale package: ${package##*/}? y/n [y] " - read answer - case "$answer" in - [yY]|'') echo " ===>>> Deleting $package" - pm_unlink_s $package ;; + get_answer y Delete stale package: ${package##*/} + case "$?" in + 0) echo " ===>>> Deleting $package" + pm_unlink_s $package ;; esac fi fi @@ -1256,17 +1270,11 @@ if [ -n "$CLEAN_PACKAGES" ]; then echo " ===>>> Path: ${package}" - if [ -z "$ALL" ]; then - echo -n " ===>>> Delete stale package: ${package##*/}? y/n [y] " - read answer - else - answer=y - fi - case "$answer" in - [yY]|'') echo " ===>>> Deleting $package" - pm_unlink_s $package ;; + get_answer n Delete stale package: ${package##*/} + case "$?" in + 0) echo " ===>>> Deleting $package" + pm_unlink_s $package ;; esac - done echo '' ; echo '' @@ -1384,11 +1392,8 @@ if [ -n "$CHECK_PORT_DBDIR" ]; then *:${dbdir}:*) pm_v "Ok" ;; *) pm_v echo " ===>>> $dbdir does not seem to be installed" - echo -n " ===>>> Delete ${dir}? y/n [n] " - read answer - case "$answer" in - [yY]) pm_rm_s -rf $dir ;; - esac + get_answer n Delete ${dir} + case "$?" in 0) pm_rm_s -rf $dir ;; esac echo '' ;; esac done @@ -1749,7 +1754,7 @@ set_distfiles_and_subdir () { echo "===>>> $port_subdir does not exist, therefore we" echo ' will assume that all relevant distfiles are gone.' echo '' - echo " Try ${0##*/} --clean-distfiles[-all] for a full cleanup" + echo " Try ${0##*/} [-y] --clean-distfiles for a full cleanup" echo '' return 3 fi @@ -1813,7 +1818,7 @@ delete_all_distfiles () { case "$rc" in 1) echo '' echo "===>>> No $pd/$origin exists to find the distfile list" - echo " Try ${0##*/} --clean-distfiles[-all] for a full cleanup" + echo " Try ${0##*/} [-y] --clean-distfiles for a full cleanup" echo '' if [ -n "$dist_list_files" ]; then local answer f @@ -1938,10 +1943,9 @@ if [ -n "$EXPUNGE" ]; then dep=${dep%/+CON*} ; echo " ${dep##*/}" done echo '' - echo -n "===>>> Delete this dependency data? y/n [n] " - read answer - case "$answer" in - [yY]) for f in $deplist; do + get_answer n Delete this dependency data + case "$?" in + 0) for f in $deplist; do update_contents delete $f $origin done ;; *) exit 1 ;; @@ -1984,10 +1988,9 @@ if [ -n "$CLEAN_STALE" ]; then pkg_info $iport - echo -n "===>>> ${iport} is no longer depended on, delete? y/n [n] " - read answer - case "$answer" in - [yY]) [ -n "$BACKUP" ] && { init_packages ; pm_pkg_create $pbu $iport; } + get_answer n ${iport} is no longer depended on, delete + case "$?" in + 0) [ -n "$BACKUP" ] && { init_packages ; pm_pkg_create $pbu $iport; } [ -z "$DONT_SCRUB_DISTFILES" ] && delete_all_distfiles $origin delete_dist_list @@ -1995,11 +1998,10 @@ if [ -n "$CLEAN_STALE" ]; then pm_pkg_delete_s -f $iport || fail 'pkg_delete failed' exec $0 -s $ARGS ;; - *) echo -n " ===>>> Keep listing $iport as a dependency? y/n [n] " - read answer - case "$answer" in - [yY]) no_del_list="${no_del_list}${iport}:" ;; - *) pm_unlink_s $file ;; + *) get_answer y Delete this dependency data + case "$?" in + 0) pm_unlink_s $file ;; + *) no_del_list="${no_del_list}${iport}:" ;; esac ;; esac done
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012120007.oBC07ud5022012>