[pacman-dev] [PATCH v7 01/12] bacman: allow for multiple packages as arguments

Gordian Edenhofer gordian.edenhofer at gmail.com
Sat Sep 3 16:52:58 UTC 2016


To enable the creation of multiple packages with one command move the
assembly process into its own function.

Signed-off-by: Gordian Edenhofer <gordian.edenhofer at gmail.com>
---
Split up first commit into three distinct parts:
Moving stuff into function, handle abort signals, write and alter some comments.
Merge the altered comments into the code structuring commit.

 contrib/bacman.sh.in | 405 +++++++++++++++++++++++++--------------------------
 1 file changed, 200 insertions(+), 205 deletions(-)

diff --git a/contrib/bacman.sh.in b/contrib/bacman.sh.in
index a611c1a..5e6fce5 100644
--- a/contrib/bacman.sh.in
+++ b/contrib/bacman.sh.in
@@ -66,7 +66,8 @@ done
 
 m4_include(../scripts/library/term_colors.sh)
 
-if (( $# != 1 )); then
+# Break if no argument was given
+if (( $# < 1 )); then
 	usage
 	exit 1
 fi
@@ -118,10 +119,6 @@ fi
 pkg_dest="${PKGDEST:-$PWD}"
 pkg_pkger=${PACKAGER:-'Unknown Packager'}
 
-pkg_name="$1"
-pkg_dir=("$pac_db/$pkg_name"-+([^-])-+([^-]))
-pkg_namver=("${pkg_dir[@]##*/}")
-
 #
 # Checks everything is in place
 #
@@ -130,227 +127,225 @@ if [[ ! -d $pac_db ]]; then
 	exit 1
 fi
 
-if (( ${#pkg_dir[@]} != 1 )); then
-	error "%d entries for package %s found in pacman database" \
-		${#pkg_dir[@]} "${pkg_name}"
-	msg2 "%s" "${pkg_dir[@]}"
-	exit 1
-fi
-
-if [[ ! -d $pkg_dir ]]; then
-	error "package %s is found in pacman database," "${pkg_name}"
-	plain "       but '%s' is not a directory" "${pkg_dir}"
-	exit 1
-fi
-
-#
-# Begin
-#
-msg "Package: ${pkg_namver}"
-work_dir=$(mktemp -d "${TMPDIR:-/tmp}/bacman.XXXXXXXXXX")
-cd "$work_dir" || exit 1
-
-#
-# File copying
-#
-msg2 "Copying package files..."
-
-while read i; do
-	if [[ -z $i ]]; then
-		continue
+# Assemble a single package: $1 = pkgname
+fakebuild() {
+	pkg_name="$1"
+	pkg_dir=("$pac_db/$pkg_name"-+([^-])-+([^-]))
+	pkg_namver=("${pkg_dir[@]##*/}")
+
+	# Checks database for specified package
+	if (( ${#pkg_dir[@]} != 1 )); then
+		error "%d entries for package %s found in pacman database" \
+			${#pkg_dir[@]} "${pkg_name}"
+		msg2 "%s" "${pkg_dir[@]}"
+		exit 1
 	fi
-
-	if [[ $i == %+([A-Z])% ]]; then
-		current=$i
-		continue
+	if [[ ! -d $pkg_dir ]]; then
+		error "package %s is found in pacman database," "${pkg_name}"
+		plain "       but '%s' is not a directory" "${pkg_dir}"
+		exit 1
 	fi
 
-	case "$current" in
-		%FILES%)
-			local_file="/$i"
-			package_file="$work_dir/$i"
+	# Create working directory
+	msg "Package: ${pkg_namver}"
+	work_dir=$(mktemp -d "${work_dir_root}.XXXXXXXXXX")
+	cd "$work_dir" || exit 1
 
-			if [[ ! -e $local_file ]]; then
-				warning "package file $local_file is missing"
-				continue
-			fi
-			;;
-
-		%BACKUP%)
-			# Get the MD5 checksum.
-			original_md5="${i##*$'\t'}"
-			# Strip the md5sum after the tab.
-			i="${i%$'\t'*}"
-			local_file="/$i.pacnew"
-			package_file="$work_dir/$i"
-
-			# Include unmodified .pacnew files.
-			local_md5="$(md5sum "$local_file" | cut -d' ' -f1)"
-			if [[ $INCLUDE_PACNEW == 'n' ]] \
-			|| [[ ! -e $local_file ]] \
-			|| [[ $local_md5 != $original_md5 ]]; then
-				# Warn about modified files.
-				local_md5="$(md5sum "/$i" | cut -d' ' -f1)"
-				if [[ $local_md5 != $original_md5 ]]; then
-					warning "package file /$i has been modified"
-				fi
-				# Let the normal file be included in the %FILES% list.
-				continue
-			fi
-			;;
+	# Assemble list of files which belong to the package and tar them
+	msg2 "Copying package files..."
+	while read i; do
+		if [[ -z $i ]]; then
+			continue
+		fi
 
-		*)
+		if [[ $i == %+([A-Z])% ]]; then
+			current=$i
 			continue
-			;;
-	esac
+		fi
 
-	ret=0
-	bsdtar -cnf - -s'/.pacnew$//' "$local_file" 2> /dev/null | bsdtar -xpf - 2> /dev/null
+		case "$current" in
+			%FILES%)
+				local_file="/$i"
+				package_file="$work_dir/$i"
+
+				if [[ ! -e $local_file ]]; then
+					warning "package file $local_file is missing"
+					continue
+				fi
+				;;
+
+			%BACKUP%)
+				# Get the MD5 checksum.
+				original_md5="${i##*$'\t'}"
+				# Strip the md5sum after the tab.
+				i="${i%$'\t'*}"
+				local_file="/$i.pacnew"
+				package_file="$work_dir/$i"
+
+				# Include unmodified .pacnew files.
+				local_md5="$(md5sum "$local_file" | cut -d' ' -f1)"
+				if [[ $INCLUDE_PACNEW == 'n' ]] \
+				|| [[ ! -e $local_file ]] \
+				|| [[ $local_md5 != $original_md5 ]]; then
+					# Warn about modified files.
+					local_md5="$(md5sum "/$i" | cut -d' ' -f1)"
+					if [[ $local_md5 != $original_md5 ]]; then
+						warning "package file /$i has been modified"
+					fi
+					# Let the normal file be included in the %FILES% list.
+					continue
+				fi
+				;;
 
-	# Workaround to bsdtar not reporting a missing file as an error
-	if ! [[ -e $package_file || -L $package_file ]]; then
-		error "unable to add $local_file to the package"
-		plain "       If your user does not have permission to read this file, then"
-		plain "       you will need to run $myname as root."
+			*)
+				continue
+				;;
+		esac
+
+		# Tar files
+		ret=0
+		bsdtar -cnf - -s'/.pacnew$//' "$local_file" 2> /dev/null | bsdtar -xpf - 2> /dev/null
+		# Workaround to bsdtar not reporting a missing file as an error
+		if ! [[ -e $package_file || -L $package_file ]]; then
+			error "unable to add $local_file to the package"
+			plain "       If your user does not have permission to read this file, then"
+			plain "       you will need to run $myname as root."
+			rm -rf "$work_dir"
+			exit 1
+		fi
+	done < "$pkg_dir"/files
+
+	ret=$?
+	if (( ret )); then
 		rm -rf "$work_dir"
 		exit 1
 	fi
-done < "$pkg_dir"/files
 
-ret=$?
-if (( ret )); then
-	rm -rf "$work_dir"
-	exit 1
-fi
-
-pkg_size=$(du -sk | awk '{print $1 * 1024}')
-
-#
-# .PKGINFO stuff
-# TODO adopt makepkg's write_pkginfo() into this or scripts/library
-#
-msg2 "Generating .PKGINFO metadata..."
-echo "# Generated by $myname $myver"    > .PKGINFO
-if [[ $INFAKEROOT == "1" ]]; then
-	echo "# Using $(fakeroot -v)"    >> .PKGINFO
-fi
-echo "# $(LC_ALL=C date)"            >> .PKGINFO
-echo "#"                    >> .PKGINFO
+	# Calculate package size
+	pkg_size=$(du -sk | awk '{print $1 * 1024}')
 
-while read i; do
-	if [[ -z $i ]]; then
-		continue;
+	# Reconstruct .PKGINFO from database
+	# TODO adopt makepkg's write_pkginfo() into this or scripts/library
+	msg2 "Generating .PKGINFO metadata..."
+	echo "# Generated by $myname $myver"    > .PKGINFO
+	if [[ $INFAKEROOT == "1" ]]; then
+		echo "# Using $(fakeroot -v)"    >> .PKGINFO
 	fi
-
-	if [[ $i == %+([A-Z])% ]]; then
-		current=$i
-		continue
+	echo "# $(LC_ALL=C date)"    >> .PKGINFO
+	echo "#"    >> .PKGINFO
+	while read i; do
+		if [[ -z $i ]]; then
+			continue;
+		fi
+		if [[ $i == %+([A-Z])% ]]; then
+			current=$i
+			continue
+		fi
+
+		case "$current" in
+			# desc
+			%NAME%)
+				echo "pkgname = $i"    >> .PKGINFO
+				;;
+			%VERSION%)
+				echo "pkgver = $i"    >> .PKGINFO
+				;;
+			%DESC%)
+				echo "pkgdesc = $i"    >> .PKGINFO
+				;;
+			%URL%)
+				echo "url = $i"    >> .PKGINFO
+				;;
+			%LICENSE%)
+				echo "license = $i"    >> .PKGINFO
+				;;
+			%ARCH%)
+				echo "arch = $i"    >> .PKGINFO
+				pkg_arch="$i"
+				;;
+			%BUILDDATE%)
+				echo "builddate = $(date -u "+%s")"    >> .PKGINFO
+				;;
+			%PACKAGER%)
+				echo "packager = $pkg_pkger"        >> .PKGINFO
+				;;
+			%SIZE%)
+				echo "size = $pkg_size"        >> .PKGINFO
+				;;
+			%GROUPS%)
+				echo "group = $i"    >> .PKGINFO
+				;;
+			%REPLACES%)
+				echo "replaces = $i"    >> .PKGINFO
+				;;
+			%DEPENDS%)
+				echo "depend = $i"   >> .PKGINFO
+				;;
+			%OPTDEPENDS%)
+				echo "optdepend = $i" >> .PKGINFO
+				;;
+			%CONFLICTS%)
+				echo "conflict = $i" >> .PKGINFO
+				;;
+			%PROVIDES%)
+				echo "provides = $i"  >> .PKGINFO
+				;;
+			%BACKUP%)
+				# Strip the md5sum after the tab
+				echo "backup = ${i%%$'\t'*}"   >> .PKGINFO
+				;;
+		esac
+	done < <(cat "$pkg_dir"/{desc,files})
+
+	comp_files=".PKGINFO"
+
+	# Add instal file if present
+	if [[ -f $pkg_dir/install ]]; then
+		cp "$pkg_dir/install" "$work_dir/.INSTALL"
+		comp_files+=" .INSTALL"
+	fi
+	if [[ -f $pkg_dir/changelog ]]; then
+		cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
+		comp_files+=" .CHANGELOG"
 	fi
 
