[pacman-dev] [PATCH 5/5] libmakepkg: extract functions for source download and extraction
Allan McRae
allan at archlinux.org
Sun May 17 14:11:16 UTC 2015
Signed-off-by: Allan McRae <allan at archlinux.org>
---
scripts/Makefile.am | 8 +
scripts/libmakepkg/source.sh.in | 113 ++++++++
scripts/libmakepkg/source/bzr.sh.in | 106 +++++++
scripts/libmakepkg/source/file.sh.in | 147 ++++++++++
scripts/libmakepkg/source/git.sh.in | 127 ++++++++
scripts/libmakepkg/source/hg.sh.in | 104 +++++++
scripts/libmakepkg/source/local.sh.in | 42 +++
scripts/libmakepkg/source/svn.sh.in | 93 ++++++
scripts/makepkg.sh.in | 524 ----------------------------------
scripts/po/POTFILES.in | 7 +
10 files changed, 747 insertions(+), 524 deletions(-)
create mode 100644 scripts/libmakepkg/source.sh.in
create mode 100644 scripts/libmakepkg/source/bzr.sh.in
create mode 100644 scripts/libmakepkg/source/file.sh.in
create mode 100644 scripts/libmakepkg/source/git.sh.in
create mode 100644 scripts/libmakepkg/source/hg.sh.in
create mode 100644 scripts/libmakepkg/source/local.sh.in
create mode 100644 scripts/libmakepkg/source/svn.sh.in
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 5cced98..907dc4f 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -43,6 +43,7 @@ libmakepkgdir = $(datarootdir)/makepkg
LIBMAKEPKGDIRS = \
lint_package \
lint_pkgbuild \
+ source \
tidy \
util
@@ -73,6 +74,13 @@ LIBMAKEPKG_IN = \
libmakepkg/lint_pkgbuild/provides.sh \
libmakepkg/lint_pkgbuild/source.sh \
libmakepkg/lint_pkgbuild/util.sh \
+ libmakepkg/source.sh \
+ libmakepkg/source/bzr.sh \
+ libmakepkg/source/file.sh \
+ libmakepkg/source/git.sh \
+ libmakepkg/source/hg.sh \
+ libmakepkg/source/local.sh \
+ libmakepkg/source/svn.sh \
libmakepkg/tidy.sh \
libmakepkg/tidy/docs.sh \
libmakepkg/tidy/emptydirs.sh \
diff --git a/scripts/libmakepkg/source.sh.in b/scripts/libmakepkg/source.sh.in
new file mode 100644
index 0000000..93a69b4
--- /dev/null
+++ b/scripts/libmakepkg/source.sh.in
@@ -0,0 +1,113 @@
+#!/bin/bash
+#
+# source.sh - functions for downloading and extracting sources
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_SH" ]] && return
+LIBMAKEPKG_SOURCE_SH=1
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+source "$LIBRARY/util/source.sh"
+
+
+for lib in "$LIBRARY/source/"*.sh; do
+ source "$lib"
+done
+
+
+download_sources() {
+ local netfile all_sources
+ local get_source_fn=get_all_sources_for_arch get_vcs=1
+
+ msg "$(gettext "Retrieving sources...")"
+
+ while true; do
+ case $1 in
+ allarch)
+ get_source_fn=get_all_sources
+ ;;
+ novcs)
+ get_vcs=0
+ ;;
+ *)
+ break 2
+ ;;
+ esac
+ shift
+ done
+
+ "$get_source_fn" 'all_sources'
+ for netfile in "${all_sources[@]}"; do
+ pushd "$SRCDEST" &>/dev/null
+
+ local proto=$(get_protocol "$netfile")
+ case "$proto" in
+ local)
+ download_local "$netfile"
+ ;;
+ bzr*)
+ (( get_vcs )) && download_bzr "$netfile"
+ ;;
+ git*)
+ (( get_vcs )) && download_git "$netfile"
+ ;;
+ hg*)
+ (( get_vcs )) && download_hg "$netfile"
+ ;;
+ svn*)
+ (( get_vcs )) && download_svn "$netfile"
+ ;;
+ *)
+ download_file "$netfile"
+ ;;
+ esac
+
+ popd &>/dev/null
+ done
+}
+
+extract_sources() {
+ msg "$(gettext "Extracting sources...")"
+ local netfile all_sources
+
+ get_all_sources_for_arch 'all_sources'
+ for netfile in "${all_sources[@]}"; do
+ local file=$(get_filename "$netfile")
+ local proto=$(get_protocol "$netfile")
+ case "$proto" in
+ bzr*)
+ extract_bzr "$netfile"
+ ;;
+ git*)
+ extract_git "$netfile"
+ ;;
+ hg*)
+ extract_hg "$netfile"
+ ;;
+ svn*)
+ extract_svn "$netfile"
+ ;;
+ *)
+ extract_file "$file"
+ ;;
+ esac
+ done
+}
diff --git a/scripts/libmakepkg/source/bzr.sh.in b/scripts/libmakepkg/source/bzr.sh.in
new file mode 100644
index 0000000..e8da28b
--- /dev/null
+++ b/scripts/libmakepkg/source/bzr.sh.in
@@ -0,0 +1,106 @@
+#!/bin/bash
+#
+# bzr.sh - function for handling the download and "extraction" of Bazaar sources
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_BZR_SH" ]] && return
+LIBMAKEPKG_SOURCE_BZR_SH=1
+
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+
+
+download_bzr() {
+ local netfile=$1
+
+ local url=$(get_url "$netfile")
+ if [[ $url != bzr+ssh* ]]; then
+ url=${url#bzr+}
+ fi
+ url=${url%%#*}
+
+ local repo=$(get_filename "$netfile")
+ local displaylocation="$url"
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
+ msg2 "$(gettext "Branching %s ...")" "${displaylocation}"
+ if ! bzr branch "$url" "$dir" --no-tree --use-existing-dir; then
+ error "$(gettext "Failure while branching %s")" "${displaylocation}"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ elif (( ! HOLDVER )); then
+ msg2 "$(gettext "Pulling %s ...")" "${displaylocation}"
+ cd_safe "$dir"
+ if ! bzr pull "$url"; then
+ # only warn on failure to allow offline builds
+ warning "$(gettext "Failure while pulling %s")" "${displaylocation}"
+ fi
+ fi
+}
+
+extract_bzr() {
+ local netfile=$1
+
+ local repo=$(get_filename "$netfile")
+ local fragment=${netfile#*#}
+ if [[ $fragment = "$netfile" ]]; then
+ unset fragment
+ fi
+
+ rev="last:1"
+ if [[ -n $fragment ]]; then
+ case ${fragment%%=*} in
+ revision)
+ rev="${fragment#*=}"
+ displaylocation="$url -r ${fragment#*=}"
+ ;;
+ *)
+ error "$(gettext "Unrecognized reference: %s")" "${fragment}"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ esac
+ fi
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "bzr"
+ pushd "$srcdir" &>/dev/null
+
+ if [[ -d "${dir##*/}" ]]; then
+ cd_safe "${dir##*/}"
+ if ! (bzr pull "$dir" -q --overwrite -r "$rev" && bzr clean-tree -q --detritus --force); then
+ error "$(gettext "Failure while updating working copy of %s %s repo")" "${repo}" "bzr"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ elif ! bzr checkout "$dir" -r "$rev"; then
+ error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "bzr"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+
+ popd &>/dev/null
+}
diff --git a/scripts/libmakepkg/source/file.sh.in b/scripts/libmakepkg/source/file.sh.in
new file mode 100644
index 0000000..03dabe6
--- /dev/null
+++ b/scripts/libmakepkg/source/file.sh.in
@@ -0,0 +1,147 @@
+#!/bin/bash
+#
+# file.sh - function for handling the download and extraction of source files
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_FILE_SH" ]] && return
+LIBMAKEPKG_SOURCE_FILE_SH=1
+
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+
+
+download_file() {
+ local netfile=$1
+
+ local filepath=$(get_filepath "$netfile")
+ if [[ -n "$filepath" ]]; then
+ msg2 "$(gettext "Found %s")" "${filepath##*/}"
+ return
+ fi
+
+ local proto=$(get_protocol "$netfile")
+
+ # find the client we should use for this URL
+ local -a cmdline
+ IFS=' ' read -a cmdline < <(get_downloadclient "$proto")
+ (( ${#cmdline[@]} )) || exit
+
+ local filename=$(get_filename "$netfile")
+ local url=$(get_url "$netfile")
+
+ if [[ $proto = "scp" ]]; then
+ # scp downloads should not pass the protocol in the url
+ url="${url##*://}"
+ fi
+
+ msg2 "$(gettext "Downloading %s...")" "$filename"
+
+ # temporary download file, default to last component of the URL
+ local dlfile="${url##*/}"
+
+ # replace %o by the temporary dlfile if it exists
+ if [[ ${cmdline[*]} = *%o* ]]; then
+ dlfile=$filename.part
+ cmdline=("${cmdline[@]//%o/$dlfile}")
+ fi
+ # add the URL, either in place of %u or at the end
+ if [[ ${cmdline[*]} = *%u* ]]; then
+ cmdline=("${cmdline[@]//%u/$url}")
+ else
+ cmdline+=("$url")
+ fi
+
+ if ! command -- "${cmdline[@]}" >&2; then
+ [[ ! -s $dlfile ]] && rm -f -- "$dlfile"
+ error "$(gettext "Failure while downloading %s")" "$filename"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+
+ # rename the temporary download file to the final destination
+ if [[ $dlfile != "$filename" ]]; then
+ mv -f "$SRCDEST/$dlfile" "$SRCDEST/$filename"
+ fi
+}
+
+extract_file() {
+ local file=$1
+
+ local filepath=$(get_filepath "$file")
+ rm -f "$srcdir/${file}"
+ ln -s "$filepath" "$srcdir/"
+
+ if in_array "$file" "${noextract[@]}"; then
+ # skip source files in the noextract=() array
+ # these are marked explicitly to NOT be extracted
+ return 0
+ fi
+
+ # do not rely on extension for file type
+ local file_type=$(file -bizL "$file")
+ local ext=${file##*.}
+ local cmd=''
+ case "$file_type" in
+ *application/x-tar*|*application/zip*|*application/x-zip*|*application/x-cpio*)
+ cmd="bsdtar" ;;
+ *application/x-gzip*)
+ case "$ext" in
+ gz|z|Z) cmd="gzip" ;;
+ *) return;;
+ esac ;;
+ *application/x-bzip*)
+ case "$ext" in
+ bz2|bz) cmd="bzip2" ;;
+ *) return;;
+ esac ;;
+ *application/x-xz*)
+ case "$ext" in
+ xz) cmd="xz" ;;
+ *) return;;
+ esac ;;
+ *)
+ # See if bsdtar can recognize the file
+ if bsdtar -tf "$file" -q '*' &>/dev/null; then
+ cmd="bsdtar"
+ else
+ return 0
+ fi ;;
+ esac
+
+ local ret=0
+ msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
+ if [[ $cmd = "bsdtar" ]]; then
+ $cmd -xf "$file" || ret=$?
+ else
+ rm -f -- "${file%.*}"
+ $cmd -dcf "$file" > "${file%.*}" || ret=$?
+ fi
+ if (( ret )); then
+ error "$(gettext "Failed to extract %s")" "$file"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+
+ if (( EUID == 0 )); then
+ # change perms of all source files to root user & root group
+ chown -R 0:0 "$srcdir"
+ fi
+}
diff --git a/scripts/libmakepkg/source/git.sh.in b/scripts/libmakepkg/source/git.sh.in
new file mode 100644
index 0000000..4d2f2d7
--- /dev/null
+++ b/scripts/libmakepkg/source/git.sh.in
@@ -0,0 +1,127 @@
+#!/bin/bash
+#
+# git.sh - function for handling the download and "extraction" of Git sources
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_GIT_SH" ]] && return
+LIBMAKEPKG_SOURCE_GIT_SH=1
+
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+
+
+download_git() {
+ local netfile=$1
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ local repo=$(get_filename "$netfile")
+
+ local url=$(get_url "$netfile")
+ url=${url#git+}
+ url=${url%%#*}
+
+ if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
+ msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
+ if ! git clone --mirror "$url" "$dir"; then
+ error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ elif (( ! HOLDVER )); then
+ cd_safe "$dir"
+ # Make sure we are fetching the right repo
+ if [[ "$url" != "$(git config --get remote.origin.url)" ]] ; then
+ error "$(gettext "%s is not a clone of %s")" "$dir" "$url"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "git"
+ if ! git fetch --all -p; then
+ # only warn on failure to allow offline builds
+ warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "git"
+ fi
+ fi
+}
+
+extract_git() {
+ local netfile=$1
+
+ local fragment=${netfile#*#}
+ if [[ $fragment = "$netfile" ]]; then
+ unset fragment
+ fi
+
+ local repo=${netfile##*/}
+ repo=${repo%%#*}
+ repo=${repo%%.git*}
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "git"
+ pushd "$srcdir" &>/dev/null
+
+ local updating=0
+ if [[ -d "${dir##*/}" ]]; then
+ updating=1
+ cd_safe "${dir##*/}"
+ if ! git fetch; then
+ error "$(gettext "Failure while updating working copy of %s %s repo")" "${repo}" "git"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ cd_safe "$srcdir"
+ elif ! git clone "$dir" "${dir##*/}"; then
+ error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "git"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+
+ cd_safe "${dir##*/}"
+
+ local ref=origin/HEAD
+ if [[ -n $fragment ]]; then
+ case ${fragment%%=*} in
+ commit|tag)
+ ref=${fragment##*=}
+ ;;
+ branch)
+ ref=origin/${fragment##*=}
+ ;;
+ *)
+ error "$(gettext "Unrecognized reference: %s")" "${fragment}"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ esac
+ fi
+
+ if [[ $ref != "origin/HEAD" ]] || (( updating )) ; then
+ if ! git checkout --force --no-track -B makepkg $ref; then
+ error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "git"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ fi
+
+ popd &>/dev/null
+}
diff --git a/scripts/libmakepkg/source/hg.sh.in b/scripts/libmakepkg/source/hg.sh.in
new file mode 100644
index 0000000..6b21dad
--- /dev/null
+++ b/scripts/libmakepkg/source/hg.sh.in
@@ -0,0 +1,104 @@
+#!/bin/bash
+#
+# hg.sh - function for handling the download and "extraction" of Mercurial sources
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_HG_SH" ]] && return
+LIBMAKEPKG_SOURCE_HG_SH=1
+
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+
+
+download_hg() {
+ local netfile=$1
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ local repo=$(get_filename "$netfile")
+
+ local url=$(get_url "$netfile")
+ url=${url#hg+}
+ url=${url%%#*}
+
+ if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
+ msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "hg"
+ if ! hg clone -U "$url" "$dir"; then
+ error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "hg"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ elif (( ! HOLDVER )); then
+ msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "hg"
+ cd_safe "$dir"
+ if ! hg pull; then
+ # only warn on failure to allow offline builds
+ warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "hg"
+ fi
+ fi
+}
+
+extract_hg() {
+ local netfile=$1
+
+ local fragment=${netfile#*#}
+ if [[ $fragment = "$netfile" ]]; then
+ unset fragment
+ fi
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ local repo=${netfile##*/}
+ repo=${repo%%#*}
+
+ msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "hg"
+ pushd "$srcdir" &>/dev/null
+
+ local ref=tip
+ if [[ -n $fragment ]]; then
+ case ${fragment%%=*} in
+ branch|revision|tag)
+ ref="${fragment##*=}"
+ ;;
+ *)
+ error "$(gettext "Unrecognized reference: %s")" "${fragment}"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ esac
+ fi
+
+ if [[ -d "${dir##*/}" ]]; then
+ cd_safe "${dir##*/}"
+ if ! (hg pull && hg update -C -r "$ref"); then
+ error "$(gettext "Failure while updating working copy of %s %s repo")" "${repo}" "hg"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ elif ! hg clone -u "$ref" "$dir" "${dir##*/}"; then
+ error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "hg"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+
+ popd &>/dev/null
+}
diff --git a/scripts/libmakepkg/source/local.sh.in b/scripts/libmakepkg/source/local.sh.in
new file mode 100644
index 0000000..bf65993
--- /dev/null
+++ b/scripts/libmakepkg/source/local.sh.in
@@ -0,0 +1,42 @@
+#!/bin/bash
+#
+# local.sh - function for handling the "download" of local sources
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_LOCAL_SH" ]] && return
+LIBMAKEPKG_SOURCE_LOCAL_SH=1
+
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+
+
+download_local() {
+ local netfile=$1
+ local filepath=$(get_filepath "$netfile")
+
+ if [[ -n "$filepath" ]]; then
+ msg2 "$(gettext "Found %s")" "${filepath##*/}"
+ else
+ local filename=$(get_filename "$netfile")
+ error "$(gettext "%s was not found in the build directory and is not a URL.")" "$filename"
+ exit 1 # $E_MISSING_FILE
+ fi
+}
diff --git a/scripts/libmakepkg/source/svn.sh.in b/scripts/libmakepkg/source/svn.sh.in
new file mode 100644
index 0000000..d706cac
--- /dev/null
+++ b/scripts/libmakepkg/source/svn.sh.in
@@ -0,0 +1,93 @@
+#!/bin/bash
+#
+# svn.sh - function for handling the download and "extraction" of Subversion sources
+#
+# Copyright (c) 2015 Pacman Development Team <pacman-dev at 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_SOURCE_SVN_SH" ]] && return
+LIBMAKEPKG_SOURCE_SVN_SH=1
+
+
+LIBRARY=${LIBRARY:-'@libmakepkgdir@'}
+
+source "$LIBRARY/util/message.sh"
+source "$LIBRARY/util/pkgbuild.sh"
+
+
+download_svn() {
+ local netfile=$1
+
+ local fragment=${netfile#*#}
+ if [[ $fragment = "$netfile" ]]; then
+ unset fragment
+ fi
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ local repo=$(get_filename "$netfile")
+
+ local url=$(get_url "$netfile")
+ if [[ $url != svn+ssh* ]]; then
+ url=${url#svn+}
+ fi
+ url=${url%%#*}
+
+ local ref=HEAD
+ if [[ -n $fragment ]]; then
+ case ${fragment%%=*} in
+ revision)
+ ref="${fragment##*=}"
+ ;;
+ *)
+ error "$(gettext "Unrecognized reference: %s")" "${fragment}"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ esac
+ fi
+
+ if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
+ msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "svn"
+ mkdir -p "$dir/.makepkg"
+ if ! svn checkout -r ${ref} --config-dir "$dir/.makepkg" "$url" "$dir"; then
+ error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "svn"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+ elif (( ! HOLDVER )); then
+ msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "svn"
+ cd_safe "$dir"
+ if ! svn update -r ${ref}; then
+ # only warn on failure to allow offline builds
+ warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "svn"
+ fi
+ fi
+}
+
+extract_svn() {
+ local netfile=$1
+
+ local dir=$(get_filepath "$netfile")
+ [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
+
+ local repo=${netfile##*/}
+ repo=${repo%%#*}
+
+ msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "svn"
+
+ cp -au "$dir" "$srcdir"
+}
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 140bb1a..c74e84a 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -175,502 +175,6 @@ enter_fakeroot() {
fakeroot -- $0 -F "${ARGLIST[@]}" || exit $?
}
-download_local() {
- local netfile=$1
- local filepath=$(get_filepath "$netfile")
-
- if [[ -n "$filepath" ]]; then
- msg2 "$(gettext "Found %s")" "${filepath##*/}"
- else
- local filename=$(get_filename "$netfile")
- error "$(gettext "%s was not found in the build directory and is not a URL.")" "$filename"
- exit 1 # $E_MISSING_FILE
- fi
-}
-
-download_file() {
- local netfile=$1
-
- local filepath=$(get_filepath "$netfile")
- if [[ -n "$filepath" ]]; then
- msg2 "$(gettext "Found %s")" "${filepath##*/}"
- return
- fi
-
- local proto=$(get_protocol "$netfile")
-
- # find the client we should use for this URL
- local -a cmdline
- IFS=' ' read -a cmdline < <(get_downloadclient "$proto")
- (( ${#cmdline[@]} )) || exit
-
- local filename=$(get_filename "$netfile")
- local url=$(get_url "$netfile")
-
- if [[ $proto = "scp" ]]; then
- # scp downloads should not pass the protocol in the url
- url="${url##*://}"
- fi
-
- msg2 "$(gettext "Downloading %s...")" "$filename"
-
- # temporary download file, default to last component of the URL
- local dlfile="${url##*/}"
-
- # replace %o by the temporary dlfile if it exists
- if [[ ${cmdline[*]} = *%o* ]]; then
- dlfile=$filename.part
- cmdline=("${cmdline[@]//%o/$dlfile}")
- fi
- # add the URL, either in place of %u or at the end
- if [[ ${cmdline[*]} = *%u* ]]; then
- cmdline=("${cmdline[@]//%u/$url}")
- else
- cmdline+=("$url")
- fi
-
- if ! command -- "${cmdline[@]}" >&2; then
- [[ ! -s $dlfile ]] && rm -f -- "$dlfile"
- error "$(gettext "Failure while downloading %s")" "$filename"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
-
- # rename the temporary download file to the final destination
- if [[ $dlfile != "$filename" ]]; then
- mv -f "$SRCDEST/$dlfile" "$SRCDEST/$filename"
- fi
-}
-
-extract_file() {
- local file=$1
-
- local filepath=$(get_filepath "$file")
- rm -f "$srcdir/${file}"
- ln -s "$filepath" "$srcdir/"
-
- if in_array "$file" "${noextract[@]}"; then
- # skip source files in the noextract=() array
- # these are marked explicitly to NOT be extracted
- return 0
- fi
-
- # do not rely on extension for file type
- local file_type=$(file -bizL "$file")
- local ext=${file##*.}
- local cmd=''
- case "$file_type" in
- *application/x-tar*|*application/zip*|*application/x-zip*|*application/x-cpio*)
- cmd="bsdtar" ;;
- *application/x-gzip*)
- case "$ext" in
- gz|z|Z) cmd="gzip" ;;
- *) return;;
- esac ;;
- *application/x-bzip*)
- case "$ext" in
- bz2|bz) cmd="bzip2" ;;
- *) return;;
- esac ;;
- *application/x-xz*)
- case "$ext" in
- xz) cmd="xz" ;;
- *) return;;
- esac ;;
- *)
- # See if bsdtar can recognize the file
- if bsdtar -tf "$file" -q '*' &>/dev/null; then
- cmd="bsdtar"
- else
- return 0
- fi ;;
- esac
-
- local ret=0
- msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
- if [[ $cmd = "bsdtar" ]]; then
- $cmd -xf "$file" || ret=$?
- else
- rm -f -- "${file%.*}"
- $cmd -dcf "$file" > "${file%.*}" || ret=$?
- fi
- if (( ret )); then
- error "$(gettext "Failed to extract %s")" "$file"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
-
- if (( EUID == 0 )); then
- # change perms of all source files to root user & root group
- chown -R 0:0 "$srcdir"
- fi
-}
-
-download_bzr() {
- local netfile=$1
-
- local url=$(get_url "$netfile")
- if [[ $url != bzr+ssh* ]]; then
- url=${url#bzr+}
- fi
- url=${url%%#*}
-
- local repo=$(get_filename "$netfile")
- local displaylocation="$url"
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
- msg2 "$(gettext "Branching %s ...")" "${displaylocation}"
- if ! bzr branch "$url" "$dir" --no-tree --use-existing-dir; then
- error "$(gettext "Failure while branching %s")" "${displaylocation}"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- elif (( ! HOLDVER )); then
- msg2 "$(gettext "Pulling %s ...")" "${displaylocation}"
- cd_safe "$dir"
- if ! bzr pull "$url"; then
- # only warn on failure to allow offline builds
- warning "$(gettext "Failure while pulling %s")" "${displaylocation}"
- fi
- fi
-}
-
-extract_bzr() {
- local netfile=$1
-
- local repo=$(get_filename "$netfile")
- local fragment=${netfile#*#}
- if [[ $fragment = "$netfile" ]]; then
- unset fragment
- fi
-
- rev="last:1"
- if [[ -n $fragment ]]; then
- case ${fragment%%=*} in
- revision)
- rev="${fragment#*=}"
- displaylocation="$url -r ${fragment#*=}"
- ;;
- *)
- error "$(gettext "Unrecognized reference: %s")" "${fragment}"
- plain "$(gettext "Aborting...")"
- exit 1
- esac
- fi
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "bzr"
- pushd "$srcdir" &>/dev/null
-
- if [[ -d "${dir##*/}" ]]; then
- cd_safe "${dir##*/}"
- if ! (bzr pull "$dir" -q --overwrite -r "$rev" && bzr clean-tree -q --detritus --force); then
- error "$(gettext "Failure while updating working copy of %s %s repo")" "${repo}" "bzr"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- elif ! bzr checkout "$dir" -r "$rev"; then
- error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "bzr"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
-
- popd &>/dev/null
-}
-
-download_git() {
- local netfile=$1
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- local repo=$(get_filename "$netfile")
-
- local url=$(get_url "$netfile")
- url=${url#git+}
- url=${url%%#*}
-
- if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
- msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
- if ! git clone --mirror "$url" "$dir"; then
- error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- elif (( ! HOLDVER )); then
- cd_safe "$dir"
- # Make sure we are fetching the right repo
- if [[ "$url" != "$(git config --get remote.origin.url)" ]] ; then
- error "$(gettext "%s is not a clone of %s")" "$dir" "$url"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "git"
- if ! git fetch --all -p; then
- # only warn on failure to allow offline builds
- warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "git"
- fi
- fi
-}
-
-extract_git() {
- local netfile=$1
-
- local fragment=${netfile#*#}
- if [[ $fragment = "$netfile" ]]; then
- unset fragment
- fi
-
- local repo=${netfile##*/}
- repo=${repo%%#*}
- repo=${repo%%.git*}
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "git"
- pushd "$srcdir" &>/dev/null
-
- local updating=0
- if [[ -d "${dir##*/}" ]]; then
- updating=1
- cd_safe "${dir##*/}"
- if ! git fetch; then
- error "$(gettext "Failure while updating working copy of %s %s repo")" "${repo}" "git"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- cd_safe "$srcdir"
- elif ! git clone "$dir" "${dir##*/}"; then
- error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "git"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
-
- cd_safe "${dir##*/}"
-
- local ref=origin/HEAD
- if [[ -n $fragment ]]; then
- case ${fragment%%=*} in
- commit|tag)
- ref=${fragment##*=}
- ;;
- branch)
- ref=origin/${fragment##*=}
- ;;
- *)
- error "$(gettext "Unrecognized reference: %s")" "${fragment}"
- plain "$(gettext "Aborting...")"
- exit 1
- esac
- fi
-
- if [[ $ref != "origin/HEAD" ]] || (( updating )) ; then
- if ! git checkout --force --no-track -B makepkg $ref; then
- error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "git"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- fi
-
- popd &>/dev/null
-}
-
-download_hg() {
- local netfile=$1
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- local repo=$(get_filename "$netfile")
-
- local url=$(get_url "$netfile")
- url=${url#hg+}
- url=${url%%#*}
-
- if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
- msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "hg"
- if ! hg clone -U "$url" "$dir"; then
- error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "hg"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- elif (( ! HOLDVER )); then
- msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "hg"
- cd_safe "$dir"
- if ! hg pull; then
- # only warn on failure to allow offline builds
- warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "hg"
- fi
- fi
-}
-
-extract_hg() {
- local netfile=$1
-
- local fragment=${netfile#*#}
- if [[ $fragment = "$netfile" ]]; then
- unset fragment
- fi
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- local repo=${netfile##*/}
- repo=${repo%%#*}
-
- msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "hg"
- pushd "$srcdir" &>/dev/null
-
- local ref=tip
- if [[ -n $fragment ]]; then
- case ${fragment%%=*} in
- branch|revision|tag)
- ref="${fragment##*=}"
- ;;
- *)
- error "$(gettext "Unrecognized reference: %s")" "${fragment}"
- plain "$(gettext "Aborting...")"
- exit 1
- esac
- fi
-
- if [[ -d "${dir##*/}" ]]; then
- cd_safe "${dir##*/}"
- if ! (hg pull && hg update -C -r "$ref"); then
- error "$(gettext "Failure while updating working copy of %s %s repo")" "${repo}" "hg"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- elif ! hg clone -u "$ref" "$dir" "${dir##*/}"; then
- error "$(gettext "Failure while creating working copy of %s %s repo")" "${repo}" "hg"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
-
- popd &>/dev/null
-}
-
-download_svn() {
- local netfile=$1
-
- local fragment=${netfile#*#}
- if [[ $fragment = "$netfile" ]]; then
- unset fragment
- fi
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- local repo=$(get_filename "$netfile")
-
- local url=$(get_url "$netfile")
- if [[ $url != svn+ssh* ]]; then
- url=${url#svn+}
- fi
- url=${url%%#*}
-
- local ref=HEAD
- if [[ -n $fragment ]]; then
- case ${fragment%%=*} in
- revision)
- ref="${fragment##*=}"
- ;;
- *)
- error "$(gettext "Unrecognized reference: %s")" "${fragment}"
- plain "$(gettext "Aborting...")"
- exit 1
- esac
- fi
-
- if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
- msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "svn"
- mkdir -p "$dir/.makepkg"
- if ! svn checkout -r ${ref} --config-dir "$dir/.makepkg" "$url" "$dir"; then
- error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "svn"
- plain "$(gettext "Aborting...")"
- exit 1
- fi
- elif (( ! HOLDVER )); then
- msg2 "$(gettext "Updating %s %s repo...")" "${repo}" "svn"
- cd_safe "$dir"
- if ! svn update -r ${ref}; then
- # only warn on failure to allow offline builds
- warning "$(gettext "Failure while updating %s %s repo")" "${repo}" "svn"
- fi
- fi
-}
-
-extract_svn() {
- local netfile=$1
-
- local dir=$(get_filepath "$netfile")
- [[ -z "$dir" ]] && dir="$SRCDEST/$(get_filename "$netfile")"
-
- local repo=${netfile##*/}
- repo=${repo%%#*}
-
- msg2 "$(gettext "Creating working copy of %s %s repo...")" "${repo}" "svn"
-
- cp -au "$dir" "$srcdir"
-}
-
-download_sources() {
- local netfile all_sources
- local get_source_fn=get_all_sources_for_arch get_vcs=1
-
- msg "$(gettext "Retrieving sources...")"
-
- while true; do
- case $1 in
- allarch)
- get_source_fn=get_all_sources
- ;;
- novcs)
- get_vcs=0
- ;;
- *)
- break 2
- ;;
- esac
- shift
- done
-
- "$get_source_fn" 'all_sources'
- for netfile in "${all_sources[@]}"; do
- pushd "$SRCDEST" &>/dev/null
-
- local proto=$(get_protocol "$netfile")
- case "$proto" in
- local)
- download_local "$netfile"
- ;;
- bzr*)
- (( get_vcs )) && download_bzr "$netfile"
- ;;
- git*)
- (( get_vcs )) && download_git "$netfile"
- ;;
- hg*)
- (( get_vcs )) && download_hg "$netfile"
- ;;
- svn*)
- (( get_vcs )) && download_svn "$netfile"
- ;;
- *)
- download_file "$netfile"
- ;;
- esac
-
- popd &>/dev/null
- done
-}
-
# Automatically update pkgver variable if a pkgver() function is provided
# Re-sources the PKGBUILD afterwards to allow for other variables that use $pkgver
update_pkgver() {
@@ -1226,34 +730,6 @@ check_source_integrity() {
fi
}
-extract_sources() {
- msg "$(gettext "Extracting sources...")"
- local netfile all_sources
-
- get_all_sources_for_arch 'all_sources'
- for netfile in "${all_sources[@]}"; do
- local file=$(get_filename "$netfile")
- local proto=$(get_protocol "$netfile")
- case "$proto" in
- bzr*)
- extract_bzr "$netfile"
- ;;
- git*)
- extract_git "$netfile"
- ;;
- hg*)
- extract_hg "$netfile"
- ;;
- svn*)
- extract_svn "$netfile"
- ;;
- *)
- extract_file "$file"
- ;;
- esac
- done
-}
-
error_function() {
if [[ -p $logpipe ]]; then
rm "$logpipe"
diff --git a/scripts/po/POTFILES.in b/scripts/po/POTFILES.in
index 30bc3f4..00cb1b8 100644
--- a/scripts/po/POTFILES.in
+++ b/scripts/po/POTFILES.in
@@ -28,6 +28,13 @@ scripts/libmakepkg/lint_pkgbuild/pkgver.sh.in
scripts/libmakepkg/lint_pkgbuild/provides.sh.in
scripts/libmakepkg/lint_pkgbuild/source.sh.in
scripts/libmakepkg/lint_pkgbuild/util.sh.in
+scripts/libmakepkg/source.sh.in
+scripts/libmakepkg/source/bzr.sh.in
+scripts/libmakepkg/source/file.sh.in
+scripts/libmakepkg/source/git.sh.in
+scripts/libmakepkg/source/hg.sh.in
+scripts/libmakepkg/source/local.sh.in
+scripts/libmakepkg/source/svn.sh.in
scripts/libmakepkg/tidy.sh.in
scripts/libmakepkg/tidy/docs.sh.in
scripts/libmakepkg/tidy/emptydirs.sh.in
--
2.4.1
More information about the pacman-dev
mailing list