diff options
Diffstat (limited to 'scripts/libmakepkg/util')
-rw-r--r-- | scripts/libmakepkg/util/source.sh.in | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/scripts/libmakepkg/util/source.sh.in b/scripts/libmakepkg/util/source.sh.in new file mode 100644 index 00000000..0a4f671c --- /dev/null +++ b/scripts/libmakepkg/util/source.sh.in @@ -0,0 +1,144 @@ +#!/bin/bash +# +# source.sh - functions to extract information from source URLs +# +# Copyright (c) 2010-2015 Pacman Development Team <pacman-dev@archlinux.org> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +[[ -n "$LIBMAKEPKG_UTIL_SOURCE_SH" ]] && return +LIBMAKEPKG_UTIL_SOURCE_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + + +# a source entry can have two forms : +# 1) "filename::http://path/to/file" +# 2) "http://path/to/file" + +# extract the URL from a source entry +get_url() { + # strip an eventual filename + printf "%s\n" "${1#*::}" +} + +# extract the protocol from a source entry - return "local" for local sources +get_protocol() { + if [[ $1 = *://* ]]; then + # strip leading filename + local proto="${1#*::}" + printf "%s\n" "${proto%%://*}" + elif [[ $1 = *lp:* ]]; then + local proto="${1#*::}" + printf "%s\n" "${proto%%lp:*}" + else + printf "%s\n" local + fi +} + +# extract the filename from a source entry +get_filename() { + local netfile=$1 + + # if a filename is specified, use it + if [[ $netfile = *::* ]]; then + printf "%s\n" ${netfile%%::*} + return + fi + + local proto=$(get_protocol "$netfile") + + case $proto in + bzr*|git*|hg*|svn*) + filename=${netfile%%#*} + filename=${filename%/} + filename=${filename##*/} + if [[ $proto = bzr* ]]; then + filename=${filename#*lp:} + fi + if [[ $proto = git* ]]; then + filename=${filename%%.git*} + fi + ;; + *) + # if it is just an URL, we only keep the last component + filename="${netfile##*/}" + ;; + esac + printf "%s\n" "${filename}" +} + +# Return the absolute filename of a source entry +get_filepath() { + local file="$(get_filename "$1")" + local proto="$(get_protocol "$1")" + + case $proto in + bzr*|git*|hg*|svn*) + if [[ -d "$startdir/$file" ]]; then + file="$startdir/$file" + elif [[ -d "$SRCDEST/$file" ]]; then + file="$SRCDEST/$file" + else + return 1 + fi + ;; + *) + if [[ -f "$startdir/$file" ]]; then + file="$startdir/$file" + elif [[ -f "$SRCDEST/$file" ]]; then + file="$SRCDEST/$file" + else + return 1 + fi + ;; + esac + + printf "%s\n" "$file" +} + +get_downloadclient() { + local proto=$1 + + # loop through DOWNLOAD_AGENTS variable looking for protocol + local i + for i in "${DLAGENTS[@]}"; do + local handler="${i%%::*}" + if [[ $proto = "$handler" ]]; then + local agent="${i#*::}" + break + fi + done + + # if we didn't find an agent, return an error + if [[ -z $agent ]]; then + error "$(gettext "Unknown download protocol: %s")" "$proto" + plain "$(gettext "Aborting...")" + exit 1 # $E_CONFIG_ERROR + fi + + # ensure specified program is installed + local program="${agent%% *}" + if [[ ! -x $program ]]; then + local baseprog="${program##*/}" + error "$(gettext "The download program %s is not installed.")" "$baseprog" + plain "$(gettext "Aborting...")" + exit 1 # $E_MISSING_PROGRAM + fi + + printf "%s\n" "$agent" +} |