[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