Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 06 May 2003 16:55:01 +0400
From:      Sergey Matveychuk <sem@ciam.ru>
To:        Kris Kennaway <kris@obsecurity.org>
Cc:        ports@freebsd.org
Subject:   new install-deinstall patch for bsd.port.mk
Message-ID:  <3EB7B0A5.4020009@ciam.ru>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------010501060205070404010005
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Hello Kris!

This is my and Joe's patch I'v sent you but fixed for the new version of 
bsd.port.mk.
Have you received a datailed description before?

----
Sem.

--------------010501060205070404010005
Content-Type: text/plain;
 name="bsd.port.mk.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="bsd.port.mk.diff"

--- bsd.port.mk.orig	Tue May  6 16:04:43 2003
+++ bsd.port.mk	Tue May  6 16:44:49 2003
@@ -522,6 +522,7 @@
 # reinstall		- Install the results of a build, ignoring "already installed"
 #				  flag.
 # deinstall		- Remove the installation.
+# deinstall-all	- Remove all installations with the same PKGORIGIN.
 # package		- Create a package from an _installed_ port.
 # describe		- Try to generate a one-line description for each port for
 #				  use in INDEX files and the like.
@@ -672,9 +673,9 @@
 # by "%%") as defined in PLIST_SUB to generate ${TMPPLIST}.  For
 # instance, "OSREL=${OSREL}" in PLIST_SUB causes all occurrences of
 # "%%OSREL%%" in ${PLIST} to be substituted by the value of OSREL.
-# ${TMPPLIST} is generated between the do-install and post-install
-# stages.  If you are generating the packing list on-the-fly, make
-# sure it's generated by the end of do-install!
+# ${TMPPLIST} is generated before the do-install stage.  If you are
+# generating the packing list on-the-fly, make sure it's generated before
+# do-install is called!
 #
 # For package:
 #
@@ -737,6 +738,7 @@
 CHGRP?=		/usr/bin/chgrp
 CHMOD?=		/bin/chmod
 CHOWN?=		/usr/sbin/chown
+COMM?=		/usr/bin/comm
 CP?=		/bin/cp
 CUT?=		/usr/bin/cut
 DC?=		/usr/bin/dc
@@ -2910,16 +2912,33 @@
 .if !target(check-already-installed)
 check-already-installed:
 .if !defined(NO_PKG_REGISTER) && !defined(FORCE_PKG_REGISTER)
-	@if [ -d ${PKG_DBDIR}/${PKGNAME} -o \
-	    "x`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`" != "x" ]; then \
-		${ECHO_CMD} "===>  ${PKGNAME} is already installed - perhaps an older version?"; \
-		${ECHO_CMD} "      If so, you may wish to \`\`make deinstall'' and install"; \
-		${ECHO_CMD} "      this port again by \`\`make reinstall'' to upgrade it properly."; \
-		${ECHO_CMD} "      If you really wish to overwrite the old port of ${PKGNAME}"; \
-		${ECHO_CMD} "      without deleting it first, set the variable \"FORCE_PKG_REGISTER\""; \
-		${ECHO_CMD} "      in your environment or the \"make install\" command line."; \
-		exit 1; \
-	fi
+		@${ECHO_MSG} "===>  Checking if ${PKGORIGIN} already installed"
+		@already_installed=`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`; \
+		if [ -n "$${already_installed}" ]; then \
+				for p in $${already_installed}; do \
+						prfx=`${PKG_INFO} -q -p $${p} 2> /dev/null | ${SED} -e 's|^@cwd ||'`; \
+						if [ "x${PREFIX}" = "x$${prfx}" ]; then \
+								df=`${PKG_INFO} -q -f $${p} 2> /dev/null | ${GREP} -v "^@" | ${COMM} -12 - ${TMPPLIST}`; \
+								if [ -n "$${df}" ]; then \
+										found_package=$${p}; \
+										break; \
+								fi; \
+						fi; \
+				done; \
+		fi; \
+		if [ -d ${PKG_DBDIR}/${PKGNAME} -o -n "$${found_package}" ]; then \
+				if [ -d ${PKG_DBDIR}/${PKGNAME} ]; then \
+						${ECHO_CMD} "===>   ${PKGNAME} is already installed"; \
+				else \
+						${ECHO_CMD} "===>   An older version of ${PKGORIGIN} is already installed ($${found_package})"; \
+				fi; \
+				${ECHO_CMD} "      You may wish to \`\`make deinstall'' and install this port again"; \
+				${ECHO_CMD} "      by \`\`make reinstall'' to upgrade it properly."; \
+				${ECHO_CMD} "      If you really wish to overwrite the old port of ${PKGORIGIN}"; \
+				${ECHO_CMD} "      without deleting it first, set the variable \"FORCE_PKG_REGISTER\""; \
+				${ECHO_CMD} "      in your environment or the \"make install\" command line."; \
+				exit 1; \
+		fi
 .else
 	@${DO_NADA}
 .endif
