Moved functions out in preparation for splitting out download functions. scripts/libmakepkg/*.sh files only import the files from their relevant directory. All libmakepkg files have an inclusion guard. Also added libmakepkg targets to Makefile.am. Signed-off-by: Ashley Whetter <ashley@awhetter.co.uk> --- scripts/.gitignore | 4 + scripts/Makefile.am | 38 +++++++- scripts/libmakepkg/util.sh.in | 30 +++++++ scripts/libmakepkg/util/message.sh | 55 ++++++++++++ scripts/libmakepkg/util/url.sh.in | 145 ++++++++++++++++++++++++++++++ scripts/libmakepkg/util/util.sh.in | 58 ++++++++++++ scripts/makepkg.sh.in | 180 ++----------------------------------- 7 files changed, 333 insertions(+), 177 deletions(-) create mode 100644 scripts/libmakepkg/util.sh.in create mode 100644 scripts/libmakepkg/util/message.sh create mode 100644 scripts/libmakepkg/util/url.sh.in create mode 100644 scripts/libmakepkg/util/util.sh.in diff --git a/scripts/.gitignore b/scripts/.gitignore index 8dac503..6f2e84d 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -8,3 +8,7 @@ pkgdelta repo-add repo-elephant repo-remove + +libmakepkg/util.sh +libmakepkg/util/url.sh +libmakepkg/util/util.sh diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 8130704..4c52bd4 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -36,13 +36,22 @@ LIBRARY = \ library/size_to_human.sh \ library/term_colors.sh +LIBMAKEPKG = \ + $(LIBMAKEPKG_INC) \ + util/message.sh + +LIBMAKEPKG_INC = \ + util.sh \ + util/url.sh \ + util/util.sh + # Files that should be removed, but which Automake does not know. MOSTLYCLEANFILES = $(bin_SCRIPTS) libmakepkgdir = $(libdir)/makepkg clean-local: - $(AM_V_at)$(RM) -r .lib + $(AM_V_at)$(RM) -r .lib $(addprefix libmakepkg/,$(LIBMAKEPKG_INC)) if USE_GIT_VERSION GIT_VERSION := $(shell sh -c 'git describe --abbrev=4 --dirty | sed s/^v//') @@ -83,7 +92,20 @@ $(OURSCRIPTS): Makefile $(AM_V_at)chmod +x,a-w $@ @$(BASH_SHELL) -O extglob -n $@ +$(addprefix libmakepkg/,$(LIBMAKEPKG_INC)): Makefile + $(AM_V_at)$(RM) $@ + $(AM_V_GEN)test -f $(srcdir)/$@.in && m4 -P -I $(srcdir) $(srcdir)/$@.in | $(edit) >$@ + $(AM_V_at)chmod a-w $@ + @$(BASH_SHELL) -O extglob -n $@ + +libmakepkg: \ + $(srcdir)/libmakepkg/util.sh \ + $(srcdir)/libmakepkg/util/message.sh \ + $(srcdir)/libmakepkg/util/url.sh \ + $(srcdir)/libmakepkg/util/util.sh + makepkg: \ + libmakepkg \ $(srcdir)/makepkg.sh.in \ $(srcdir)/makepkg-wrapper.sh.in \ $(srcdir)/library/parseopts.sh @@ -131,7 +153,12 @@ makepkg-wrapper: \ $(srcdir)/makepkg-wrapper.sh.in \ $(srcdir)/makepkg.sh.in \ $(srcdir)/library/parseopts.sh \ - | makepkg + $(srcdir)/libmakepkg/util.sh \ + $(srcdir)/libmakepkg/util/message.sh \ + $(srcdir)/libmakepkg/util/url.sh \ + $(srcdir)/libmakepkg/util/util.sh \ + | libmakepkg \ + makepkg $(AM_V_at)$(MKDIR_P) .lib $(AM_V_at)mv -f makepkg .lib $(AM_V_at)$(RM) $@ @@ -146,6 +173,10 @@ install-data-hook: cd $(DESTDIR)$(bindir) && \ $(RM) makepkg makepkg-wrapper $(INSTALL) .lib/makepkg $(DESTDIR)$(bindir)/makepkg + $(AM_V_at)$(MKDIR_P) $(DESTDIR)$(libmakepkgdir)/util + for lib in $(LIBMAKEPKG); do \ + $(INSTALL) libmakepkg/$$lib $(DESTDIR)$(libmakepkgdir)/$$lib; \ + done cd $(DESTDIR)$(bindir) && \ $(RM) repo-elephant && \ ( $(LN_S) repo-add repo-elephant || \ @@ -160,5 +191,8 @@ install-data-hook: uninstall-hook: cd $(DESTDIR)$(bindir) && \ $(RM) repo-remove repo-elephant + for lib in $(LIBMAKEPKG); do \ + $(RM) -r $(DESTDIR)$(libmakepkgdir)/$$lib; \ + done # vim:set ts=2 sw=2 noet: diff --git a/scripts/libmakepkg/util.sh.in b/scripts/libmakepkg/util.sh.in new file mode 100644 index 0000000..11626bd --- /dev/null +++ b/scripts/libmakepkg/util.sh.in @@ -0,0 +1,30 @@ +#!/bin/bash +# +# util.sh +# +# Copyright (c) 2006-2013 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_SH" ] && return +LIBMAKEPKG_UTIL_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +for lib in "$LIBRARY/util/"*.sh; do + source "$lib" +done + +# vim: set ts=2 sw=2 noet: diff --git a/scripts/libmakepkg/util/message.sh b/scripts/libmakepkg/util/message.sh new file mode 100644 index 0000000..ad134fe --- /dev/null +++ b/scripts/libmakepkg/util/message.sh @@ -0,0 +1,55 @@ +#!/bin/bash +# +# message.sh +# +# Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org> +# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org> +# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com> +# Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org> +# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu> +# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk> +# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.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_MESSAGE_SH" ] && return +LIBMAKEPKG_UTIL_MESSAGE_SH=1 + +error() { + local mesg=$1; shift + printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +msg() { + local mesg=$1; shift + printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +msg2() { + local mesg=$1; shift + printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +plain() { + local mesg=$1; shift + printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +warning() { + local mesg=$1; shift + printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 +} + +# vim: set ts=2 sw=2 noet: diff --git a/scripts/libmakepkg/util/url.sh.in b/scripts/libmakepkg/util/url.sh.in new file mode 100644 index 0000000..595ce16 --- /dev/null +++ b/scripts/libmakepkg/util/url.sh.in @@ -0,0 +1,145 @@ +#!/bin/bash +# +# url.sh +# +# Copyright (c) 2006-2013 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_URL_SH" ] && return +LIBMAKEPKG_UTIL_URL_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + +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" +} + +# 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}" +} + +# a source entry can have two forms : +# 1) "filename::http://path/to/file" +# 2) "http://path/to/file" + +# 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" +} + +# 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 URL from a source entry +get_url() { + # strip an eventual filename + printf "%s\n" "${1#*::}" +} + +# vim: set ts=2 sw=2 noet: diff --git a/scripts/libmakepkg/util/util.sh.in b/scripts/libmakepkg/util/util.sh.in new file mode 100644 index 0000000..76418b0 --- /dev/null +++ b/scripts/libmakepkg/util/util.sh.in @@ -0,0 +1,58 @@ +#!/bin/bash +# +# util.sh +# +# Copyright (c) 2006-2013 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_UTIL_SH" ] && return +LIBMAKEPKG_UTIL_UTIL_SH=1 + +LIBRARY=${LIBRARY:-'@libmakepkgdir@'} + +source "$LIBRARY/util/message.sh" + +cd_safe() { + if ! cd "$1"; then + error "$(gettext "Failed to change to directory %s")" "$1" + plain "$(gettext "Aborting...")" + exit 1 + fi +} + +dir_is_empty() { + ( + shopt -s dotglob nullglob + files=("$1"/*) + (( ${#files} == 0 )) + ) +} + +## +# usage : in_array( $needle, $haystack ) +# return : 0 - found +# 1 - not found +## +in_array() { + local needle=$1; shift + local item + for item in "$@"; do + [[ $item = "$needle" ]] && return 0 # Found + done + return 1 # Not Found +} + +# vim: set ts=2 sw=2 noet: diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 5ac00a1..d1dd964 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -97,33 +97,12 @@ PACMAN_OPTS= shopt -s extglob -### SUBROUTINES ### - -plain() { - local mesg=$1; shift - printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -msg() { - local mesg=$1; shift - printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -msg2() { - local mesg=$1; shift - printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -warning() { - local mesg=$1; shift - printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} - -error() { - local mesg=$1; shift - printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2 -} +# Import libmakepkg +for lib in "$LIBRARY"/*.sh; do + source "$lib" +done +### SUBROUTINES ### ## # Special exit call for traps, Don't print any error messages when inside, @@ -198,124 +177,6 @@ enter_fakeroot() { fakeroot -- $0 -F "${ARGLIST[@]}" || exit $? } - -# a source entry can have two forms : -# 1) "filename::http://path/to/file" -# 2) "http://path/to/file" - -# 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" -} - -# 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}" -} - -# 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 -} - -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" -} - download_local() { local netfile=$1 local filepath=$(get_filepath "$netfile") @@ -966,21 +827,6 @@ in_opt_array() { return 127 } - -## -# usage : in_array( $needle, $haystack ) -# return : 0 - found -# 1 - not found -## -in_array() { - local needle=$1; shift - local item - for item in "$@"; do - [[ $item = "$needle" ]] && return 0 # Found - done - return 1 # Not Found -} - source_has_signatures() { local file for file in "${source[@]}"; do @@ -1372,14 +1218,6 @@ error_function() { exit 2 # $E_BUILD_FAILED } -cd_safe() { - if ! cd "$1"; then - error "$(gettext "Failed to change to directory %s")" "$1" - plain "$(gettext "Aborting...")" - exit 1 - fi -} - source_safe() { shopt -u extglob if ! source "$@"; then @@ -2473,14 +2311,6 @@ canonicalize_path() { fi } -dir_is_empty() { - ( - shopt -s dotglob nullglob - files=("$1"/*) - (( ${#files} == 0 )) - ) -} - m4_include(library/parseopts.sh) usage() { -- 1.8.4