#!/usr/bin/env bash # LibreStage # Prepares packages for upload # Copyright (C) 2010-2012 Nicolás Reynolds # Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) # Copyright (C) 2013-2014, 2017-2018 Luke Shumaker # # 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 . . "$(librelib messages)" . "$(librelib conf)" 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 $EXIT_NOPERMISSION fi # Parse options, set up while getopts 'h' arg; do case $arg in h) usage; return $EXIT_SUCCESS;; *) usage >&2; return $EXIT_INVALIDARGUMENT;; esac done local repo= case $# in 0) repo="$(basename "$(dirname "$PWD")")";; 1) repo=$1;; *) usage >&2; return $EXIT_INVALIDARGUMENT;; esac if ! [[ -e ./PKGBUILD ]]; then error "PKGBUILD not found" return $EXIT_FAILURE fi # Load configuration declare -i ret=0 load_conf libretools.conf WORKDIR || ret=$? load_conf makepkg.conf || ret=$? # for PKGDEST, SRCDEST, and SRCPKGDEST, which are optional load_conf librefetch.conf || ret=$? # for MIRRORS, which is optional [[ $ret = 0 ]] || exit $ret SRCPKGPOOL="$WORKDIR/staging/sources/parabola" # 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 (libre)makepkg output local CARCH _pkgname pkgnames pkgfile for CARCH in "${arch[@]}"; do # This supports both pacman < 5.1 pkgname-debug # packages and pacman >= 5.1 pkgbase-debug packages. pkgnames=("${pkgname[@]}" "${pkgname[@]/%/-debug}") in_array "$pkgbase" "${pkgname[@]}" || pkgnames+=("${pkgbase}-debug") for _pkgname in "${pkgnames[@]}"; 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 was not set when building package" fi 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 $EXIT_FAILURE fi done if pkgfile=$(find_cached_srcpackage "$pkgbase" "$(get_full_version)" "$CARCH"); then msg 'Found source package: %s' "${pkgfile##*/}" mkdir -p "$SRCPKGPOOL" if cp "$pkgfile" "$SRCPKGPOOL/${pkgfile##*/}"; then msg2 "%s staged on [%s]" "$pkgbase" sources staged=true else error "Can't put %s on [%s]" "$pkgbase" sources return $EXIT_FAILURE fi fi 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 $EXIT_FAILURE fi fi break fi done done if $staged ; then return $EXIT_SUCCESS else error "Nothing was staged" return $EXIT_FAILURE fi } main "$@"