From owner-svn-src-user@FreeBSD.ORG Sun Dec 12 00:07:56 2010 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 836BE1065670; Sun, 12 Dec 2010 00:07:56 +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 722CC8FC13; Sun, 12 Dec 2010 00:07:56 +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 oBC07uaE022014; Sun, 12 Dec 2010 00:07:56 GMT (envelope-from dougb@svn.freebsd.org) Received: (from dougb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oBC07ud5022012; Sun, 12 Dec 2010 00:07:56 GMT (envelope-from dougb@svn.freebsd.org) Message-Id: <201012120007.oBC07ud5022012@svn.freebsd.org> From: Doug Barton Date: Sun, 12 Dec 2010 00:07:56 +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: r216388 - 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: Sun, 12 Dec 2010 00:07:56 -0000 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 " - 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 " + 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 From owner-svn-src-user@FreeBSD.ORG Sun Dec 12 01:26:14 2010 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 66D03106566C; Sun, 12 Dec 2010 01:26:14 +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 561FA8FC0C; Sun, 12 Dec 2010 01:26:14 +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 oBC1QEk0027677; Sun, 12 Dec 2010 01:26:14 GMT (envelope-from dougb@svn.freebsd.org) Received: (from dougb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oBC1QEdS027675; Sun, 12 Dec 2010 01:26:14 GMT (envelope-from dougb@svn.freebsd.org) Message-Id: <201012120126.oBC1QEdS027675@svn.freebsd.org> From: Doug Barton Date: Sun, 12 Dec 2010 01:26:14 +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: r216389 - 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: Sun, 12 Dec 2010 01:26:14 -0000 Author: dougb Date: Sun Dec 12 01:26:14 2010 New Revision: 216389 URL: http://svn.freebsd.org/changeset/base/216389 Log: New Feature =========== The -e, -s, -l, -L, --list-origins, and --check-depends features all work fine without a ports tree, so now that getopts is run early we can properly test that those features are in use, and make the test for an empty $pd more sophisticated Indicate in usage() that --clean-packages requires --index-only if no ports tree is available In -e and -s, delete_dist_list() does require the ports tree, so if the user didn't use -D imply it when the ports tree is missing, and hide delete_dist_list() behind that test Fix === Sort long descriptions in usage() the same as the short ones in the previous change (for -y|n). Bug Fix ======= pdb and port_dbdir need default values for usage() in addition to pd Modified: user/dougb/portmaster/portmaster Modified: user/dougb/portmaster/portmaster ============================================================================== --- user/dougb/portmaster/portmaster Sun Dec 12 00:07:56 2010 (r216388) +++ user/dougb/portmaster/portmaster Sun Dec 12 01:26:14 2010 (r216389) @@ -264,9 +264,11 @@ safe_exit () { } usage () { - local pd + local pd pdb port_dbdir [ -z "$pd" ] && pd=/usr/ports + [ -z "$pdb" ] && pdb=/var/db/pkg + [ -z "$port_dbdir" ] && port_dbdir=/var/db/ports version echo '' @@ -304,7 +306,7 @@ usage () { echo '' echo "${0##*/} [-n|y] [-t] --clean-distfiles" echo '' - echo "${0##*/} [-n|y] [--index] --clean-packages" + echo "${0##*/} [-n|y] [--index|--index-only] --clean-packages" echo '' echo "${0##*/} [-n|y] --check-depends" echo '' @@ -367,24 +369,25 @@ usage () { echo '-l list installed ports by category' echo '-L list installed ports by category, and search for updates' echo '' - echo '-e expunge a single port via pkg_delete, and remove its distfiles' - echo '-s clean out stale ports that used to be depended on' + echo "--list-origins list directories from $pd for root and leaf ports" echo '' echo '[--force-config|-G] [-aftv] -F fetch distfiles only' echo '' + echo '-e expunge a single port via pkg_delete, and remove its distfiles' + echo '-s clean out stale ports that used to be depended on' + echo '' echo '[-t] --clean-distfiles offer to delete stale distfiles' 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] -y --clean-packages delete stale packages without prompting' + echo '[--index|--index-only] --clean-packages offer to delete stale packages' + echo '[--index|--index-only] -y --clean-packages delete without prompting' + echo ' --index-only is required if no ports tree is available' echo '' echo '--check-depends cross-check and update dependency information for all ports' echo '' echo "--check-port-dbdir [-v] check for stale entries in $port_dbdir" echo '' - echo "--list-origins list directories from $pd for root and leaf ports" - echo '' echo '-h|--help display this help message' echo '--version display the version number' echo '' @@ -708,7 +711,19 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then export PM_IPD fi - [ -z "$pd" ] && fail 'The value of PORTSDIR cannot be empty' + if [ -n "$pd" ]; then + export pd + else + if [ -n "$EXPUNGE" -o -n "$CLEAN_STALE" ]; then + if [ -z "$DONT_SCRUB_DISTFILES" ]; then + pm_v "===>>> There is no ports tree, so using -D option" + unset ALWAYS_SCRUB_DISTFILES + DONT_SCRUB_DISTFILES=Dopt_es; ARGS="-D $ARGS" + fi + elif [ -z "$LIST" -a -z "$LIST_PLUS" -a -z "$LIST_ORIGINS" -a -z "$CHECK_DEPENDS" ]; then + fail 'The value of PORTSDIR cannot be empty' + fi + fi if [ -z "$pdb" ]; then if [ -z "$PKG_DBDIR" ]; then [ -d /var/db/pkg ] && pdb=/var/db/pkg @@ -725,7 +740,7 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then fi fi fi - export pd pdb + export pdb [ -z "$DISTDIR" -a "$PM_PACKAGES" != only -a -z "$CHECK_DEPENDS" -a \ -z "$CHECK_PORT_DBDIR" -a -z "$LIST_ORIGINS" ] && @@ -1320,7 +1335,7 @@ IFS=' origin=`origin_from_pdb $iport` || continue - if [ ! -d "$pd/$origin" ]; then + if [ -n "$pd" ] && [ ! -d "$pd/$origin" ]; then echo " ===>>> $pd/$origin does not exist" echo " ===>>> This port should probably be updated" continue @@ -1953,9 +1968,8 @@ if [ -n "$EXPUNGE" ]; then fi [ -n "$BACKUP" ] && { init_packages ; pm_pkg_create $pbu $EXPUNGE; } - [ -z "$DONT_SCRUB_DISTFILES" ] && delete_all_distfiles $origin + [ -z "$DONT_SCRUB_DISTFILES" ] && { delete_all_distfiles $origin; delete_dist_list; } - delete_dist_list echo "===>>> Running pkg_delete -f $EXPUNGE" pm_pkg_delete_s -f $EXPUNGE || fail 'pkg_delete failed' @@ -1991,9 +2005,8 @@ if [ -n "$CLEAN_STALE" ]; then 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 + [ -z "$DONT_SCRUB_DISTFILES" ] && { delete_all_distfiles $origin; delete_dist_list; } - delete_dist_list echo "===>>> Running pkg_delete -f $iport" pm_pkg_delete_s -f $iport || fail 'pkg_delete failed' From owner-svn-src-user@FreeBSD.ORG Wed Dec 15 20:08:29 2010 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 A1A1D106566B; Wed, 15 Dec 2010 20:08:29 +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 905CE8FC1F; Wed, 15 Dec 2010 20:08:29 +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 oBFK8TCl082242; Wed, 15 Dec 2010 20:08:29 GMT (envelope-from dougb@svn.freebsd.org) Received: (from dougb@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id oBFK8TRE082240; Wed, 15 Dec 2010 20:08:29 GMT (envelope-from dougb@svn.freebsd.org) Message-Id: <201012152008.oBFK8TRE082240@svn.freebsd.org> From: Doug Barton Date: Wed, 15 Dec 2010 20:08:29 +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: r216464 - 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: Wed, 15 Dec 2010 20:08:29 -0000 Author: dougb Date: Wed Dec 15 20:08:29 2010 New Revision: 216464 URL: http://svn.freebsd.org/changeset/base/216464 Log: Play checkers with more code that needs to be moved up so that getopts() can use it Modified: user/dougb/portmaster/portmaster Modified: user/dougb/portmaster/portmaster ============================================================================== --- user/dougb/portmaster/portmaster Wed Dec 15 19:30:44 2010 (r216463) +++ user/dougb/portmaster/portmaster Wed Dec 15 20:08:29 2010 (r216464) @@ -263,6 +263,76 @@ safe_exit () { exit ${1:-0} } +pm_cd () { builtin cd $1 2>/dev/null || return 1; } +pm_cd_pd () { builtin cd $pd/$1 2>/dev/null || + fail "Cannot cd to port directory: $pd/$1"; } +pm_kill () { /bin/kill $* >/dev/null 2>/dev/null; } +pm_make () { ( unset -v CUR_DEPS INSTALLED_LIST PM_DEPTH build_l; + unset -v MASTER_RB_LIST; + /usr/bin/nice /usr/bin/make $PM_MAKE_ARGS $*; ); } +pm_make_b () { /usr/bin/make $PM_MAKE_ARGS BEFOREPORTMK=bpm $*; } +pm_mktemp () { /usr/bin/mktemp -t f-${PM_PARENT_PID}-$1 || + fail "mktemp for $1 failed"; } +pm_unlink () { /bin/test -e $1 && /bin/unlink $1; } + +# Superuser versions for commands that need root privileges + +pm_find_s () { $PM_SU_CMD /usr/bin/find $*; } +pm_install_s () { $PM_SU_CMD /usr/bin/install -o root -g wheel -m 644 $1 $2; } +pm_make_s () { ( unset -v CUR_DEPS INSTALLED_LIST PM_DEPTH build_l; + unset -v MASTER_RB_LIST; + $PM_SU_CMD /usr/bin/nice /usr/bin/make $PM_MAKE_ARGS $*; ); } +pm_mkdir_s () { $PM_SU_CMD /bin/mkdir -p $1; } +pm_pkg_delete_s () { $PM_SU_CMD /usr/sbin/pkg_delete $*; } +pm_rm_s () { $PM_SU_CMD /bin/rm $*; } +pm_rmdir_s () { $PM_SU_CMD /bin/rmdir $*; } +pm_unlink_s () { /bin/test -e $1 && $PM_SU_CMD /bin/unlink $1; } + +pm_v () { [ -n "$PM_VERBOSE" ] && echo "$*"; } +pm_sv () { [ -n "$PM_SU_VERBOSE" ] && echo "===>>> SU $*"; } + +# Do this here so we can have a reasonably good guess. +# May be modified below. +if [ "$$" -eq "$PM_PARENT_PID" ]; then + if [ -z "$pd" ]; then + if [ -z "$PORTSDIR" ]; then + [ -d /usr/ports ] && pd=/usr/ports + [ -z "$pd" ] && + pd=`pm_make_b -f/usr/share/mk/bsd.port.mk -V PORTSDIR 2>/dev/null` + else + pd=$PORTSDIR + fi + fi + if [ -n "$pd" ]; then + [ ! -r "${pd}/Mk/bsd.port.mk" ] && + fail "The ports directory ($pd) does not seem to contain a ports tree" + export pd + fi + + if [ -z "$pdb" ]; then + if [ -z "$PKG_DBDIR" ]; then + [ -d /var/db/pkg ] && pdb=/var/db/pkg + [ -z "$pdb" ] && + pdb=`pm_make -f/usr/share/mk/bsd.port.mk -V PKG_DBDIR 2>/dev/null` + else + pdb=$PKG_DBDIR + fi + if [ -z "$pdb" ]; then + if [ -d /var/db/pkg ]; then + pdb='/var/db/pkg' + else + fail 'The value of PKG_DBDIR cannot be empty' + fi + fi + fi + export pdb + + [ -z "$port_dbdir" -a -d /var/db/ports ] && port_dbdir=/var/db/ports + [ -z "$port_dbdir" ] && + port_dbdir=`pm_make_b -f/usr/share/mk/bsd.port.mk -V PORT_DBDIR 2>/dev/null` + [ -n "$port_dbdir" ] && export port_dbdir +fi + usage () { local pd pdb port_dbdir @@ -395,36 +465,53 @@ usage () { safe_exit ${1:-1} } -pm_cd () { builtin cd $1 2>/dev/null || return 1; } -pm_cd_pd () { builtin cd $pd/$1 2>/dev/null || - fail "Cannot cd to port directory: $pd/$1"; } -pm_kill () { /bin/kill $* >/dev/null 2>/dev/null; } -pm_make () { ( unset -v CUR_DEPS INSTALLED_LIST PM_DEPTH build_l; - unset -v MASTER_RB_LIST; - /usr/bin/nice /usr/bin/make $PM_MAKE_ARGS $*; ); } -pm_make_b () { /usr/bin/make $PM_MAKE_ARGS BEFOREPORTMK=bpm $*; } -pm_mktemp () { /usr/bin/mktemp -t f-${PM_PARENT_PID}-$1 || - fail "mktemp for $1 failed"; } -pm_unlink () { /bin/test -e $1 && /bin/unlink $1; } +globstrip () { local in ; in=${1%[*]} ; in=${in%\\} ; echo $in ; } -# Superuser versions for commands that need root privileges +# Takes a pattern as input +# Return values: +# 0 - Matched one and only one directory in $pdb +# 1 - No match +# 2 - Matched multiple directories # -# The following are used once, so they have $PM_SU_CMD in line: -# truncate, pkg_create, cp, /etc/rc.d/ldconfig, touch +find_glob_dirs () { + # Global: glob_dirs + local pattern -pm_find_s () { $PM_SU_CMD /usr/bin/find $*; } -pm_install_s () { $PM_SU_CMD /usr/bin/install -o root -g wheel -m 644 $1 $2; } -pm_make_s () { ( unset -v CUR_DEPS INSTALLED_LIST PM_DEPTH build_l; - unset -v MASTER_RB_LIST; - $PM_SU_CMD /usr/bin/nice /usr/bin/make $PM_MAKE_ARGS $*; ); } -pm_mkdir_s () { $PM_SU_CMD /bin/mkdir -p $1; } -pm_pkg_delete_s () { $PM_SU_CMD /usr/sbin/pkg_delete $*; } -pm_rm_s () { $PM_SU_CMD /bin/rm $*; } -pm_rmdir_s () { $PM_SU_CMD /bin/rmdir $*; } -pm_unlink_s () { /bin/test -e $1 && $PM_SU_CMD /bin/unlink $1; } + pattern=`globstrip $1` -pm_v () { [ -n "$PM_VERBOSE" ] && echo "$*"; } -pm_sv () { [ -n "$PM_SU_VERBOSE" ] && echo "===>>> SU $*"; } + glob_dirs=`find $pdb -maxdepth 1 -type d -name ${pattern}\*` + case "$glob_dirs" in + # Match a newline in multiple responses from find + *' +'*) return 2 ;; + $pdb/*) return ;; + esac + + unset glob_dirs + return 1 +} + +origin_from_pdb () { + local o + + o=`grep -m1 '@comment ORIGIN:' $pdb/$1/+CONTENTS 2>/dev/null` && { + echo ${o#@comment ORIGIN:}; return 0; } + + case "$1" in bsdpan-*) return 3 ;; esac + + if [ -e "$pdb/$1/+IGNOREME" ]; then + if [ -n "$PM_VERBOSE" -o -n "$LIST_ORIGINS" ]; then + echo " ===>>> No ORIGIN in $pdb/$1/+CONTENTS" >&2 + echo " ===>>> $pdb/$1/+IGNOREME exists" >&2 + echo '' >&2 + fi + return 2 + else + echo " ===>>> No ORIGIN in $pdb/$1/+CONTENTS" >&2 + echo '' >&2 + fi + return 1 +} #=============== End functions we always want to have =============== #=============== Begin Command Line Option Processing =============== @@ -635,27 +722,13 @@ unset -f packages_init cross_idx test_co #=============== End Command Line Option Processing =============== -# Do this here so it can use the fancy functions above, and default values -# can be overridden in the rc files +# Update based on options chosen above if [ "$$" -eq "$PM_PARENT_PID" ]; then if [ -n "$PM_PACKAGES" -o -n "$PM_PACKAGES_BUILD" ]; then [ `/sbin/sysctl -n kern.osreldate 2>/dev/null` -lt 600400 ] && fail Package installation support requires FreeBSD 6.4 or newer fi - if [ -z "$pd" ]; then - if [ -z "$PORTSDIR" ]; then - [ -d /usr/ports ] && pd=/usr/ports - [ -z "$pd" ] && - pd=`pm_make_b -f/usr/share/mk/bsd.port.mk -V PORTSDIR 2>/dev/null` - else - pd=$PORTSDIR - fi - fi - - [ -n "$pd" ] && [ ! -r "${pd}/Mk/bsd.port.mk" ] && - fail "The ports directory ($pd) does not seem to contain a ports tree" - if [ -n "$PM_INDEX" ]; then if [ -z "$INDEXFILE" ]; then ver=`uname -r` @@ -724,23 +797,6 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then fail 'The value of PORTSDIR cannot be empty' fi fi - if [ -z "$pdb" ]; then - if [ -z "$PKG_DBDIR" ]; then - [ -d /var/db/pkg ] && pdb=/var/db/pkg - [ -z "$pdb" ] && - pdb=`pm_make -f/usr/share/mk/bsd.port.mk -V PKG_DBDIR 2>/dev/null` - else - pdb=$PKG_DBDIR - fi - if [ -z "$pdb" ]; then - if [ -d /var/db/pkg ]; then - pdb='/var/db/pkg' - else - fail 'The value of PKG_DBDIR cannot be empty' - fi - fi - fi - export pdb [ -z "$DISTDIR" -a "$PM_PACKAGES" != only -a -z "$CHECK_DEPENDS" -a \ -z "$CHECK_PORT_DBDIR" -a -z "$LIST_ORIGINS" ] && @@ -748,11 +804,6 @@ if [ "$$" -eq "$PM_PARENT_PID" ]; then [ -n "$DISTDIR" ] && { DISTDIR="${DISTDIR%/}/"; export DISTDIR; } - [ -z "$port_dbdir" -a -d /var/db/ports ] && port_dbdir=/var/db/ports - [ -z "$port_dbdir" ] && - port_dbdir=`pm_make_b -f/usr/share/mk/bsd.port.mk -V PORT_DBDIR 2>/dev/null` - [ -n "$port_dbdir" ] && export port_dbdir - if [ -n "$PM_PACKAGES_BUILD" -o -n "$PM_DEL_BUILD_ONLY" ]; then PM_BUILD_ONLY_LIST=pm_bol export PM_BUILD_ONLY_LIST @@ -778,28 +829,6 @@ iport_from_origin () { echo ${dir#$pdb/} } -origin_from_pdb () { - local o - - o=`grep -m1 '@comment ORIGIN:' $pdb/$1/+CONTENTS 2>/dev/null` && { - echo ${o#@comment ORIGIN:}; return 0; } - - case "$1" in bsdpan-*) return 3 ;; esac - - if [ -e "$pdb/$1/+IGNOREME" ]; then - if [ -n "$PM_VERBOSE" -o -n "$LIST_ORIGINS" ]; then - echo " ===>>> No ORIGIN in $pdb/$1/+CONTENTS" >&2 - echo " ===>>> $pdb/$1/+IGNOREME exists" >&2 - echo '' >&2 - fi - return 2 - else - echo " ===>>> No ORIGIN in $pdb/$1/+CONTENTS" >&2 - echo '' >&2 - fi - return 1 -} - check_regular_file () { [ ! -L "$1" -a -f "$1" ] || fail "ERROR: $1 is not a regular file!" } @@ -1098,15 +1127,6 @@ read_distinfos_all () { [ -e "${DI_FILES}-e" ] && unlink ${DI_FILES}-e } -globstrip () { - local in - - in=${1%[*]} - in=${in%\\} - - echo $in -} - ports_by_category () { local pkg pm_v "===>>> Sorting ports by category" @@ -1136,30 +1156,6 @@ delete_empty_dist_subdirs () { find -d $DISTDIR -type d \( -empty -and ! -path \*\.zfs/\* \) -delete } -# Takes a pattern as input -# Return values: -# 0 - Matched one and only one directory in $pdb -# 1 - No match -# 2 - Matched multiple directories -# -find_glob_dirs () { - # Global: glob_dirs - local pattern - - pattern=`globstrip $1` - - glob_dirs=`find $pdb -maxdepth 1 -type d -name ${pattern}\*` - case "$glob_dirs" in - # Match a newline in multiple responses from find - *' -'*) return 2 ;; - $pdb/*) return ;; - esac - - unset glob_dirs - return 1 -} - init_packages_var () { # Global: PACKAGES