[pacman-dev] [RFC] [PATCH] repo-add: Add SOURCE entry

Allan McRae allan at archlinux.org
Sat Apr 21 07:26:43 EDT 2012


When repo-add is passed a source package, add it to the desc file.

Signed-off-by: Allan McRae <allan at archlinux.org>
---

This patch is crap... but I want to know if an idea like this would even
be considered before I make it suck less and implement the pacman side.

The idea is "pacman -B/--build <pkg>" would download the source package file
(if provided in the repo) and build the package. Of course this could be
extended (e.g. -w to only download, -e allows editing the PKGBUILD prior to
building, -u builds an entire update, -d builds a package but not its deps, 
--nopatch disables patching the build files with the patch found in 
/etc/pacman.d/build/$pkgbase).

Is this the mindless ramblings of a lunatic, or something that would be of
interest?

 scripts/repo-add.sh.in |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/scripts/repo-add.sh.in b/scripts/repo-add.sh.in
index 5159ea2..80e512b 100644
--- a/scripts/repo-add.sh.in
+++ b/scripts/repo-add.sh.in
@@ -187,6 +187,40 @@ db_remove_delta() {
 	return 1
 } # end db_remove_delta
 
+# write a source entry
+#   arg1 - path to source package file
+db_write_source() {
+	sourcefile="$1"
+
+	pkgbase=${1%-*-*}
+
+	local line
+	while read -r line; do
+	# TODO - suck less (leading whitespace, variable usage, split packages...)
+		[[ ${line} = pkgname=* ]] && declare "$line"
+		[[ ${line} = pkgver=* ]] && declare "$line"
+		[[ ${line} = pkgrel=* ]] && declare "$line"
+	done< <(bsdtar -xOqf "$sourcefile" "$pkgbase/@BUILDSCRIPT@")
+
+	# ensure needed variables were found
+	if [[ -z $pkgname || -z $pkgver || -z $pkgrel ]]; then
+		error "$(gettext "Invalid source package file '%s'.")" "$sourcefile"
+		return 1
+	fi
+
+	if [[ ! -f $tmpdir/tree/$pkgname-$pkgver-$pkgrel/desc ]]; then
+		error "$(gettext "No database entry for package '%s'.")" "$pkgname-$pkgver-$pkgrel"
+		return 1
+	fi
+
+	format_entry "SOURCE"  "${1##*/}"  >> $tmpdir/tree/$pkgname-$pkgver-$pkgrel/desc
+
+	# TODO - will want some security here... checksum/signature
+
+	return 0
+}
+
+
 check_gpg() {
 	if ! type -p gpg >/dev/null; then
 		error "$(gettext "Cannot find the gpg binary! Is GnuPG installed?")"
@@ -497,6 +531,16 @@ add() {
 		fi
 	fi
 
+	if [[ $1 == *.src.tar?(.*) ]]; then
+		sourcefile=$1
+		msg "$(gettext "Adding source '%s'")" "$sourcefile"
+		if db_write_source "$sourcefile"; then
+			return 0
+		else
+			return 1
+		fi
+	fi
+
 	pkgfile=$1
 	if ! bsdtar -tqf "$pkgfile" .PKGINFO >/dev/null 2>&1; then
 		error "$(gettext "'%s' is not a package file, skipping")" "$pkgfile"
-- 
1.7.10



More information about the pacman-dev mailing list