@@ -3093,10 +3112,11 @@
 _BUILD_SEQ=		build-message pre-build pre-build-script do-build \
 				post-build post-build-script
 _INSTALL_DEP=	build
-_INSTALL_SEQ=	install-message check-categories check-already-installed \
-				check-conflicts check-umask run-depends lib-depends \
-				install-mtree pre-install pre-install-script do-install \
-				generate-plist post-install post-install-script compress-man \
+_INSTALL_SEQ=	install-message check-categories check-conflicts \
+			    check-umask run-depends lib-depends install-mtree \
+				pre-install pre-install-script generate-plist \
+				check-already-installed do-install \
+				post-install post-install-script compress-man \
 				run-ldconfig fake-pkg security-check
 _PACKAGE_DEP=	install
 _PACKAGE_SEQ=	package-message pre-package pre-package-script \
@@ -3263,17 +3283,48 @@
 
 .if !target(deinstall)
 deinstall:
-	@deinstall_name=`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`; \
-	${TEST} -z $${deinstall_name} && deinstall_name=${PKGNAME}; \
-	${ECHO_MSG} "===>  Deinstalling for ${PKGORIGIN} ($${deinstall_name})"; \
-	if ${PKG_INFO} -e $${deinstall_name}; then \
-		${PKG_DELETE} -f $${deinstall_name}; \
-	 else \
-	    ${ECHO_MSG} "===>   ${PKGORIGIN} not installed, skipping"; \
-	 fi
+	@${ECHO_MSG} "===>  Deinstalling for ${PKGORIGIN}"
+	@found_names=`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`; \
+	for p in $${found_names}; do \
+			check_name=`${ECHO} $${p} | ${SED} -e 's/-[^-]*$$//'`; \
+			if [ "$${check_name}" = "${PKGBASE}" ]; then \
+					deinstall_name=$${p}; \
+					break; \
+			fi; \
+	done; \
+	if [ -n "$${deinstall_name}" ]; then \
+			prfx=`${PKG_INFO} -q -p $${p} 2> /dev/null | ${SED} -e 's|^@cwd ||'`; \
+			if [ "x${PREFIX}" != "x$${prfx}" ]; then \
+					${ECHO_MSG} "===>   $${p} has a different PREFIX: $${prfx}, skipping"; \
+			else \
+					${ECHO_MSG} "===>   Deinstalling $${deinstall_name}"; \
+					${PKG_DELETE} -f $${deinstall_name}; \
+			fi; \
+	else \
+			${ECHO_MSG} "===>   ${PKGORIGIN} not installed, skipping"; \
+	fi
 	@${RM} -f ${INSTALL_COOKIE} ${PACKAGE_COOKIE}
 .endif
 
+# Deinstall-all
+#
+# Special target to remove installation of all ports of the same origin
+
+.if !target(deinstall-all)
+deinstall-all:
+	@${ECHO_MSG} "===>  Deinstalling for ${PKGORIGIN}"
+	@deinstall_names=`${PKG_INFO} -q -O ${PKGORIGIN} 2> /dev/null`; \
+	if [ -n "$${deinstall_names}" ]; then \
+		for d in $${deinstall_names}; do \
+			${ECHO_MSG} "===>   Deinstalling $${d}"; \
+			${PKG_DELETE} -f $${d}; \
+		done; \
+	else \
+		${ECHO_MSG} "===>   ${PKGORIGIN} not installed, skipping"; \
+	fi
+	@${RM} -f ${INSTALL_COOKIE} ${PACKAGE_COOKIE}
+.endif
+ 
 # Cleaning up
 
 .if !target(do-clean)

--------------010501060205070404010005--




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