#!/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 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 . . libremessages . $(librelib conf.sh) usage() { print "Usage: %s REPO [REPO2 REPO3...]" "${0##*/}" print "Stages the package(s) build by ./PKGBUILD for upload." echo prose "The package(s) are staged for the named repositories. It is in general a bad idea to stage a package on multiple repositories, but it supported by this tool." } 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 repos=("$@") if [[ ${#repos[@]} -eq 0 ]]; then usage >&2 return 1 fi if ! [[ -e ./PKGBUILD ]]; then error "PKGBUILD not found" return 1 fi if ! xbs status; then error "There are uncommitted changes in the current directory" return 1 fi # Load configuration load_files libretools check_vars libretools WORKDIR ARCHES || 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. staged=false slock 8 "${WORKDIR}/staging.lock" \ 'Waiting for a shared lock on the staging directory' 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##*/}" canonical="" # is empty for the first iteration, set after that for repo in "${repos[@]}"; do xbs release "$repo" "$CARCH" mkdir -p "${WORKDIR}/staging/${repo}" if [[ -z $canonical ]]; then canonical="${WORKDIR}/staging/${repo}/${pkgfile##*/}" cmd=(cp "$pkgfile" "$canonical") else cmd=(ln "$canonical" "${WORKDIR}/staging/${repo}/${pkgfile##*/}") fi if "${cmd[@]}"; 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 done 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" 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 "$@"