#!/bin/bash # librefetch # # Copyright 2013 Luke Shumaker # # 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 conf.sh) . libremessages declare -r tempdir="$(mktemp -d --tmpdir ${0##*/}.XXXXXXXXXXX)" cleanup() { rm -rf -- "$tempdir"; } trap cleanup EXIT cmd=${0##*/} usage() { print "Usage: %s [options] " "$cmd" print "Usage: %s -[g|V|h]" "$cmd" print "Downloads or creates a liberated source tarball." echo print "The default build script is 'PKGBUILD', or 'SRCBUILD' if it exists." echo print "Unrecognized options are passed straight to makepkg." echo print "Example usage:" print ' $ %s libre://mypackage-1.0.tar.gz $SRCDEST/mypackage-1.0.tar.gz.part' "$cmd" echo print "Options:" print " Settings:" print " -C Force create mode (don't download)" print " -D Force download mode (don't create)" print " -p Use an alternate build script (instead of 'PKGBUILD')" print " If an SRCBUILD exists in the same directory, it is used" print " instead" print " Alternate modes:" print " -g, --geninteg Generage integrity checks for source files" print " -V, --version Show version information" print " -h, --help Show this message" } version() { print "librefetch (libretools) beta 4" echo print "Copyright (C) 2013 Luke Shumaksr " print "This is free software; see the source for copying conditions." print "There is NO WARRANTY, to the extent permitted by law." } main() { BUILDFILE="$(readlink -m PKGBUILD)" makepkg_opts=() extra_opts=() mode=download-create parse_options "$@" # Mode: version, help ################################################## if [[ $mode =~ version ]]; then version return 0 fi if [[ $mode =~ help ]]; then usage return 0 fi ######################################################################## local startdir=$PWD export BUILDDIR="${BUILDFILE%/*}" if [[ -f "${BUILDDIR}/SRCBUILD" ]]; then BUILDFILE="${BUILDDIR}/SRCBUILD" srcbuild="$(modified_srcbuild "$BUILDFILE")" else srcbuild="$(modified_pkgbuild "$BUILDFILE")" fi makepkg="$(modified_makepkg "$(which "${MAKEPKG:-makepkg}")")" # Mode: checksums ###################################################### if [[ $mode =~ checksums ]]; then if [[ ${#extra_opts[@]} != 0 ]]; then print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" usage >> /dev/stderr return 1 fi "$makepkg" "${makepkg_opts[@]}" -g -p "$srcbuild" | case ${BUILDFILE##*/} in PKGBUILD) sed -e 's/^[a-z]/mk&/' -e 's/^\s/ &/';; SRCBUILD) cat;; esac return 0 fi ######################################################################## if [[ ${#extra_opts[@]} != 2 ]]; then print "%s: %d non-flag arguments found, expected 2: %s" "$cmd" ${#extra_opts[@]} usage >> /dev/stderr return 1 fi local src="${extra_opts[0]#*://}" local dst="$(readlink -m "${extra_opts[1]}")" # Mode: download ####################################################### if [[ $mode =~ download ]]; then load_files librefetch check_vars librefetch MIRROR DOWNLOADER || return 1 local url="${MIRROR}/${src}" local dlcmd="${DOWNLOADER}" dlcmd="${dlcmd//\%o/\"$dst\"}" dlcmd="${dlcmd//\%u/\"$url\"}" { eval "$dlcmd"; } >> /dev/stderr && return 0 fi # Mode: create ######################################################### if [[ $mode =~ create ]]; then PKGEXT=${dst##*/} export PKGEXT=${PKGEXT%.part} export PKGDEST=$startdir export pkg_file=$dst cd "$BUILDDIR" "$makepkg" "${makepkg_opts[@]}" -p "$srcbuild" >> /dev/stderr || return 1 rm -- "${pkg_file##*/}" fi } # sets the variables BUILDFILE, makepkg_opts, extra_opts, mode parse_options() { # Detect makepkg options that take a second argument local makepkg_orig="$(which "${MAKEPKG:-makepkg}")" local makepkg_opt2long=($("${makepkg_orig}" -h | sed -rn 's/\s*(--\S*) <.*/\1/p')) local makepkg_opt2short=($("${makepkg_orig}" -h | sed -rn 's/\s*(-.) <.*/\1/p')) local opt local have_opt while [[ $# -gt 0 ]]; do arg=$1 have_opt=false if in_array "${arg%%=*}" "${makepkg_opt2long[@]}"; then opt="${arg#*=}" arg="${arg%%=*}" have_opt=true fi if in_array "${arg}" "${makepkg_opt2short[@]}"; then shift opt=$1 have_opt=true fi case "$arg" in -C) mode=create;; -D) mode=download;; -g|--geninteg) mode=checksums;; -p) BUILDFILE="$(readlink -m "$opt")";; -V|--version) mode=version;; -h|--help) mode=help;; -*) makepkg_opts+=("$arg") $have_opt && makepkg_opts+=("$opt") ;; --) shift; break;; *) extra_opts+=("$arg");; esac shift done extra_opts+=("$@") } # Modify makepkg ############################################################### # an ERE makepkg_modify=' /create_package\(\) \{/,/^\}$/ { /pkg_file=/d # allow us to set pkg_file /check_package/d # do not run check_package s/"?\$\{comp_files\[@\]\}"?// # do not include .{PKGINFO,INSTALL,CHANGELOG} s/bsdtar /&--format=ustar / # ustar, not pax } /tidy_install\(\) \{/,/^\}$/ { /for .*PURGE_TARGETS/itidy_install_purge /for .*PURGE_TARGETS/,/done/d /^\}$/ifind . -exec touch --date="1990-01-01 0:0:0 +0" {} + } s|srcdir=.*|srcdir="$BUILDDIR/src-libre"| s|pkgdir=.*|pkgdir="$BUILDDIR/pkg-libre"| s|check_build_status$|:| ' tidy_install_purge() { local pt for pt in "${PURGE_TARGETS[@]}"; do if [[ ${pt} = "${pt%/}" ]]; then if [[ ${pt} = "${pt//\/}" ]]; then find . ! -type d -name "${pt}" -exec rm -f -- '{}' + else rm -f "${pt}" fi else if [[ ${pt%/} = "${pt//\/}" ]]; then find . -type d -name "${pt%/}" -exec rm -rf -- '{}' + else rm -rf "${pt}" fi fi done } modified_makepkg() { local makepkg_orig=$1 local makepkg_mine="$tempdir/makepkg" { echo '#!/bin/bash' declare -f tidy_install_purge sed -r "$makepkg_modify" < "$makepkg_orig" } > "$makepkg_mine" chmod 755 "$makepkg_mine" printf "%s\n" "$makepkg_mine" } # Modify PKGBUILD ############################################################## # a string to be appended pkgbuild_append=' # do not do split packages if [[ -n $pkgbase ]]; then pkgname=$pkgbase else pkgname=$pkgname fi # copy source variables source=("${mksource[@]}") noextract=("${mknoextract[@]}") md5sums=("${mkmd5sums[@]}") sha1sums=("${mksha1sums[@]}") sha256sums=("${mksha256sums[@]}") sha384sums=("${mksha384sums[@]}") sha512sums=("${mksha512sums[@]}") depends=() checkdepends=() makedepends=("${mkdepends[@]}") #### options+=(!strip docs libtool emptydirs !zipman purge !upx) PURGE_TARGETS+=(.bzr/ .cvs/ .git/ .hg/ .svn/) #### if ! declare -f mksource >/dev/null; then mksource() { :; } fi prepare() { rm -rf "$pkgdir"; } build() { mksource; } check() { :; } package() { if [[ $(ls "$pkgdir" | wc -l) -eq 0 ]]; then # pkgdir is empty; provide good default behavior cp -a "${srcdir}"/*/ "$pkgdir/" fi } ' modified_pkgbuild() { local pkgbuild=$1 local srcbuild="$tempdir/SRCBUILD" printf '%s' "$pkgbuild_append" | cat "$pkgbuild" - > "$srcbuild" printf '%s\n' "$srcbuild" } # Modify SRCBUILD ############################################################## modified_srcbuild() { local orig=$1 local new="$tempdir/SRCBUILD" sed -e '/PKGDEST=/d' -e '/PKGEXT=/d' < "$orig" > "$new" printf '%s\n' "$new" } main "$@"