[pacman-dev] [PATCH] makepkg : allow to specify a download filename

Xavier Chantry shiningxc at gmail.com
Sun Aug 24 09:14:08 EDT 2008


A source entry can now have the following form, to specify a different
filename :
"filename::http://path/to/file"

Of course, the old syntax is still supported :
"http://path/to/file"

And as before, in the second case, the filename used is simply "file".

This fixes FS#11292, because handling multiple source files with the same
name is now possible (just choose a different filename).

But it will also allow to deal much more nicely with funny url like this by
using a sane filename (and unfortunately, there are quite a few) :
http://www.vim.org/scripts/download_script.php?src_id=6992

Signed-off-by: Xavier Chantry <shiningxc at gmail.com>
---
 doc/PKGBUILD.5.txt    |    4 +++
 scripts/makepkg.sh.in |   65 ++++++++++++++++++++++++++++++++++---------------
 2 files changed, 49 insertions(+), 20 deletions(-)

diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt
index 0b1ce64..c63b3ec 100644
--- a/doc/PKGBUILD.5.txt
+++ b/doc/PKGBUILD.5.txt
@@ -87,6 +87,10 @@ similar to `$_basekernver`.
 	variables if possible when specifying the download location. Any files
 	that are compressed will automatically be extracted, unless found in
 	the noextract array listed below.
+	+
+	It is also possible to specify an optional filename, which is helpful
+	with weird URLs and for handling multiple source files with the same
+	name. The syntax is: `source=('filename::url')`
 
 *noextract (array)*::
 	An array of filenames corresponding to those from the source array. Files
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index d127d16..1d70f39 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -163,11 +163,23 @@ trap 'trap_exit "$(gettext "TERM signal caught. Exiting...")"' TERM HUP QUIT
 trap 'trap_exit "$(gettext "Aborted by user! Exiting...")"' INT
 trap 'trap_exit "$(gettext "An unknown error has occured. Exiting...")"' ERR
 
-
-strip_url() {
-	echo "$1" | sed 's|^.*://.*/||g'
+# a source entry can have two forms :
+# 1) "filename::http://path/to/file"
+# 2) "http://path/to/file"
+
+# extract the filename from a source entry
+get_filename() {
+	# if a filename is specified, use it
+	local filename=$(echo $1 | sed 's|::.*||')
+	# if it is just an url, we only keep the last component
+	echo "$filename" | sed 's|^.*://.*/||g'
 }
 
+# extract the url from a source entry
+get_url() {
+	# strip an eventual filename
+	echo $1 | sed 's|.*::||'
+}
 
 ##
 # Checks to see if options are present in makepkg.conf or PKGBUILD;
@@ -284,18 +296,33 @@ get_downloadclient() {
 }
 
 download_file() {
+	# download command
 	local dlcmd=$1
-	local netfile=$2
+	# url of the file
+	local url=$2
+	# destination file
 	local file=$3
+	# temporary download file, default to last component of the url
+	local dlfile=$(echo "$url" | sed 's|^.*://.*/||g')
 
-	if echo "$dlcmd" | grep -q "%u" ; then
+	# replace %o by the temporary dlfile if it exists
+	if echo "$dlcmd" | grep -q "%o" ; then
 		dlcmd=${dlcmd//%o/$file.part}
-		dlcmd=${dlcmd//%u/$netfile}
+		dlfile="$file.part"
+	fi
+	# add the url, either in place of %u or at the end
+	if echo "$dlcmd" | grep -q "%u" ; then
+		dlcmd=${dlcmd//%u/$url}
 	else
-		dlcmd="$dlcmd $netfile"
+		dlcmd="$dlcmd $url"
 	fi
 
-	$dlcmd
+	$dlcmd || return $?
+
+	# rename the temporary download file to the final destination
+	if [ "$dlfile" != "$file" ]; then
+		mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
+	fi
 }
 
 check_deps() {
@@ -418,7 +445,8 @@ download_sources() {
 
 	local netfile
 	for netfile in "${source[@]}"; do
-		local file=$(strip_url "$netfile")
+		local file=$(get_filename "$netfile")
+		local url=$(get_url "$netfile")
 		if [ -f "$startdir/$file" ]; then
 			msg2 "$(gettext "Found %s in build dir")" "$file"
 			rm -f "$srcdir/$file"
@@ -432,26 +460,23 @@ download_sources() {
 		fi
 
 		# if we get here, check to make sure it was a URL, else fail
-		if [ "$file" = "$netfile" ]; then
-			error "$(gettext "%s was not found in the build directory and is not a URL.")" "$netfile"
+		if [ "$file" = "$url" ]; then
+			error "$(gettext "%s was not found in the build directory and is not a URL.")" "$file"
 			exit 1 # $E_MISSING_FILE
 		fi
 
 		# find the client we should use for this URL
-		local dlclient=$(get_downloadclient "$netfile") || exit $?
+		local dlclient=$(get_downloadclient "$url") || exit $?
 
 		msg2 "$(gettext "Downloading %s...")" "$file"
 		# fix flyspray bug #3289
 		local ret=0
-		download_file "$dlclient" "$netfile" "$file" || ret=$?
+		download_file "$dlclient" "$url" "$file" || ret=$?
 		if [ $ret -gt 0 ]; then
 			error "$(gettext "Failure while downloading %s")" "$file"
 			plain "$(gettext "Aborting...")"
 			exit 1
 		fi
-		if echo "$dlclient" | grep -q "%o" ; then
-			mv -f "$SRCDEST/$file.part" "$SRCDEST/$file"
-		fi
 		rm -f "$srcdir/$file"
 		ln -s "$SRCDEST/$file" "$srcdir/"
 	done
@@ -491,7 +516,7 @@ generate_checksums() {
 
 		local netfile
 		for netfile in "${source[@]}"; do
-			local file="$(strip_url "$netfile")"
+			local file="$(get_filename "$netfile")"
 
 			if [ ! -f "$file" ] ; then
 				if [ ! -f "$SRCDEST/$file" ] ; then
@@ -537,7 +562,7 @@ check_checksums() {
 			local idx=0
 			local file
 			for file in "${source[@]}"; do
-				file="$(strip_url "$file")"
+				file="$(get_filename "$file")"
 				echo -n "    $file ... " >&2
 
 				if [ ! -f "$file" ] ; then
@@ -576,7 +601,7 @@ extract_sources() {
 	msg "$(gettext "Extracting Sources...")"
 	local netfile
 	for netfile in "${source[@]}"; do
-		file=$(strip_url "$netfile")
+		file=$(get_filename "$netfile")
 		if in_array "$file" ${noextract[@]}; then
 			#skip source files in the noextract=() array
 			#  these are marked explicitly to NOT be extracted
@@ -959,7 +984,7 @@ create_srcpackage() {
 
 	local netfile
 	for netfile in "${source[@]}"; do
-		local file=$(strip_url "$netfile")
+		local file=$(get_filename "$netfile")
 		if [ -f "$netfile" ]; then
 			msg2 "$(gettext "Adding %s...")" "$netfile"
 			ln -s "${startdir}/$netfile" "${srclinks}/${pkgname}"
-- 
1.6.0




More information about the pacman-dev mailing list