[pacman-dev] [PATCH] BSD/Mac OS X sed inplace backups with mktemp

Kevin Barry barryk at gmail.com
Mon Feb 16 01:08:44 EST 2009


This patch changes the way that sed inplace is run in makepkg when
running in versionpkg mode. Previous, sed would run with no backup
file, called in the GNU way. It seems there is no cross platform
method of calling sed inplace with no backup (BSD/sed uses sed -i '',
GNU/sed uses sed -i'' or simply sed -i).

Instead, this patch creates a backup file (from an mktemp extension) and
removes it after the successful completetion of the sed operation.
This means the user should not see the backup file, unless something went wrong
(Full partition for example) in which case they don't lose the previous PKGBUILD
as they would in previous versions.

Further information about GNU/sed versus BSD/sed:

On Mac OS X (Man page is from FreeBSD, so I believe it would be the same there):
sed -i -e 's/foo/bar/' filename
will create a backup file named filename-e

sed -i -e 's/foo/bar/' -e 's/asd/dsa/' filename
will give an error message because of the second -e

sed -i 's/foo/bar/' filename
will give an error message

sed -i '' 's/foo/bar/' filename
will work without creating a backup, but fails on GNU/sed

sed -i'' 's/foo/bar/' filename
sed -i 's/foo/bar/' filename
Work only on GNU/sed

Signed-off-by: Kevin Barry <barryk gmail com>
---
 scripts/makepkg.sh.in |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index e10c345..5af4add 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1199,8 +1199,13 @@ devel_update() {
 	if [ -n "$newpkgver" ]; then
 		if [ "$newpkgver" != "$pkgver" ]; then
 			if [ -f "./$BUILDSCRIPT" ]; then
-				sed -i "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "./$BUILDSCRIPT"
-				sed -i "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT"
+				# Create temporary filename for sed backup.
+				# Needed for BSD/GNU cross-platform compatibility
+				TEMP_NAME=$(mktemp -u "./${BUILDSCRIPT}.XXXXXX")
+				TEMP_NAME=${TEMP_NAME#"./${BUILDSCRIPT}."}
+				sed -i".${TEMP_NAME}" -e "s/^pkgver=[^ ]*/pkgver=$newpkgver/" \
+					-e "s/^pkgrel=[^ ]*/pkgrel=1/" "./$BUILDSCRIPT" &&
+					rm -f "./${BUILDSCRIPT}.${TEMP_NAME}"
 				source "$BUILDSCRIPT"
 			fi
 		fi
-- 
1.6.1.2


More information about the pacman-dev mailing list