-	case "$current" in
-		# desc
-		%NAME%)
-			echo "pkgname = $i"    >> .PKGINFO
-			;;
-		%VERSION%)
-			echo "pkgver = $i"    >> .PKGINFO
-			;;
-		%DESC%)
-			echo "pkgdesc = $i"    >> .PKGINFO
-			;;
-		%URL%)
-			echo "url = $i"    >> .PKGINFO
-			;;
-		%LICENSE%)
-			echo "license = $i"    >> .PKGINFO
-			;;
-		%ARCH%)
-			echo "arch = $i"    >> .PKGINFO
-			pkg_arch="$i"
-			;;
-		%BUILDDATE%)
-			echo "builddate = $(date -u "+%s")"    >> .PKGINFO
-			;;
-		%PACKAGER%)
-			echo "packager = $pkg_pkger"        >> .PKGINFO
-			;;
-		%SIZE%)
-			echo "size = $pkg_size"        >> .PKGINFO
-			;;
-		%GROUPS%)
-			echo "group = $i"    >> .PKGINFO
-			;;
-		%REPLACES%)
-			echo "replaces = $i"    >> .PKGINFO
-			;;
-		%DEPENDS%)
-			echo "depend = $i"   >> .PKGINFO
-			;;
-		%OPTDEPENDS%)
-			echo "optdepend = $i" >> .PKGINFO
-			;;
-		%CONFLICTS%)
-			echo "conflict = $i" >> .PKGINFO
-			;;
-		%PROVIDES%)
-			echo "provides = $i"  >> .PKGINFO
-			;;
-
-		# files
-		%BACKUP%)
-			# Strip the md5sum after the tab
-			echo "backup = ${i%%$'\t'*}"   >> .PKGINFO
-			;;
-	esac
-done < <(cat "$pkg_dir"/{desc,files})
-
-comp_files=".PKGINFO"
-
-if [[ -f $pkg_dir/install ]]; then
-	cp "$pkg_dir/install" "$work_dir/.INSTALL"
-	comp_files+=" .INSTALL"
-fi
-if [[ -f $pkg_dir/changelog ]]; then
-	cp "$pkg_dir/changelog" "$work_dir/.CHANGELOG"
-	comp_files+=" .CHANGELOG"
-fi
+	# Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL
+	chown root:root "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
+	chmod 644 "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
 
