#!/bin/bash warn() { echo "$1" >&2 } die() { warn "fatal: $1" exit 3 } usage() { warn "usage: $0 [options] MODE" warn "" warn "Options:" warn "" warn " -b BRN build from branch BRN (default: last tag)" warn " -c COPR_PROJECT COPR project name" warn " -n dry mode, don't do anything (just show" warn " what would be done)" warn " -r REL use REL as Release number in SPEC file" warn " -v VER use VER as Version number in SPEC file" warn " -u URL use URL as base (to get last tag and" warn " compose Source0 in SPEC file)" warn "" warn "If -b is not used, build is launched from last tag available" warn "in the GitHub repo. In that case, Release is '1' and Version" warn "is deduced from the tag by removing the initial 'v'." warn "" warn "If -b is used, the project repo is temporarily cloned, and" warn "both Version and Release are found by consulting git-describe" warn "on the specified branch." warn "" warn "If MODE is 'scratch' (default), Release is pre-fixed by string" warn "'0.scratch.' and build is triggered in scratch COPR project." exit 2 } last_version() { git ls-remote --tag "$UrlBase" \ | grep '/tags/' \ | cut -d/ -f3 \ | sort -V \ | tail -1 \ | sed "s/^v//" } mkspec() { local self_version local cl_date self_version="slop-build-copr $(git describe --tags)" cl_date=$(LC_ALL=C date +"%a %b %d %Y") sed -e " s|__APP_VERSION__|$Version| s|__APP_RELEASE__|$Release| s|__APP_URLBASE__|$UrlBase| s|__APP_BUILDSCRIPT_VERSION__|$self_version| s|__APP_DATE__|$cl_date| " /dev/null \ || die "copr not found, try 'sudo install copr-cli'" Tmp=$(mktemp -d) while true; do case $1 in -b) Branch=$2; shift 2 || usage ;; -c) CoprProject=$2; shift 2 || usage ;; -u) UrlBase=$2; shift 2 || usage ;; -r) Release=$2; shift 2 || usage ;; -v) Version=${2#v}; shift 2 || usage ;; -n) DryRun=true; shift ;; -*) usage ;; *) break ;; esac done Mode=${1:-$Mode} case $Mode in main|scratch) : ;; *) usage ;; esac test -n "$CoprProject" || CoprProject=$(choose_copr) test -n "$UrlBase" || UrlBase=$(choose_urlbase) if test -n "$Branch"; then die "not implemented" test -n "$Version" || Version=$(git_guess ver) test -n "$Release" || Release=$(git_guess rel) else test -n "$Version" || Version=$(last_version) test -n "$Release" || Release=1 fi Release=$(choose_relpfx)$Release mkspec >"$Tmp/slop.spec" $DryRun && { warn "dry mode active, we would build:" warn " at $CoprProject" test -n "$Branch" && warn " using branch $Branch" test -n "$Branch" || warn " using last tag" warn " from $UrlBase" warn " yielding slop-$Version-$Release.*.rpm" warn "" warn "===== BEGIN slop.spec =====" cat "$Tmp/slop.spec" warn "===== END slop.spec =====" exit 1 } copr build "$CoprProject" "$Tmp/slop.spec" rm -rf "$Tmp" } main "$@"