From owner-svn-src-user@FreeBSD.ORG Mon Jan 3 00:11:10 2011 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E6EAE106564A; Mon, 3 Jan 2011 00:11:10 +0000 (UTC) (envelope-from dougb@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D67A48FC14; Mon, 3 Jan 2011 00:11:10 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p030BAo7062882; Mon, 3 Jan 2011 00:11:10 GMT (envelope-from dougb@svn.freebsd.org) Received: (from dougb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p030BAaj062880; Mon, 3 Jan 2011 00:11:10 GMT (envelope-from dougb@svn.freebsd.org) Message-Id: <201101030011.p030BAaj062880@svn.freebsd.org> From: Doug Barton Date: Mon, 3 Jan 2011 00:11:10 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r216896 - user/dougb/portmaster X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Jan 2011 00:11:11 -0000 Author: dougb Date: Mon Jan 3 00:11:10 2011 New Revision: 216896 URL: http://svn.freebsd.org/changeset/base/216896 Log: Add an error check for -y and -n both supplied Add get_answer_g(), a generic version of the previous get_answer() Use this function to wrap all of the remaining cases of user input Convert get_answer() to get_answer_yn() and call get_answer_g() if we need to prompt the user, otherwise use the same logic to handle the -y and -n options. Update the callers of the former get_answer() to match. Modified: user/dougb/portmaster/portmaster Modified: user/dougb/portmaster/portmaster ============================================================================== --- user/dougb/portmaster/portmaster Sun Jan 2 23:38:05 2011 (r216895) +++ user/dougb/portmaster/portmaster Mon Jan 3 00:11:10 2011 (r216896) @@ -680,6 +680,7 @@ done shift $(( $OPTIND - 1 )) [ -n "$UNATTENDED" ] && fail 'The -u option has been deprecated' +[ -n "$PM_YES" -a -n "$NO_ACTION" ] && fail 'The -y and -n options are mutually exclusive' [ -n "$PM_EXCL" ] && export PM_EXCL @@ -886,38 +887,57 @@ check_dependency_files () { return 0 } -# Takes a default value and message as input +# Takes default value, optional value, and message as input # Return values: -# 0 - Answer is "Yes" -# 1 - Answer is "No" +# 0 - Default value chosen +# 1 - Optional value chosen # -get_answer () { - local default answer +get_answer_g () { + local default option answer - default=$1 ; shift + default=$1 ; option=$2 ; shift 2 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 + echo -n "${*} [${default}] " + read answer + echo '' + + case "$answer" in + [A-Z]) answer=`echo $answer | tr [:upper:] [:lower:]` ;; + esac case "$answer" in - [yY]) return 0 ;; - [nN]) return 1 ;; - '') [ "$default" = y ] && return 0 || return 1 ;; + ${default}|'') return 0 ;; + ${option}) return 1 ;; *) echo " ===>>> $answer is not a valid response" ; echo '' ;; esac done } +# Takes a default value and message as input +# Return values: +# 0 - Answer is "Yes" +# 1 - Answer is "No" +# +get_answer_yn () { + local default option + + default=$1 ; shift + + [ "$default" = 'y' ] && option=n || option=y + + if [ -z "$PM_YES" -a -z "$NO_ACTION" ]; then + get_answer_g $default $option "${*}? y/n" + case "${?}${default}" in + 0y|1n) return 0 ;; + 0n|1y) return 1 ;; + esac + else + [ -n "$PM_YES" ] && return 0 + return 1 + fi +} + 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 @@ -957,7 +977,7 @@ IFS=' echo " ===>>> but there is no installed version" echo '' if [ -n "$CHECK_DEPENDS" ]; then - get_answer n Delete this dependency data + get_answer_yn n Delete this dependency data case "$?" in 0) unset prev_line line ; continue ;; esac else echo " ===>>> Try ${0##*/} --check-depends" @@ -1223,7 +1243,7 @@ if [ -n "$CLEAN_DISTFILES" ]; then for df in `find $DISTDIR -type f | sort`; do f=${df#$DISTDIR} if ! grep -ql $f $DI_FILES; then - get_answer n Delete stale file: ${f} + get_answer_yn n Delete stale file: ${f} case "$?" in 0) echo " Deleting $f" ; echo '' pm_unlink $df ;; @@ -1266,7 +1286,7 @@ if [ -n "$CLEAN_PACKAGES" ]; then if [ -z "$PM_YES" ]; then if [ ! -d "${pdb}/${pkg_dir}" ]; then echo " ===>>> $pkg_dir is not installed" - get_answer y Delete stale package: ${package##*/} + get_answer_yn y Delete stale package: ${package##*/} case "$?" in 0) echo " ===>>> Deleting $package" pm_unlink_s $package ;; @@ -1291,7 +1311,7 @@ if [ -n "$CLEAN_PACKAGES" ]; then echo " ===>>> Path: ${package}" - get_answer n Delete stale package: ${package##*/} + get_answer_yn n Delete stale package: ${package##*/} case "$?" in 0) echo " ===>>> Deleting $package" pm_unlink_s $package ;; @@ -1413,7 +1433,7 @@ if [ -n "$CHECK_PORT_DBDIR" ]; then *:${dbdir}:*) pm_v "Ok" ;; *) pm_v echo " ===>>> $dbdir does not seem to be installed" - get_answer n Delete ${dir} + get_answer_yn n Delete ${dir} case "$?" in 0) pm_rm_s -rf $dir ;; esac echo '' ;; esac @@ -1647,11 +1667,8 @@ pm_pkg_create () { echo "===>>> Ignore this error [i]" echo "===>>> Abort [a]" echo '' - echo -n "===>>> How would you like to proceed? [i] " - local answer ; read answer - case "$answer" in - [aA]) fail "Package creation failed for $2" ;; - esac + get_answer_g i a "===>>> How would you like to proceed?" + case "$?" in 1) fail "Package creation failed for $2" ;; esac fi } @@ -1736,11 +1753,10 @@ find_and_delete_distfiles () { continue fi - echo -n "===>>> Delete $file? y/n [n] " - read answer - case "$answer" in - [yY]) pm_unlink $file ;; - *) distfiles_checked="${distfiles_checked}${file}:" ;; + get_answer_g n y "===>>> Delete $file? y/n" + case "$?" in + 1) pm_unlink $file ;; + 0) distfiles_checked="${distfiles_checked}${file}:" ;; esac ;; esac done @@ -1812,11 +1828,10 @@ delete_stale_distfiles () { continue fi - echo -n "===>>> Delete $file? y/n [n] " - read answer - case "$answer" in - [yY]) pm_unlink $file ;; - *) distfiles_checked="${distfiles_checked}${file}:" ;; + get_answer_g n y "===>>> Delete $file? y/n" + case "$?" in + 1) pm_unlink $file ;; + 0) distfiles_checked="${distfiles_checked}${file}:" ;; esac done fi @@ -1848,12 +1863,11 @@ delete_all_distfiles () { if [ -n "$dist_list_files" ]; then local answer f + answer=y if [ -z "$ALWAYS_SCRUB_DISTFILES" ]; then echo "===>>> However, the list of files in $dist_list" - echo -n " should be current. Delete the files on this list? y/n [n] " - read answer - else - answer=y + get_answer_g n y " should be current. Delete the files on this list? y/n" + case "$?" in 0) answer=n ;; esac fi case "$answer" in @@ -1875,15 +1889,11 @@ delete_all_distfiles () { delete_all=delete_all else echo "===>>> Delete old and new distfiles for $origin" - echo -n " without prompting? y/n [n] " - local answer ; read answer - case "$answer" in - [yY]) delete_all=delete_all2 ;; - *) echo -n "===>>> Delete the current distfiles? y/n [n] " - read answer - case "$answer" in - [yY]) delete_current=delete_current ;; - esac ;; + get_answer_g n y " without prompting? y/n" + case "$?" in + 1) delete_all=delete_all2 ;; + 0) get_answer_g n y "===>>> Delete the current distfiles? y/n" + case "$?" in 1) delete_current=delete_current ;; esac ;; esac fi @@ -1968,7 +1978,7 @@ if [ -n "$EXPUNGE" ]; then dep=${dep%/+CON*} ; echo " ${dep##*/}" done echo '' - get_answer n Delete this dependency data + get_answer_yn n Delete this dependency data case "$?" in 0) for f in $deplist; do update_contents delete $f $origin @@ -2012,7 +2022,7 @@ if [ -n "$CLEAN_STALE" ]; then pkg_info $iport - get_answer n ${iport} is no longer depended on, delete + get_answer_yn 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; } @@ -2021,7 +2031,7 @@ if [ -n "$CLEAN_STALE" ]; then pm_pkg_delete_s -f $iport || fail 'pkg_delete failed' exec $0 -s $ARGS ;; - *) get_answer y Delete this dependency data + *) get_answer_yn y Delete this dependency data case "$?" in 0) pm_unlink_s $file ;; *) no_del_list="${no_del_list}${iport}:" ;; @@ -2069,12 +2079,11 @@ check_interactive () { echo '' echo "===>>> +IGNOREME file is present for $1" fi - - echo '' ; echo -n "===>>> Update ${1}${update_to}? y/n [y] " - local answer ; read answer - case "$answer" in - [yY]|'') INTERACTIVE_YES="${INTERACTIVE_YES}${1}:" ;; - *) INTERACTIVE_NO="${INTERACTIVE_NO}${1}:" ; return 1 ;; + echo '' + get_answer_g y n "===>>> Update ${1}${update_to}? y/n" + case "$?" in + 0) INTERACTIVE_YES="${INTERACTIVE_YES}${1}:" ;; + 1) INTERACTIVE_NO="${INTERACTIVE_NO}${1}:" ; return 1 ;; esac return 0 } @@ -2489,11 +2498,9 @@ post_first_pass () { echo '' echo "===>>> The following actions will be taken if you choose to proceed:" echo -e "$build_l" - echo -n "===>>> Proceed? y/n [y] " - read answer - case "$answer" in - [yY]|'') ;; - *) echo '' + get_answer_g y n "===>>> Proceed? y/n" + case "$?" in + 1) echo '' echo "===>>> If you would like to upgrade or install some, but not" echo " all of the above try adding '-i' to the command line." safe_exit 1 ;; @@ -2754,16 +2761,12 @@ if [ "$$" -eq "$PM_PARENT_PID" -a -z "$S files=`find $pdb -type f -name PM_UPGRADE_DONE_FLAG` if [ -n "$files" ]; then echo "===>>> There are 'install complete' flags from a previous" - echo -n " -[rf] run of ${0##*/}, delete them? y/n [n] " - read answer - case "$answer" in - [yY]) pm_sv Deleting \'install complete\' flags + get_answer_g n y " -[rf] run of ${0##*/}, delete them? y/n" + case "$?" in + 1) pm_sv Deleting \'install complete\' flags pm_find_s $pdb -type f -name PM_UPGRADE_DONE_FLAG -delete ;; - *) echo -n "===>>> Enable the -R option? y/n [n] " - read answer - case "$answer" in - [yY]) RESTART=Ropt ; ARGS="-R $ARGS" ;; - esac ;; + 0) get_answer_g n y "===>>> Enable the -R option? y/n" + case "$?" in 1) RESTART=Ropt ; ARGS="-R $ARGS" ;; esac ;; esac fi fi @@ -2985,11 +2988,10 @@ if [ -e "$pdb/$upg_port/+IGNOREME" ]; th echo '' echo "===>>> $upg_port has an +IGNOREME file" echo '' - echo -n "===>>> Update anyway? y/n [n] " - read answer - case "$answer" in - [yY]) ;; # Let it build - *) CUR_DEPS="${CUR_DEPS}${upg_port}:${portdir}:" + get_answer_g n y "===>>> Update anyway? y/n" + case "$?" in + 1) ;; # Let it build + 0) CUR_DEPS="${CUR_DEPS}${upg_port}:${portdir}:" if [ ${dep_of_deps:-0} -gt 0 ]; then dep_of_deps=$(( $dep_of_deps - 1 )) [ -n "$PM_FIRST_PASS" ] &&