Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 30 Nov 2009 06:49:41 +0000 (UTC)
From:      Doug Barton <dougb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r199962 - user/dougb/portmaster
Message-ID:  <200911300649.nAU6nfvY021075@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dougb
Date: Mon Nov 30 06:49:41 2009
New Revision: 199962
URL: http://svn.freebsd.org/changeset/base/199962

Log:
  Add a new option, --always-fetch
  If that option is NOT used, check the local file system for the package
  we're looking for. If it's not available, or the option IS used, fetch it.
  
  Move the code for package fetching into a function
  
  If we don't get a rational value from grep'ing the list of available
  package versions, and/or the "newest" available port seems to be older
  than the latest version from the ports tree, try fetching the exact
  version of $new_port by name. This solves the issue of (for example)
  autoconf-2.1.3 vs. autoconf-2.6.2. The latter appears never to have
  a current package if the former exists.
  
  Move a comment to the section it directly applies to

Modified:
  user/dougb/portmaster/portmaster

Modified: user/dougb/portmaster/portmaster
==============================================================================
--- user/dougb/portmaster/portmaster	Mon Nov 30 05:36:40 2009	(r199961)
+++ user/dougb/portmaster/portmaster	Mon Nov 30 06:49:41 2009	(r199962)
@@ -315,6 +315,7 @@ usage () {
 	echo '--packages-build use packages for all build dependencies'
 	echo '--packages-if-newer use package if newer than installed even'
 	echo '   if the package is not the latest according to the ports tree'
+	echo '--always-fetch fetch package even if it already exists locally'
 	echo ''
 	echo '-l list installed ports by category'
 	echo '-L list installed ports by category, and search for updates'
@@ -426,6 +427,8 @@ for var in "$@" ; do
 	--packages-if-newer)	packages_init newer
 				PM_PACKAGES_NEWER=pmp_newer
 				export PM_PACKAGES_NEWER ;;
+	--always-fetch)		PM_ALWAYS_FETCH=pm_always_fetch
+				export PM_ALWAYS_FETCH ;;
 	-[A-Za-z0-9]*)		newopts="$newopts $var" ;;
 	--delete-build-only)	PM_DEL_BUILD_ONLY=pm_dbo
 				PM_BUILD_ONLY_LIST=pm_bol
@@ -2422,6 +2425,49 @@ fi
 
 new_port=`pm_make -V PKGNAME`
 
+if [ -n "$PM_PACKAGES" -o "$PM_PACKAGES_BUILD" = doing_build_only_dep ]; then
+fetch_package () {
+	local do_fetch
+
+	# Duplicated from pkg_init()
+	[ -z "$packages" ] &&
+		packages=`pm_make -f/usr/share/mk/bsd.port.mk -V PACKAGES`
+	[ -n "$packages" ] || fail 'The value of PACKAGES cannot be empty'
+
+	[ -z "$ppd" ] && { ppd=$packages/portmaster-download; export ppd; }
+
+	if [ ! -d "$ppd" ]; then
+		[ -n "$PM_SU_VERBOSE" ] &&
+			echo "===>>> Creating $ppd"
+		pm_mkdir_s $ppd
+	fi
+
+	[ -z "$fetch_args" ] && {
+		fetch_args=`pm_make -f/usr/share/mk/bsd.port.mk -V FETCH_ARGS`;
+		export fetch_args; }
+
+	if [ -z "$PM_ALWAYS_FETCH" ]; then
+		if [ -e "${ppd}/${1}.tbz" ]; then
+			[ -n "$PM_VERBOSE" ] &&
+				echo "===>>> Package exists, skipping fetch"
+		else
+			do_fetch=1
+		fi
+	else
+		do_fetch=1
+	fi
+
+	if [ -n "$do_fetch" ]; then
+		[ -n "$PM_VERBOSE" ] && echo "===>>> Starting package fetch"
+
+		fetch $fetch_args -o $ppd ${sitepath}${1}.tbz 2>/dev/null || {
+			pm_unlink ${ppd}/${1}.tbz;
+			fetch $fetch_args -o $ppd ${sitepath}${1}.tbz ||
+				fail "Fetch for ${1}.tbz failed"; }
+	fi
+}
+fi
+
 # XXX Build or package?
 
 if [ -n "$PM_PACKAGES" -o "$PM_PACKAGES_BUILD" = doing_build_only_dep ]; then
