[pacman-dev] [PATCH v2] makepkg: ensure vcs download tool are installed when required

Allan McRae allan at archlinux.org
Sun Aug 3 05:48:11 EDT 2014


Add an array VCSCLIENTS to makepkg.conf that matches vcs source protocols
to the package containing the software needed for handling the source.

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

v2. also check for vcs binary on system

 doc/makepkg.conf.5.txt |  5 ++++
 scripts/makepkg.sh.in  | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 75 insertions(+)

diff --git a/doc/makepkg.conf.5.txt b/doc/makepkg.conf.5.txt
index af4df20..4dc3b38 100644
--- a/doc/makepkg.conf.5.txt
+++ b/doc/makepkg.conf.5.txt
@@ -47,6 +47,11 @@ Options
 	be replaced with the local file name, plus a ``.part'' extension, which allows
 	makepkg to handle resuming file downloads.
 
+**VCSCLIENTS=(**\'protocol::package' ...**)**::
+	Sets the packages required to fetch version controlled source files. When
+	required, makepkg will check that these packages are installed or are included
+	in the `depends` or `makedepends` arrays in the PKGBUILD.
+
 **CARCH=**"carch"::
 	Specifies your computer architecture; possible values include such things
 	as ``i686'', ``x86_64'', ``ppc'', etc. This should be automatically set on
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index f9e816f..40355b5 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -2402,6 +2402,71 @@ check_pkgver() {
 	return $ret
 }
 
+get_vcsclient() {
+	local proto=${1%%+*}
+
+	local i
+	for i in "${VCSCLIENT[@]}"; do
+		local handler="${i%%::*}"
+		if [[ $proto = "$handler" ]]; then
+			local client="${i##*::}"
+			break
+		fi
+	done
+
+	# if we didn't find an client, return an error
+	if [[ -z $client ]]; then
+		error "$(gettext "Unknown download protocol: %s")" "$proto"
+		plain "$(gettext "Aborting...")"
+		exit 1 # $E_CONFIG_ERROR
+	fi
+
+	printf "%s\n" "$client"
+}
+
+check_vcs_software() {
+	local ret=0
+
+	if (( SOURCEONLY == 1 )); then
+		# we will not download VCS sources
+		return $ret
+	fi
+
+	if [[ -z $PACMAN_PATH ]]; then
+		warning "$(gettext "Cannot find the %s binary needed to check VCS source requirements.")" "$PACMAN"
+		return $ret
+	fi
+
+	for netfile in ${source[@]}; do
+		local proto=$(get_protocol "$netfile")
+
+		case $proto in
+			bzr*|git*|hg*|svn*)
+				if ! type -p ${proto%%+*} > /dev/null; then
+					local client
+					client=$(get_vcsclient "$proto") || exit $?
+					# ensure specified program is installed
+					local uninstalled
+					uninstalled="$(set +E; check_deps $client)" || exit 1
+					# if not installed, check presence in depends or makedepends
+					if [[ -n "$uninstalled" ]] && (( ! NODEPS )); then
+						if ! in_array "$client" ${depends[@]} ${makedepends[@]}; then
+							error "$(gettext "Cannot find the %s package needed to handle %s sources.")" \
+									"$client" "${proto%%+*}"
+							ret=1
+						fi
+					fi
+				fi
+				;;
+			*)
+				# non VCS source
+				;;
+		esac
+	done
+
+	return $ret
+}
+
 check_software() {
 	# check for needed software
 	local ret=0
@@ -2493,6 +2558,11 @@ check_software() {
 		fi
 	fi
 
+	# tools to download vcs sources
+	if ! check_vcs_software; then
+		ret=1
+	fi
+
 	return $ret
 }
 
-- 
2.0.3


More information about the pacman-dev mailing list