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@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