@@ -2465,6 +2511,13 @@ if [ -n "$PM_PACKAGES" -o "$PM_PACKAGES_
 	unset s
 
 	if [ -z "$latest_pv" ]; then
+		fetch_package $new_port
+		if [ $? -eq 0 ]; then
+			latest_pv=$new_port
+		fi
+	fi
+
+	if [ -z "$latest_pv" ]; then
 		echo "===>>> Package and/or archive not found at:"
 		echo "${sitepath}"
 		echo ''
@@ -2510,22 +2563,29 @@ notnewer () {
 			echo "===>>> There is a package available ($latest_pv)"
 		fi
 	else
-		# Could happen if ports tree is out of date
 		case `pkg_version -t $new_port $latest_pv` in
-		\<)	use_package=up_old_tree
+		\<)	# Could happen if ports tree is out of date
+			use_package=up_old_tree
 			[ -n "$PM_VERBOSE" ] && {
 			echo "===>>> Available package ($latest_pv)";
 			echo "       is newer than ports tree ($new_port)"; } ;;
 		=)	;;	# Should not be reached
-		*)	echo ''
-			echo "===>>> The newest available package ($latest_pv)"
+		*)	# Packages like autoconf-2.1* vs. 2.6* can be false neg.
+			fetch_package $new_port
+			if [ $? -eq 0 ]; then
+				latest_pv=$new_port
+				use_package=up_auto
+			else
+				echo ''
+		echo "===>>> The newest available package ($latest_pv)"
 		echo "       is older than the version in ports ($new_port)"
-			if [ "$PM_PACKAGES" = only ]; then
-				if [ -n "$PM_FORCE" ]; then
-					use_package=up_force2
+				if [ "$PM_PACKAGES" = only ]; then
+					if [ -n "$PM_FORCE" ]; then
+						use_package=up_force2
 				echo "===>>> Installing anyway due to -f"
-				else
+					else
 	fail "Try --packages-if-newer, or do not use -PP/--packages-only"
+					fi
 				fi
 			fi ;;
 		esac
@@ -2573,28 +2633,7 @@ if [ -z "$use_package" ]; then
 	eval pm_make $port_log_args || fail "make failed for $portdir"
 else
 	# XXX fetch
-
-	# Duplicated from pkg_init()
-	[ -z "$packages" ] &&
-		packages=`pm_make -f/usr/share/mk/bsd.port.mk -V PACKAGES`
-	[ -n "$packages" ] || fail 'The value of PACKAGES cannot be empty'
-
-	ppd=$packages/portmaster-download
-
-	if [ ! -d "$ppd" ]; then
-		[ -n "$PM_SU_VERBOSE" ] &&
-			echo "===>>> Creating $ppd"
-		pm_mkdir_s $ppd
-	fi
-	export ppd
-
-	[ -n "$PM_VERBOSE" ] && echo "===>>> Starting package fetch"
-
-	fetch_args=`pm_make -f/usr/share/mk/bsd.port.mk -V FETCH_ARGS`
-	fetch $fetch_args -o $ppd ${sitepath}${latest_pv}.tbz 2>/dev/null || {
-		pm_unlink ${ppd}/${latest_pv}.tbz;
-		fetch $fetch_args -o $ppd ${sitepath}${latest_pv}.tbz ||
-			fail "Fetch for ${latest_pv}.tbz failed"; }
+	fetch_package $latest_pv
 fi
 
 # XXX Build or package?



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911300649.nAU6nfvY021075>