[pacman-dev] [PATCH 04/11] makepkg: generalize download_sources

Allan McRae allan at archlinux.org
Tue Jun 26 18:58:10 EDT 2012


In order to treat all VCS sources as URLs, we need to be able to
deal with more protocols. Rewrite download_sources to use a case
statement so additional protocols are easily added.

Also fix the use of scp to not pass the protocol in the URL
(noticed by William J. Bowman <wjb at williamjbowman.com>)

Signed-off-by: Allan McRae <allan at archlinux.org>
---
 scripts/makepkg.sh.in | 112 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 67 insertions(+), 45 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 0d87cba..2a8866f 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -234,9 +234,7 @@ get_protocol() {
 }
 
 get_downloadclient() {
-	# $1 = URL with valid protocol prefix
-	local url=$1
-	local proto="${url%%://*}"
+	local proto=$1
 
 	# loop through DOWNLOAD_AGENTS variable looking for protocol
 	local i
@@ -267,20 +265,56 @@ get_downloadclient() {
 	printf "%s\n" "$agent"
 }
 
+download_local() {
+	local netfile=$1
+	local filepath=$(get_filepath "$netfile")
+
+	if [[ -n "$filepath" ]]; then
+		msg2 "$(gettext "Found %s")" "${filepath##*/}"
+		rm -f "$srcdir/${filepath##*/}"
+		ln -s "$filepath" "$srcdir/"
+		continue
+	else
+		local filename=$(get_filename "$netfile")
+		error "$(gettext "%s was not found in the build directory and is not a URL.")" "$filename"
+		exit 1 # $E_MISSING_FILE
+	fi
+}
+
 download_file() {
-	# download command
-	local dlcmd=$1
-	# URL of the file
-	local url=$2
-	# destination file
-	local file=$3
+	local netfile=$1
+
+	local filepath=$(get_filepath "$netfile")
+	if [[ -n "$filepath" ]]; then
+		msg2 "$(gettext "Found %s")" "${filepath##*/}"
+		rm -f "$srcdir/${filepath##*/}"
+		ln -s "$filepath" "$srcdir/"
+		return
+	fi
+
+	local proto=$(get_protocol "$netfile")
+
+	# find the client we should use for this URL
+	local dlcmd
+	dlcmd=$(get_downloadclient "$proto") || exit $?
+
+	local filename=$(get_filename "$netfile")
+	local url=$(get_url "$netfile")
+
+	if [[ $proto = "scp" ]]; then
+		# scp downloads should not pass the protocol in the url
+		url="${url##*://}"
+	fi
+
+	msg2 "$(gettext "Downloading %s...")" "$filename"
+
 	# temporary download file, default to last component of the URL
 	local dlfile="${url##*/}"
 
 	# replace %o by the temporary dlfile if it exists
 	if [[ $dlcmd = *%o* ]]; then
-		dlcmd=${dlcmd//\%o/\"$file.part\"}
-		dlfile="$file.part"
+		dlcmd=${dlcmd//\%o/\"$filename.part\"}
+		dlfile="$filename.part"
 	fi
 	# add the URL, either in place of %u or at the end
 	if [[ $dlcmd = *%u* ]]; then
@@ -293,13 +327,18 @@ download_file() {
 	eval "$dlcmd || ret=\$?"
 	if (( ret )); then
 		[[ ! -s $dlfile ]] && rm -f -- "$dlfile"
-		return $ret
+		error "$(gettext "Failure while downloading %s")" "$filename"
+		plain "$(gettext "Aborting...")"
+		exit 1
 	fi
 
 	# rename the temporary download file to the final destination
-	if [[ $dlfile != "$file" ]]; then
-		mv -f "$SRCDEST/$dlfile" "$SRCDEST/$file"
+	if [[ $dlfile != "$filename" ]]; then
+		mv -f "$SRCDEST/$dlfile" "$SRCDEST/$filename"
 	fi
+
+	rm -f "$srcdir/$filename"
+	ln -s "$SRCDEST/$filename" "$srcdir/"
 }
 
 download_sources() {
@@ -309,38 +348,21 @@ download_sources() {
 
 	local netfile
 	for netfile in "${source[@]}"; do
-		local file=$(get_filepath "$netfile" || true)
-		if [[ -n "$file" ]]; then
-			msg2 "$(gettext "Found %s")" "${file##*/}"
-			rm -f "$srcdir/${file##*/}"
-			ln -s "$file" "$srcdir/"
-			continue
-		fi
-
-		file=$(get_filename "$netfile")
-		local url=$(get_url "$netfile")
-
-		# if we get here, check to make sure it was a URL, else fail
-		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
+		local proto=$(get_protocol "$netfile")
 
-		# find the client we should use for this URL
-		local dlclient
-		dlclient=$(get_downloadclient "$url") || exit $?
-
-		msg2 "$(gettext "Downloading %s...")" "$file"
-		# fix flyspray bug #3289
-		local ret=0
-		download_file "$dlclient" "$url" "$file" || ret=$?
-		if (( ret )); then
-			error "$(gettext "Failure while downloading %s")" "$file"
-			plain "$(gettext "Aborting...")"
-			exit 1
-		fi
-		rm -f "$srcdir/$file"
-		ln -s "$SRCDEST/$file" "$srcdir/"
+		case "$proto" in
+			local)
+				download_local "$netfile"
+				;;
+			ftp|http|https|rsync|scp)
+				download_file "$netfile"
+				;;
+			*)
+				error "$(gettext "Unknown download protocol: %s")" "$proto"
+				plain "$(gettext "Aborting...")"
+				exit 1
+				;;
+		esac
 	done
 
 	popd &>/dev/null
-- 
1.7.11.1



More information about the pacman-dev mailing list