[pacman-dev] [PATCH v2] makepkg: ensure vcs download tool are installed when required
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
On 08/03/14 at 07:48pm, Allan McRae wrote:
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
You still have a name mismatch between this and the documentation.
On 04/08/14 04:40, Andrew Gregory wrote:
You still have a name mismatch between this and the documentation.
I knew there was something else I needed to do... Fixed on my patchqueue branch. A
participants (2)
-
Allan McRae
-
Andrew Gregory