#!/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|P|V|h]" "$cmd" print "Downloads or creates a liberated source tarball." echo print "The default mode is to create , first by trying download" print "mode, then create mode." echo print "If isn't specified, it defaults to the non-directory" print "part of , in the current directory." echo print "In download mode, the glob '*://' is stripped from the beginning of" print ", and the resulting path is attempted to be downloaded" print "from the configured mirror." echo print "In create mode, it looks at a build script, and uses that to create" print "the source tarball. is ignored, except that it is used" print "to set the default value of ." 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' "$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 " -P, --print Print the effective build script (SRCBUILD)" 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 BUILDFILEDIR="${BUILDFILE%/*}" if [[ -f "${BUILDFILEDIR}/SRCBUILD" ]]; then BUILDFILE="${BUILDFILEDIR}/SRCBUILD" srcbuild="$(modified_srcbuild "$BUILDFILE")" else srcbuild="$(modified_pkgbuild "$BUILDFILE")" fi makepkg="$(modified_makepkg "$(which makepkg)")" # Mode: checksums ###################################################### if [[ $mode =~ checksums ]]; then if [[ ${#extra_opts[@]} != 0 ]]; then print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" >> /dev/stderr 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 # Mode: print ########################################################## if [[ $mode =~ print ]]; then if [[ ${#extra_opts[@]} != 0 ]]; then print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" >> /dev/stderr usage >> /dev/stderr return 1 fi cat "$srcbuild" return 0 fi ######################################################################## local src dst case ${#extra_opts[@]} in 1) src="${extra_opts[0]#*://}" dst="$(readlink -m -- "${src##*/}")" ;; 2) src="${extra_opts[0]#*://}" dst="$(readlink -m -- "${extra_opts[1]}")" ;; *) print "%s: %d non-flag arguments found, expected 1 or 2: %s" "$cmd" ${#extra_opts[@]} >> /dev/stderr usage >> /dev/stderr return 1 esac # 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=${dst%/*} export pkg_file=$dst cd "$BUILDFILEDIR" "$makepkg" "${makepkg_opts[@]}" -p "$srcbuild" >> /dev/stderr || return $? 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|--print) mode=print;; -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 s/"?\$\{comp_files\[@\]\}"?// # do not include .{PKGINFO,INSTALL,CHANGELOG} s/bsdtar /&--format=ustar / # ustar, not pax s/create_signature .*/&; return $?/ # do not procede to create symlinks } /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=.*|&-libre| s|pkgdirbase=.*|&-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() { :; } build() { mksource; } check() { :; } package() { cp -a "$srcdir"/*/ "$pkgdir/"; } ' 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 "$@"