summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/makepkg.conf.5.txt5
-rw-r--r--scripts/makepkg.sh.in70
2 files changed, 75 insertions, 0 deletions
diff --git a/doc/makepkg.conf.5.txt b/doc/makepkg.conf.5.txt
index af4df201..4dc3b388 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 f9e816fa..48e19899 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 "${VCSCLIENTS[@]}"; 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
}