diff options
Diffstat (limited to 'src/abslibre-tools/librestage')
-rwxr-xr-x | src/abslibre-tools/librestage | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/abslibre-tools/librestage b/src/abslibre-tools/librestage new file mode 100755 index 0000000..39523ac --- /dev/null +++ b/src/abslibre-tools/librestage @@ -0,0 +1,154 @@ +#!/usr/bin/env bash +# LibreStage +# Prepares packages for upload + +# Copyright (C) 2010-2012 Nicolás Reynolds <fauno@parabola.nu> +# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com> +# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net> +# +# License: GNU GPLv3+ +# +# This file is part of Parabola. +# +# Parabola 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 3 of the License, or +# (at your option) any later version. +# +# Parabola 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 Parabola. If not, see <http://www.gnu.org/licenses/>. + +. libremessages +. "$(librelib conf.sh)" + +usage() { + print "Usage: %s [REPO]" "${0##*/}" + print "Stages the package(s) build by ./PKGBUILD for upload." + echo + prose "The package(s) are staged for the named repository, or the name + of the parent directory if a repository is not named." +} + +main() { + if [[ -w / ]]; then + error "This program should be run as a regular user" + return 1 + fi + + # Parse options, set up + while getopts 'h' arg; do + case $arg in + h) usage; return 0;; + *) usage >&2; return 1;; + esac + done + local repo= + case $# in + 0) repo="$(basename "$(dirname "$PWD")")";; + 1) repo=$1;; + *) usage >&2; return 1;; + esac + + if ! [[ -e ./PKGBUILD ]]; then + error "PKGBUILD not found" + return 1 + fi + + if ! xbs -b abslibre status; then + error "There are uncommitted changes in the current directory" + return 1 + fi + + # Load configuration + load_files libretools + # ABSLIBREDEST is used by xbs release-client + check_vars libretools WORKDIR ARCHES ABSLIBREDEST || return 1 + load_files makepkg # for PKGDEST and SRCDEST, which are optional + load_files librefetch # for MIRRORS, which is optional + + # Load the PKGBUILD + load_PKGBUILD + + # Now for the main routine. + local staged=false + slock 8 "${WORKDIR}/staging.lock" \ + 'Waiting for a shared lock on the staging directory' + + # Look for makepkg output + local CARCH _pkgname pkgfile + for CARCH in "${ARCHES[@]}" any; do + for _pkgname in "${pkgname[@]}" "${pkgname[@]/%/-debug}"; do + if ! pkgfile=$(find_cached_package "$_pkgname" "$(get_full_version "$_pkgname")" "$CARCH"); then + continue + fi + + msg 'Found package: %s' "${pkgfile##*/}" + + # This little check is from devtools:commitpkg + if grep -q "packager = Unknown Packager" <(bsdtar -xOqf "$pkgfile" .PKGINFO); then + die "PACKAGER wes not set when building package" + fi + + xbs -b abslibre release-client "$repo" "$CARCH" + mkdir -p "${WORKDIR}/staging/${repo}" + if cp "$pkgfile" "${WORKDIR}/staging/${repo}/${pkgfile##*/}"; then + msg2 "%s staged on [%s]" "$_pkgname" "$repo" + staged=true + else + error "Can't put %s on [%s]" "$_pkgname" "$repo" + return 1 + fi + done + done + + # Look for librefetch output + local netfile mirror path + local srcurl srcname srcpath + for netfile in "${source[@]}"; do + for mirror in "${MIRRORS[@]}"; do + srcurl=${netfile#*::} + if [[ "$srcurl" == "$mirror"* ]]; then + if [[ $netfile = *::* ]]; then + srcname=${netfile%%::*} + else + srcname=${netfile##*/} + fi + + srcpath='' + for path in "./$srcname" "${SRCDEST:-.}/$srcname"; do + if [[ -f "$path" ]]; then + srcpath="$path" + break + fi + done + if [[ -n "$srcpath" ]]; then + msg "Found generated source file: %s" "$srcname" + local dest="${WORKDIR}/staging/other/${srcurl##"$mirror"}" + mkdir -p -- "${dest%/*}" + if cp "$srcpath" "$dest"; then + msg2 "%s staged on [%s]" "$srcname" other + staged=true + else + error "Can't put %s on [%s]" "$srcname" other + return 1 + fi + fi + break + fi + done + done + + if $staged ; then + return 0 + else + error "Nothing was staged" + return 1 + fi +} + +main "$@" |