-#
-# Fixes owner:group and permissions for .PKGINFO, .CHANGELOG, .INSTALL
-#
-chown root:root "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
-chmod 644 "$work_dir"/{.PKGINFO,.CHANGELOG,.INSTALL} 2> /dev/null
+	# Generate the package
+	msg2 "Generating the package..."
 
-#
-# Generate the package
-#
-msg2 "Generating the package..."
-
-pkg_file="$pkg_dest/$pkg_namver-$pkg_arch${PKGEXT}"
-ret=0
-
-# TODO: Maybe this can be set globally for robustness
-shopt -s -o pipefail
-bsdtar -cf - $comp_files * |
-case "$PKGEXT" in
-	*tar.gz)  gzip -c -f -n ;;
-	*tar.bz2) bzip2 -c -f ;;
-	*tar.xz)  xz -c -z - ;;
-	*tar.Z)   compress -c -f ;;
-	*tar)     cat ;;
-	*) warning "'%s' is not a valid archive extension." \
-	"$PKGEXT"; cat ;;
-esac > "${pkg_file}"; ret=$?
-
-if (( ret )); then
-	error "Unable to write package to $pkg_dest"
-	plain "       Maybe the disk is full or you do not have write access"
+	pkg_file="$pkg_dest/$pkg_namver-$pkg_arch${PKGEXT}"
+	ret=0
+
+	# TODO: Maybe this can be set globally for robustness
+	shopt -s -o pipefail
+	bsdtar -cf - $comp_files * |
+	case "$PKGEXT" in
+		*tar.gz)  gzip -c -f -n ;;
+		*tar.bz2) bzip2 -c -f ;;
+		*tar.xz)  xz -c -z - ;;
+		*tar.Z)   compress -c -f ;;
+		*tar)     cat ;;
+		*) warning "'%s' is not a valid archive extension." \
+		"$PKGEXT"; cat ;;
+	esac > "${pkg_file}"; ret=$?
+
+	# Move compressed package to destination
+	if (( ret )); then
+		error "Unable to write package to $pkg_dest"
+		plain "       Maybe the disk is full or you do not have write access"
+		rm -rf "$work_dir"
+		exit 1
+	fi
+
+	# Clean up working directory
 	rm -rf "$work_dir"
-	exit 1
-fi
+}
 
-rm -rf "$work_dir"
 
+for PKG in $@; do fakebuild $PKG; done
 msg "Done."
 
 exit 0
-- 
2.9.3


More information about the pacman-dev mailing list