summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/abslibre-tools/createworkdir20
-rwxr-xr-xsrc/abslibre-tools/diff-unfree14
-rwxr-xr-xsrc/abslibre-tools/libreaddiff10
-rwxr-xr-xsrc/abslibre-tools/librerelease77
-rwxr-xr-xsrc/abslibre-tools/librestage52
-rwxr-xr-xsrc/aur10
-rw-r--r--src/chroot-tools/.gitignore3
-rw-r--r--src/chroot-tools/Makefile29
-rw-r--r--src/chroot-tools/arch-nspawn.patch19
-rwxr-xr-xsrc/chroot-tools/chcleanup31
-rwxr-xr-xsrc/chroot-tools/distcc-tool18
-rw-r--r--src/chroot-tools/hooks-chcleanup.sh17
-rw-r--r--src/chroot-tools/hooks-check.sh17
-rw-r--r--src/chroot-tools/hooks-distcc.sh19
-rwxr-xr-xsrc/chroot-tools/indent23
-rwxr-xr-xsrc/chroot-tools/librechroot63
-rwxr-xr-xsrc/chroot-tools/libremakepkg101
-rw-r--r--src/chroot-tools/makechrootpkg.sh.patch143
-rw-r--r--src/chroot-tools/mkarchroot.patch30
-rwxr-xr-xsrc/dagpkg222
-rw-r--r--src/devtools/.gitignore1
-rw-r--r--src/devtools/checkpkg.patch45
-rw-r--r--src/devtools/find-libdeps.patch47
-rw-r--r--src/devtools/finddeps.patch35
-rw-r--r--src/devtools/lddd.patch29
-rwxr-xr-xsrc/fullpkg/fullpkg21
-rwxr-xr-xsrc/fullpkg/fullpkg-build19
-rwxr-xr-xsrc/fullpkg/fullpkg-find68
-rwxr-xr-xsrc/gitget/gitget11
-rwxr-xr-xsrc/gitget/libregit13
-rwxr-xr-xsrc/is_built20
-rw-r--r--src/lib/Makefile10
-rw-r--r--src/lib/common.sh.top19
-rw-r--r--src/lib/conf.sh14
-rwxr-xr-xsrc/lib/libreblacklist16
-rwxr-xr-xsrc/lib/librelib33
-rwxr-xr-xsrc/lib/libremessages81
-rw-r--r--src/lib/libremessages.1.ronn34
-rwxr-xr-xsrc/librefetch/librefetch191
-rw-r--r--src/librefetch/librefetch.8.ronn122
-rw-r--r--src/librefetch/librefetch.conf5
-rw-r--r--src/librefetch/librefetch.conf.5.ronn16
-rw-r--r--src/libretools.conf17
-rwxr-xr-xsrc/mips64el-tools/add-mips64el17
-rwxr-xr-xsrc/mips64el-tools/librebasebuilder5
-rwxr-xr-xsrc/mips64el-tools/mips-add17
-rwxr-xr-xsrc/mips64el-tools/mipsrelease23
-rwxr-xr-xsrc/pkgbuild-check-nonfree11
-rwxr-xr-xsrc/pkgbuild-summarize-nonfree18
-rwxr-xr-xsrc/repo-diff75
-rwxr-xr-xsrc/toru/toru21
-rwxr-xr-xsrc/toru/toru-info18
-rwxr-xr-xsrc/toru/toru-path18
-rwxr-xr-xsrc/toru/toru-utils18
-rwxr-xr-xsrc/toru/toru-where18
-rwxr-xr-xsrc/treepkg29
56 files changed, 1573 insertions, 500 deletions
diff --git a/src/abslibre-tools/createworkdir b/src/abslibre-tools/createworkdir
index 4421ae2..8e5ebcd 100755
--- a/src/abslibre-tools/createworkdir
+++ b/src/abslibre-tools/createworkdir
@@ -1,28 +1,30 @@
#!/usr/bin/env bash
-set -euE
# CreateWorkDir
# Creates a dir structure for working with Parabola packages
-# Copyright 2010 Nicolás Reynolds
-# Copyright 2013 Luke Shumaker
-
-# ---------- GNU General Public License 3 ----------
-
+# Copyright (C) 2010-2011 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# 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 <http://www.gnu.org/licenses/>.
+set -euE
+
. libremessages
. $(librelib conf.sh)
load_files libretools
diff --git a/src/abslibre-tools/diff-unfree b/src/abslibre-tools/diff-unfree
index 1ef0649..fc32e77 100755
--- a/src/abslibre-tools/diff-unfree
+++ b/src/abslibre-tools/diff-unfree
@@ -1,22 +1,24 @@
#!/usr/bin/env bash
# This script will help you diff a *-libre PKGBUILD against the unfree one
# to check for updates.
-# Copyright 2010 Nicolás Reynolds
-
-# ---------- GNU General Public License 3 ----------
+# Copyright (C) 2010-2011 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+#
+# 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 <http://www.gnu.org/licenses/>.
diff --git a/src/abslibre-tools/libreaddiff b/src/abslibre-tools/libreaddiff
index ebd749d..3f8f8f4 100755
--- a/src/abslibre-tools/libreaddiff
+++ b/src/abslibre-tools/libreaddiff
@@ -1,7 +1,10 @@
#!/usr/bin/env bash
-set -e
# -*- coding: utf-8 -*-
-# Copyright (C) 2011, 2012 Michał Masłowski <mtjm@mtjm.eu>
+
+# Copyright (C) 2011-2012 Michał Masłowski <mtjm@mtjm.eu>
+# Copyright (C) 2012 Daniel Molina (lluvia)
+#
+# License: GNU GPLv3+
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,6 +19,9 @@ set -e
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+set -e
+
+. libremessages
. $(librelib conf.sh)
load_files libretools
check_vars libretools WORKDIR
diff --git a/src/abslibre-tools/librerelease b/src/abslibre-tools/librerelease
index b77b6ec..03a57e0 100755
--- a/src/abslibre-tools/librerelease
+++ b/src/abslibre-tools/librerelease
@@ -2,23 +2,21 @@
# Librerelease
# Uploads packages into [staging]
-# Copyright 2010 Nicolás Reynolds
-# Copyright 2013 Luke Shumaker
+# Copyright (C) 2010-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2010-2013 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2013 Michał Masłowski <mtjm@mtjm.eu>
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
# For just the create_signature() function:
-# Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org>
-# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
-# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
-# Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
-# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
-# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk>
-# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org>
-# Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org>
-# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
-# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
-# Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
-# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
-# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk>
-# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org>
+# Copyright (C) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org>
+# Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>
+# Copyright (C) 2005 Aurelien Foret <orelien@chez.com>
+# Copyright (C) 2006 Miklos Vajna <vmiklos@frugalware.org>
+# Copyright (C) 2005 Christian Hamar <krics@linuxforum.hu>
+# Copyright (C) 2006 Alex Smith <alex@alex-smith.me.uk>
+# Copyright (C) 2006 Andras Voroskoi <voroskoi@frugalware.org>
+#
+# License: GNU GPLv3+
#
# This file is part of Parabola.
#
@@ -35,6 +33,9 @@
# You should have received a copy of the GNU General Public License
# along with Parabola. If not, see <http://www.gnu.org/licenses/>.
+# create_signature() is taken from pacman:makepkg, which is GPLv2+,
+# so we take the '+' to combine it with our GPLv3+.
+
. libremessages
. $(librelib conf.sh)
@@ -54,7 +55,8 @@ readonly rsync_flags=(
# Functions ####################################################################
list0_files() {
- find -L "${WORKDIR}/staging" -type f -print0 | xargs -0 realpath -z --relative-to="${WORKDIR}/staging"
+ find -L "${WORKDIR}/staging" -type f \
+ -exec realpath -z --relative-to="${WORKDIR}/staging" {} +
}
# This function is taken almost verbatim from makepkg
@@ -84,30 +86,23 @@ sign_packages() {
warning "It's better to have \`%s\` running to sign packages in batches" 'gpg-agent --daemon'
fi
- for package in $(find "${WORKDIR}/staging/" -type f -iname '*.pkg.tar.?z'); do
- if [[ -f "${package}.sig" ]]; then
- msg2 "Package signature found, verifying..."
+ for file in $(find "${WORKDIR}/staging/" -type f -not -iname '*.sig'); do
+ if [[ -f "${file}.sig" ]]; then
+ msg2 "File signature found, verifying..."
# Verify that the signature is correct, else remove for re-signing
- if ! gpg --quiet --verify "${package}.sig" >/dev/null 2>&1; then
+ if ! gpg --quiet --verify "${file}.sig" >/dev/null 2>&1; then
error "Failed! Re-signing..."
- rm -f "${package}.sig"
+ rm -f "${file}.sig"
fi
fi
- if ! [[ -f "${package}.sig" ]]; then
- create_signature "$package" || return 2
+ if ! [[ -f "${file}.sig" ]]; then
+ create_signature "$file" || return 2
fi
done
}
-# Remove everything that's not a package or a signature
-clean_non_packages() {
- find $WORKDIR/staging/ -type f \
- \! -iname "*.pkg.tar.?z" -a \! -iname "*.pkg.tar.?z.sig" \
- -delete
-}
-
# Clean everything if not on dry-run mode
clean_files() {
local file_list=$1
@@ -118,7 +113,9 @@ clean_files() {
fi
msg "Removing files from local staging directory"
- cd "${WORKDIR}/staging" && xargs -0 -a "$file_list" "${rmcmd[@]}"
+ cd "${WORKDIR}/staging" && xargs -0r -a "$file_list" "${rmcmd[@]}"
+ cd "${WORKDIR}/staging" && find . -mindepth 1 -type d -empty \
+ -exec rmdir -p {} + 2>/dev/null
}
################################################################################
@@ -153,12 +150,12 @@ main() {
u) upload_only=true ;;
n) dryrun="--dry-run" ;;
h) mode=usage ;;
- *) usage >/dev/stderr; return 1 ;;
+ *) usage >&2; return 1 ;;
esac
done
shift $(($OPTIND - 1))
if [[ $# != 0 ]]; then
- usage >/dev/stderr
+ usage >&2
return 1
fi
@@ -181,10 +178,11 @@ main() {
# The different modes (sans 'usage') ###########################################
pretty_print_packages() {
- find "$WORKDIR/staging/" -mindepth 1 -type d -not -empty -printf '%f\n' | sort |
- while read -r repo; do
- msg2 "$repo"
- find -L "${WORKDIR}/staging/${repo}" -type f -printf "%f\n" | sort
+ find "$WORKDIR/staging/" -mindepth 1 -maxdepth 1 -type d -not -empty | sort |
+ while read -r path; do
+ msg2 "${path##*/}"
+ cd "$path"
+ find -L . -type f | sed 's|^\./| |' | sort
done
}
@@ -211,7 +209,6 @@ release_packages() {
lock 10 "${WORKDIR}/staging.lock" \
'Waiting for an exclusive lock on the staging directory'
- clean_non_packages
sign_packages || return 1
# Make the permissions of the packages 644 otherwise the user will get access
@@ -228,7 +225,7 @@ release_packages() {
msg "%s to upload" "$(cd "${WORKDIR}/staging" && du -hc --files0-from="$file_list" | sed -n '$s/\t.*//p')"
msg "Uploading packages..."
- xargs -0 -a "$file_list" dirname -z | ssh ${REPODEST%%:*} "$(printf 'mkdir -p -- %q && cd %q && xargs -0 mkdir -pv --' "${REPODEST#*:}" "${REPODEST#*:}")"
+ xargs -0r -a "$file_list" dirname -z | ssh ${REPODEST%%:*} "$(printf 'mkdir -p -- %q && cd %q && xargs -0r mkdir -pv --' "${REPODEST#*:}" "${REPODEST#*:}")"
if ! rsync ${dryrun} "${rsync_flags[@]}" \
-0 --files-from="$file_list" \
${WORKDIR}/staging \
diff --git a/src/abslibre-tools/librestage b/src/abslibre-tools/librestage
index 6bbe80e..1e208c9 100755
--- a/src/abslibre-tools/librestage
+++ b/src/abslibre-tools/librestage
@@ -2,8 +2,11 @@
# LibreStage
# Prepares packages for upload
-# Copyright 2010-2011 Nicolás Reynolds
-# Copyright 2013 Luke Shumaker
+# Copyright (C) 2010-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This file is part of Parabola.
#
@@ -42,12 +45,12 @@ main() {
while getopts 'h' arg; do
case $arg in
h) usage; return 0;;
- *) usage >/dev/stderr; return 1;;
+ *) usage >&2; return 1;;
esac
done
repos=("$@")
if [[ ${#repos[@]} -eq 0 ]]; then
- usage >>/dev/stderr
+ usage >&2
return 1;
fi
@@ -59,7 +62,8 @@ main() {
# Load configuration
load_files libretools
check_vars libretools WORKDIR ARCHES || return 1
- load_files makepkg # for PKGDEST, which is optional
+ load_files makepkg # for PKGDEST and SRCDEST, which are optional
+ load_files librefetch # for MIRRORS, which is optional
# Load the PKGBUILD
load_PKGBUILD
@@ -79,7 +83,7 @@ main() {
pkgpath="$(readlink -f "$pkgpath")"
fi
- msg 'Found %s' "${pkgfile}"
+ msg 'Found package: %s' "${pkgfile}"
canonical="" # is empty for the first iteration, set after that
for repo in "${repos[@]}"; do
@@ -101,10 +105,44 @@ main() {
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 "No package was staged"
+ error "Nothing was staged"
return 1
fi
}
diff --git a/src/aur b/src/aur
index 2d1efbb..4057b6e 100755
--- a/src/aur
+++ b/src/aur
@@ -1,7 +1,9 @@
#!/usr/bin/env bash
-# Copyright 2010 Joshua Ismael
-# Copyright 2010 Nicolás Reynolds
-# Copyright 2013 Luke Shumaker
+# Copyright (C) 2010-2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2010-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This file is part of Parabola.
#
@@ -9,7 +11,7 @@
# 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
diff --git a/src/chroot-tools/.gitignore b/src/chroot-tools/.gitignore
index 80e1000..3f46ed2 100644
--- a/src/chroot-tools/.gitignore
+++ b/src/chroot-tools/.gitignore
@@ -1,5 +1,4 @@
makechrootpkg.sh*
-!makechrootpkg.sh.patch
-
arch-nspawn*
mkarchroot*
+!*.patch
diff --git a/src/chroot-tools/Makefile b/src/chroot-tools/Makefile
index d08775e..e44ad5f 100644
--- a/src/chroot-tools/Makefile
+++ b/src/chroot-tools/Makefile
@@ -9,37 +9,10 @@ libs = makechrootpkg.sh $(wildcard hooks-*.sh)
pots = $(libexecs) $(libs)
pkglibexecdir = $(libexecdir)/libretools/chroot
-clean_files = makechrootpkg.sh.ugly* *~
include ../../common.mk
-# Usage: $(call indent,FILENAME)
-# Command to auto-indent a file.
-indent = emacs --batch $1 \
- --eval '(setq sh-basic-offset 8)' \
- --eval '(indent-region (point-min) (point-max) nil)' \
- -f save-buffer &>/dev/null
-
-# makechrootpkg.sh is special, we patch it and do fancy stuff
-# The flow is:
-# $(devtoolsdir)/*.in -> *.sh.in + *.sh.patch -> *.sh.ugly -> *.sh
-
+# makechrootpkg.sh is created from a command, not a library
makechrootpkg.sh.in: %.sh.in: $(devtoolsdir)/%.in
cp $< $@
-makechrootpkg.sh.ugly: %.ugly: %.in %.patch Makefile
- cp $*.in $@
- @echo 'PATCH $@ $*.patch'; patch $@ $*.patch || { rm -f -- '$@'; false; }
-makechrootpkg.sh: %: %.ugly Makefile
- @echo 'EDIT < $< > $@'; $(edit) <'$<' >'$@' || { rm -f -- '$@'; false; }
- @echo 'INDENT $@'; $(call indent,$@) || { rm -f -- '$@'; false; }
-
-mkarchroot: mkarchroot.in Makefile
- @echo '< $< M4_EDIT | SED > $@'
- @<'$<' $(edit) | sed 's|arch-nspawn|$$(librelib chroot/&)|' >'$@' || { rm -f -- '$@'; false; }
- @echo 'CHMOD $<'; chmod 755 "$@" || { rm -f -- '$@'; false; }
-
-archroot: %: %.in Makefile
- @echo "GEN $@"
- @$(edit) <"$<" >"$@" || { rm -f -- '$@'; false; }
- @chmod 755 "$@" || { rm -f -- '$@'; false; }
distcc-tool.pot: xgettext-keywords-sh+=--keyword=errusage
diff --git a/src/chroot-tools/arch-nspawn.patch b/src/chroot-tools/arch-nspawn.patch
new file mode 100644
index 0000000..5e0f10b
--- /dev/null
+++ b/src/chroot-tools/arch-nspawn.patch
@@ -0,0 +1,19 @@
+--- arch-nspawn.in 2014-05-11 00:58:42.030932904 -0400
++++ arch-nspawn.ugly 2014-05-11 22:33:47.186717386 -0400
+@@ -1,4 +1,6 @@
+ #!/bin/bash
++# License: GNU GPLv2
++#
+ # This program 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; version 2 of the License.
+@@ -103,7 +105,8 @@
+ machine_name="${machine_name#-}"
+ fi
+
+-exec ${CARCH:+setarch "$CARCH"} systemd-nspawn -q \
++CHROOTARCH="$(. $(librelib conf); get_var chroot CHROOTARCH "$CARCH")"
++exec ${CHROOTARCH:+setarch "$CHROOTARCH"} systemd-nspawn -q \
+ -D "$working_dir" \
+ --machine "$machine_name" \
+ "${mount_args[@]}" \
diff --git a/src/chroot-tools/chcleanup b/src/chroot-tools/chcleanup
index 2ff45f9..bfb65ce 100755
--- a/src/chroot-tools/chcleanup
+++ b/src/chroot-tools/chcleanup
@@ -1,13 +1,29 @@
#!/usr/bin/env bash
-set -eE
-# (c) Nicolás Reynolds <fauno@parabola.nu>
-# Released under GPLv3
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
# Performs chroot cleanup smartly, it only removes the unneeded packages or
# leaves you with a cleansystem
#
# See: HOOKPREBUILD
+set -eE
+
DRYRUN=${DRYRUN:-false}
################################################################################
@@ -34,11 +50,6 @@ msg2() {
printf "${BLUE} ->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
-warning() {
- local mesg="$(_ "$1")"; shift
- printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
-}
-
error() {
local mesg="$(_ "$1")"; shift
printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
@@ -67,8 +78,8 @@ msg "Cleaning chroot..."
cp /repo/repo.db /var/lib/pacman/sync/repo.db
# Setup the temporary directory
-TEMPDIR="$(mktemp --tmpdir -d $(basename $0).XXXXX)"
-trap "rm -rf '$TEMPDIR'" EXIT
+TEMPDIR="$(mktemp --tmpdir -d ${0##*/}.XXXXXXXXXX)"
+trap "rm -rf -- $(printf '%q' "$TEMPDIR")" EXIT
cp -a /var/lib/pacman/sync "${TEMPDIR}/"
pkglist="${TEMPDIR}"/pkglist.txt
diff --git a/src/chroot-tools/distcc-tool b/src/chroot-tools/distcc-tool
index 7633029..f2e43dd 100755
--- a/src/chroot-tools/distcc-tool
+++ b/src/chroot-tools/distcc-tool
@@ -2,7 +2,9 @@
# -*- tab-width: 4; sh-basic-offset: 4 -*-
# distcc-tool
-# Copyright 2013 Luke Shumaker
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This file is part of Parabola.
#
@@ -32,6 +34,8 @@ if ! type gettext &>/dev/null; then
gettext() { echo "$@"; }
fi
+q0="$(printf '%q' "$0")" # quoted $0
+
panic() {
echo "$(gettext 'panic: malformed call to internal function')" >&2
exit 1
@@ -50,7 +54,7 @@ print() {
}
usage() {
- print "Usage: $0 COMMAND [COMMAND-ARGS]"
+ print "Usage: %s COMMAND [COMMAND-ARGS]" "$q0"
print "Tool for using distcc within a networkless chroot"
echo
print "Commands:"
@@ -125,7 +129,7 @@ parse_DISTCC_HOSTS() {
*@*)
# SSH_HOST doesn't allow custom port numbers, and even if it
# did, ssh would complain about MITM. Instead, we'll count on
- # ssh ProxyCommand being configured to used `client`.
+ # ssh ProxyCommand being configured to use `client`.
newhosts+=("$HOSTSPEC")
;;
# GLOBAL_OPTION
@@ -135,7 +139,7 @@ parse_DISTCC_HOSTS() {
;;
# ZEROCONF
+zeroconf)
- error "%s does not support the +zeroconf option" "$0"
+ error "%s does not support the +zeroconf option" "$q0"
exit 1
;;
# TCP_HOST or OLDSTYLE_TCP_HOST
@@ -159,7 +163,7 @@ parse_DISTCC_HOSTS() {
# set up port forwaring
if $forward_ports; then
- socat TCP-LISTEN:${newport},fork SYSTEM:"$0 client $HOSTID ${PORT:-3632}" &
+ socat TCP-LISTEN:${newport},fork SYSTEM:"$q0 client $HOSTID ${PORT:-3632}" &
pids+=($!)
fi
@@ -222,8 +226,8 @@ odaemon() {
local chrootpath=$1
umask 111
- socat UNIX-LISTEN:"$chrootpath/socket",fork SYSTEM:"$0 server" &
- trap "kill -- $!; rm -f '$chrootpath/socket'" EXIT
+ socat UNIX-LISTEN:"$chrootpath/socket",fork SYSTEM:"$q0 server" &
+ trap "kill -- $!; rm -f -- $(printf '%q' "$chrootpath/socket")" EXIT
wait
}
diff --git a/src/chroot-tools/hooks-chcleanup.sh b/src/chroot-tools/hooks-chcleanup.sh
index 86c872c..0fd0f72 100644
--- a/src/chroot-tools/hooks-chcleanup.sh
+++ b/src/chroot-tools/hooks-chcleanup.sh
@@ -1,4 +1,21 @@
#!/usr/bin/env bash
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
set -euE
hook_pre_build+=("clean_chroot")
diff --git a/src/chroot-tools/hooks-check.sh b/src/chroot-tools/hooks-check.sh
index 2702f95..850516b 100644
--- a/src/chroot-tools/hooks-check.sh
+++ b/src/chroot-tools/hooks-check.sh
@@ -1,4 +1,21 @@
#!/usr/bin/env bash
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
set -euE
hook_check_pkgbuild+=("check_pkgbuild_nonfree")
diff --git a/src/chroot-tools/hooks-distcc.sh b/src/chroot-tools/hooks-distcc.sh
index d8d708a..37c82dc 100644
--- a/src/chroot-tools/hooks-distcc.sh
+++ b/src/chroot-tools/hooks-distcc.sh
@@ -1,4 +1,23 @@
#!/usr/bin/env bash
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
+#
+# 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 2 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 <http://www.gnu.org/licenses/>.
+
set -euE
hook_pre_build+=("distcc_start")
diff --git a/src/chroot-tools/indent b/src/chroot-tools/indent
index 0e2d0e0..ffec4d5 100755
--- a/src/chroot-tools/indent
+++ b/src/chroot-tools/indent
@@ -1,4 +1,23 @@
#!/usr/bin/env perl
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
use warnings;
use strict;
use constant BUFFER_SIZE => 40;
@@ -19,9 +38,7 @@ while (1) {
$c = substr($buffer, $_, 1);
if ($c eq "\n") {
syswrite(STDOUT, $indent) if ($print_indent);
- # XXX: SYSTEMD-STDOUT HACK
- #syswrite(STDOUT, $c, 1);
- syswrite(STDOUT, "\r\n", 2);
+ syswrite(STDOUT, $c, 1);
$print_indent = 1;
} elsif ($c eq "\r") {
syswrite(STDOUT, $c, 1);
diff --git a/src/chroot-tools/librechroot b/src/chroot-tools/librechroot
index 5e16587..4edcb2f 100755
--- a/src/chroot-tools/librechroot
+++ b/src/chroot-tools/librechroot
@@ -2,15 +2,18 @@
set -euE
# librechroot
-# Copyright 2010 Nicolás Reynolds
-# Copyright 2011 Joshua Haase
-# Copyright 2012-2013 Luke Shumaker
+# Copyright (C) 2010-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+# Copyright (C) 2012-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
#
# 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
+# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Parabola is distributed in the hope that it will be useful,
@@ -96,9 +99,9 @@ usage() {
printf ' rootdir : %s\n' "${rootdir:-$(_ 'ERROR')}"
printf ' copydir : %s\n' "${copydir:-$(_ 'ERROR')}"
echo
- prose 'If the chroot, or copy does not exist, it will be created
+ prose 'If the chroot or copy does not exist, it will be created
automatically. A chroot by default contains the packages in the
- group "base-devel", and any packages named in $CHROOTEXTRAPKG.
+ group "base-devel" and any packages named in $CHROOTEXTRAPKG.
Unless the `-C` or `-M` flags are used, the configuration files
that this program installs are the stock versions supplied in the
packages, not the versions from your host system. Other tools
@@ -151,7 +154,7 @@ readonly commands=(
run enter clean-repo help
)
-# set $rootdir and $copydir; blank them on error
+# Print code to set $rootdir and $copydir; blank them on error
calculate_directories() {
# Don't assume that CHROOTDIR or CHROOT are set,
# but assume that COPY is set.
@@ -186,23 +189,7 @@ arch_nspawn_flags=()
sysd_nspawn_flags=()
arch-nspawn() {
local copydir=$1; shift
- # XXX: SYSTEMD-STDOUT HACK
- if [[ -t 1 ]]; then
- cmd=("$@")
- else
- # This perl script is similar to `sed 's|\n|\r\n|g'`, (or, more
- # correctly, `sed 's|$|\r|'`) but it does't line-buffer.
- local perlcmd='
-my $size;
-my $buffer;
-while(1) {
- $size=sysread(STDIN, $buffer, 40);
- last if ($size < 1);
- $buffer =~ s/\n/\r\n/g;
- syswrite(STDOUT, $buffer);
-}'
- cmd=(bash --noprofile --norc -c "set -o pipefail; $(printf '%q ' "$@") |& perl -e $(printf '%q' "$perlcmd")")
- fi
+ local cmd=("$@")
set +u # if an array is empty, it counts as unbound
"$_arch_nspawn" "${arch_nspawn_flags[@]}" "$copydir" "${sysd_nspawn_flags[@]}" -- "${cmd[@]}"
@@ -223,19 +210,19 @@ main() {
C|M) arch_nspawn_flags+=(-$opt "$OPTARG");;
w) sysd_nspawn_flags+=("--bind=$OPTARG");;
r) sysd_nspawn_flags+=("--bind-ro=$OPTARG");;
- *) usage >/dev/stderr; return 1;;
+ *) usage >&2; return 1;;
esac
done
shift $(($OPTIND - 1))
if [[ $# -lt 1 ]]; then
error "Must specify a command"
- usage >/dev/stderr
+ usage >&2
return 1
fi
mode=$1
if ! in_array "$mode" "${commands[@]}"; then
error "Unrecognized command: %s" "$mode"
- usage >/dev/stderr
+ usage >&2
return 1
fi
shift
@@ -243,14 +230,14 @@ main() {
noop|make|sync|delete|update|enter|clean-pkgs|clean-repo)
if [[ $# -gt 0 ]]; then
error 'Command `%s` does not take any arguments: %s' "$mode" "$*"
- usage >/dev/stderr
+ usage >&2
return 1
fi
:;;
install-file)
if [[ $# -lt 1 ]]; then
error 'Command `%s` requires at least one file' "$mode"
- usage >/dev/stderr
+ usage >&2
return 1
else
local missing=()
@@ -269,14 +256,14 @@ main() {
install-name)
if [[ $# -lt 1 ]]; then
error 'Command `%s` requires at least one package name' "$mode"
- usage >/dev/stderr
+ usage >&2
return 1
fi
:;;
run)
if [[ $# -lt 1 ]]; then
error 'Command `%s` requires at least one argument' "$mode"
- usage >/dev/stderr
+ usage >&2
return 1
fi
:;;
@@ -342,11 +329,15 @@ main() {
mkdir -p "$copydir/etc/libretools.d"
{
- if [[ -n ${CHROOTEXTRAPKG[*]:-} ]]; then
- declare -p CHROOTEXTRAPKG | sed -r 's/declare( -.)* //'
+ if [[ ${#CHROOTEXTRAPKG[*]} -eq 0 ]]; then
+ echo 'CHROOTEXTRAPKG=()'
else
- printf 'CHROOTEXTRAPKG=()\n'
+ printf 'CHROOTEXTRAPKG=('
+ printf '%q ' "${CHROOTEXTRAPKG[@]}"
+ printf ')\n'
fi
+ # TODO: only set CHROOTARCH if $CARCH != $(uname -m)
+ printf 'CHROOTARCH=%q\n' "$(uname -m)"
} > "$copydir"/etc/libretools.d/chroot.conf
if [[ $mode != delete ]]; then
@@ -379,10 +370,10 @@ main() {
arch-nspawn "$copydir" pacman -Sy "$@"
;;
update)
- arch-nspawn "$copydir" pacman -Syu --noconfirm
+ arch-nspawn "$copydir" bash -c 'pacman -Syu --noconfirm'
;;
clean-pkgs)
- trap "rm -f '$copydir'/bin/chcleanup '$copydir'/chrootexec" EXIT
+ trap "rm -f -- $(printf '%q ' "$copydir"/{bin/chcleanup,chrootexec})" EXIT
install -m755 "$(librelib chroot/chcleanup)" "$copydir/bin/chcleanup"
printf '%s\n' \
'#!/bin/bash' \
diff --git a/src/chroot-tools/libremakepkg b/src/chroot-tools/libremakepkg
index fc6418c..aad4217 100755
--- a/src/chroot-tools/libremakepkg
+++ b/src/chroot-tools/libremakepkg
@@ -2,15 +2,18 @@
set -euE
# libremakepkg
-# Copyright 2010-2011 Nicolás Reynolds
-# Copyright 2011 Joshua Ismael Haase Hernández
-# Copyright 2012-2013 Luke Shumaker
+# Copyright (C) 2010-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2010-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+# Copyright (C) 2012-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
#
# 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
+# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# Parabola is distributed in the hope that it will be useful,
@@ -33,7 +36,7 @@ umask 0022
readonly _indent="$(librelib chroot/indent)"
readonly INCHROOT=$([[ -f /.arch-chroot ]] && echo true || echo false)
NONET=true # can be changed with the -N flag
-# {SRC,LOG,PKG}DEST set at runtime by makepkg.conf
+# {PKG,SRC,SRCPKG,LOG}DEST set at runtime by makepkg.conf
# MAKEFLAGS, PACKAGER set at runtime by makepkg.conf
# LIBREUSER, LIBREHOME are set by conf.sh
librechroot_flags=()
@@ -54,6 +57,21 @@ indent() {
"$_indent" ' | '
}
+# Usage: _check_perms_dir $directory
+# Make sure that $directory is readable and executable (searchable) by 'nobody'
+check_directory_permissions() (
+ local dir=$1
+ # `cd` to the directory, then test `.`; that way if parent
+ # directories aren't readable, we aren't testing for that. We
+ # only need the last element in `$dir`.
+ cd "$dir"
+ if ! sudo -u nobody test -r . -a -x .; then
+ error "Directory '%s' must be readable by user 'nobody'" "$dir"
+ return 1
+ fi
+ return 0
+)
+
# Usage: exit_copy $copydir $src_owner
# End immediately, but copy log files out
exit_copy() {
@@ -106,21 +124,22 @@ build() (
local copydir=$1; shift
local repack=$1; shift
- local netflag=''
- local run=()
+ local run_ynet=()
+ local run_nnet=()
if $INCHROOT; then
- ! $NONET || netflag='-N'
- run=(unshare)
+ run_ynet=(unshare)
+ run_nnet=(unshare -n)
else
- ! $NONET || netflag='-n'
- run=(librechroot "${librechroot_flags[@]}" run)
+ run_ynet=(librechroot "${librechroot_flags[@]}" run)
+ run_nnet=(librechroot "${librechroot_flags[@]}" -N run)
fi
+ $NONET || run_nnet=("${run_ynet[@]}")
prepare_chroot "$copydir" "$LIBREHOME" "$repack" false
- "${run[@]}" /chrootprepare "$@" |& indent
+ "${run_ynet[@]}" /chrootprepare false "$@" |& indent
run_hook pre_build "$copydir"
trap "run_hook post_build '$copydir'" EXIT
- "${run[@]}" /chrootbuild "$@" |& indent
+ "${run_nnet[@]}" /chrootbuild false "$@" |& indent
)
# The main program #############################################################
@@ -132,7 +151,7 @@ usage() {
prose 'If run from outside of a chroot, command will make the following
configuration changes in the chroot:'
bullet 'whatever changes `librechroot` makes.'
- bullet 'set `PKGDEST` and `SRCDEST` in `/etc/makepkg.conf`'
+ bullet 'set `{PKG,SRC,SRCPKG,LOG}DEST` in `/etc/makepkg.conf`'
bullet 'set `PACKAGER` in `/etc/makepkg.conf` to reflect the value
outside of the chroot.'
bullet '(maybe) delete `/build/.makepkg.conf`'
@@ -148,8 +167,12 @@ usage() {
the documentation there.'
echo
print 'Options:'
+ print ' %s options:' librechroot
flag "-n <$(_ CHROOT)>" 'Name of the chroot to use'
flag "-l <$(_ COPY)>" 'Name of, or absolute path to, the chroot copy to use'
+ flag "-w <$(_ 'PATH[:PATH]')>" 'Bind mount a file or directory, read/write'
+ flag "-r <$(_ 'PATH[:PATH]')>" 'Bind mount a file or directory, read-only'
+ print ' %s options:' libremakepkg
flag '-N' "Don't disable networking during build() and
package(). PLEASE don't use this unless you
have a special reason, its use is a violation
@@ -173,10 +196,14 @@ main() {
local chroot=''
# Parse command line options ###########################################
- while getopts 'n:l:NRh' flag ; do
+ while getopts 'n:l:w:r:NRh' flag ; do
case "${flag}" in
- n) if $INCHROOT; then err_chflag "$flag"; else chroot=$OPTARG; fi;;
- l) if $INCHROOT; then err_chflag "$flag"; else copy=$OPTARG; fi;;
+ n) if $INCHROOT; then err_chflag "$flag"; else
+ chroot=$OPTARG; fi;;
+ l) if $INCHROOT; then err_chflag "$flag"; else
+ copy=$OPTARG; fi;;
+ w|r) if $INCHROOT; then err_chflag "$flag"; else
+ librechroot_flags+=(-$flag "$OPTARG"); fi;;
N) NONET=false;;
R) repack=true; makepkg_args+=(-R);;
h) usage; return 0;;
@@ -204,6 +231,15 @@ main() {
fi
unset chroot
+ # Load makepkg configuration ###########################################
+ # Note that all of these are globals
+ PKGDEST="$(get_var makepkg PKGDEST "$PWD")"
+ SRCDEST="$(get_var makepkg SRCDEST "$PWD")"
+ SRCPKGDEST="$(get_var makepkg SRCPKGDEST "$PWD")"
+ LOGDEST="$(get_var makepkg LOGDEST "$PWD")"
+ MAKEFLAGS="$(get_var makepkg MAKEFLAGS '')"
+ PACKAGER="$(get_var makepkg PACKAGER '')"
+
# Quick sanity check ###################################################
if (( EUID )); then
@@ -217,20 +253,16 @@ main() {
exit 1
fi
- # Load makepkg configuration ###########################################
- # Note that all of these are globals
- SRCDEST="$(get_var makepkg SRCDEST "$PWD")"
- PKGDEST="$(get_var makepkg PKGDEST "$PWD")"
- LOGDEST="$(get_var makepkg LOGDEST "$PWD")"
- mkdir -p "$SRCDEST" "$PKGDEST" "$LOGDEST"
- MAKEFLAGS="$(get_var makepkg MAKEFLAGS '')"
- PACKAGER="$(get_var makepkg PACKAGER '')"
-
- librechroot_flags=(
- -r "$PWD:/startdir_host"
- -r "$SRCDEST:/srcdest_host"
- -n "$CHROOT"
- -l "$copy"
+ # Make sure that the various *DEST directories exist
+ mkdir -p -- "$PKGDEST" "$SRCDEST" "$SRCPKGDEST" "$LOGDEST"
+ # Check the permissions for $startdir and $SRCDEST
+ (
+ declare -i ret=0
+ check_directory_permissions "$PWD" || ret=1
+ if ! [[ "$PWD" -ef "$SRCDEST" ]]; then
+ check_directory_permissions "$SRCDEST" || ret=1
+ fi
+ exit $ret
)
# OK, we are starting now ##############################################
@@ -239,6 +271,13 @@ main() {
lock 9 "/build/.lock" \
"Waiting for existing lock on build directory to be released"
else
+ librechroot_flags+=(
+ -r "$PWD:/startdir_host"
+ -r "$SRCDEST:/srcdest_host"
+ -n "$CHROOT"
+ -l "$copy"
+ )
+
# Obtain a lock on the chroot
lock 9 "$copydir.lock" \
"Waiting for existing lock on chroot copy to be released: [%s]" "$copy"
diff --git a/src/chroot-tools/makechrootpkg.sh.patch b/src/chroot-tools/makechrootpkg.sh.patch
index 4dd1146..8180d89 100644
--- a/src/chroot-tools/makechrootpkg.sh.patch
+++ b/src/chroot-tools/makechrootpkg.sh.patch
@@ -1,14 +1,21 @@
---- makechrootpkg.sh.in 2013-10-26 14:53:57.000000000 -0400
-+++ makechrootpkg.sh.ugly 2013-11-16 15:14:04.000000000 -0500
-@@ -12,6 +12,7 @@
+--- makechrootpkg.sh.in 2014-05-10 22:03:27.956692573 -0400
++++ makechrootpkg.sh.ugly 2014-05-10 22:09:15.376594518 -0400
+@@ -1,4 +1,6 @@
+ #!/bin/bash
++# License: GNU GPLv2
++#
+ # This program 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; version 2 of the License.
+@@ -12,6 +14,7 @@
shopt -s nullglob
+init_variables() {
- _makepkg_args=(-s --noconfirm -L --holdver)
- makepkg_args=("${_makepkg_args[@]}")
+ default_makepkg_args=(-s --noconfirm -L --holdver)
+ makepkg_args=("${default_makepkg_args[@]}")
repack=false
-@@ -29,9 +30,10 @@
+@@ -29,9 +32,10 @@
bindmounts_rw=()
copy=$USER
@@ -20,7 +27,7 @@
usage() {
echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
-@@ -67,6 +69,7 @@
+@@ -67,6 +71,7 @@
exit 1
}
@@ -28,7 +35,7 @@
while getopts 'hcur:I:l:nTD:d:' arg; do
case "$arg" in
h) usage ;;
-@@ -93,9 +96,6 @@
+@@ -91,9 +96,6 @@
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkarchroot %s/root base-devel" "$chrootdir"
@@ -38,9 +45,9 @@
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
-@@ -110,30 +110,47 @@
- repack=true
- fi
+@@ -113,30 +115,48 @@
+ esac
+ done
-if [[ -n $SUDO_USER ]]; then
+if [[ -n ${SUDO_USER:-} ]]; then
@@ -54,8 +61,9 @@
+# Usage: load_vars $makepkg_conf
+# Globals:
+# - SRCDEST
-+# - LOGDEST
++# - SRCPKGDEST
+# - PKGDEST
++# - LOGDEST
+# - MAKEFLAGS
+# - PACKAGER
load_vars() {
@@ -63,7 +71,7 @@
[[ -f $makepkg_conf ]] || return 1
- for var in {SRC,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
+ for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
- [[ -z ${!var} ]] && eval $(grep "^${var}=" "$makepkg_conf")
+ [[ -z ${!var:-} ]] && eval $(grep "^${var}=" "$makepkg_conf")
done
@@ -92,11 +100,14 @@
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
slock 8 "$chrootdir/root.lock" "Locking clean chroot"
-@@ -154,11 +171,16 @@
+@@ -157,14 +177,19 @@
# Drop the read lock again
lock_close 8
- fi
+
+ # Update mtime
+ touch "$copydir"
}
-clean_temporary() {
@@ -109,10 +120,10 @@
+ local chroottype=$(stat -f -c %T "$copydir")
+
+ stat_busy "Removing chroot copy [%s]" "$copy"
- if [[ "$chroottype" == btrfs ]]; then
+ if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
btrfs subvolume delete "$copydir" >/dev/null ||
die "Unable to delete subvolume %s" "$copydir"
-@@ -173,9 +195,14 @@
+@@ -179,9 +204,14 @@
stat_done
}
@@ -127,7 +138,7 @@
for install_pkg in "${install_pkgs[@]}"; do
pkgname="${install_pkg##*/}"
cp "$install_pkg" "$copydir/$pkgname"
-@@ -188,11 +215,19 @@
+@@ -194,11 +224,19 @@
rm "$copydir/$pkgname"
done
@@ -149,9 +160,9 @@
$repack || rm -rf "$copydir/build"
mkdir -p "$copydir/build"
-@@ -226,12 +261,12 @@
+@@ -237,12 +275,12 @@
- chown -R nobody "$copydir"/{build,pkgdest,logdest,srcdest,startdir}
+ chown -R nobody "$copydir"/{build,pkgdest,srcpkgdest,logdest,srcdest,startdir}
- if [[ -n $MAKEFLAGS ]]; then
+ if [[ -n ${MAKEFLAGS:-} ]]; then
@@ -164,7 +175,7 @@
sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf"
echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf"
fi
-@@ -244,20 +279,38 @@
+@@ -255,20 +293,38 @@
chmod 440 "$copydir/etc/sudoers.d/nobody-pacman"
fi
@@ -174,16 +185,15 @@
+SigLevel = Optional TrustAll
+Server = file:///repo
+'
-+ sed -i "${line}i${ins//$'\n'/\n}" "$copydir/etc/pacman.conf"
++ sed -i "${line}i${ins//$'\n'/\\n}" "$copydir/etc/pacman.conf"
+ fi
+
# This is a little gross, but this way the script is recreated every time in the
# working copy
-- printf $'#!/bin/bash\n%s\n_chrootbuild %q "$@"' "$(declare -f _chrootbuild)" \
-+ printf '#!/bin/bash\n%s\n_chrootprepare "$@"' "$(declare -f _chrootprepare)" \
++ printf $'#!/bin/bash\n%s\n_chrootprepare "$@"' "$(declare -f _chrootprepare)" \
+ > "$copydir/chrootprepare"
+ chmod +x "$copydir/chrootprepare"
-+ printf '#!/bin/bash\n%s\n_chrootbuild %q "$@"' "$(declare -f _chrootbuild)" \
+ printf $'#!/bin/bash\n%s\n_chrootbuild %q "$@"' "$(declare -f _chrootbuild)" \
"$run_namcap" >"$copydir/chrootbuild"
chmod +x "$copydir/chrootbuild"
}
@@ -206,7 +216,7 @@
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o
else
( export SRCDEST BUILDDIR="$builddir"
-@@ -267,20 +320,15 @@
+@@ -278,10 +334,10 @@
(( $? != 0 )) && die "Could not download sources."
# Clean up garbage from verifysource
@@ -218,31 +228,28 @@
+_chrootprepare() {
# This function isn't run in makechrootpkg,
# so no global variables
-- local run_namcap="$1"; shift
-- local makepkg_args=("$@")
--
-- . /etc/profile
-- export HOME=/build
-- shopt -s nullglob
+ local run_namcap="$1"; shift
+@@ -292,6 +348,7 @@
+ shopt -s nullglob
# XXX: Workaround makepkg disliking read-only dirs
+ rm -rf -- /srcdest/* /startdir/*
ln -sft /srcdest /srcdest_host/*
ln -sft /startdir /startdir_host/*
-@@ -295,15 +343,27 @@
- done
- done
+@@ -317,11 +374,29 @@
-- cd /startdir
--
- # XXX: Keep PKGBUILD writable for pkgver()
-- rm PKGBUILD*
-- cp /startdir_host/PKGBUILD* .
-- chown nobody PKGBUILD*
-+ rm /startdir/PKGBUILD*
-+ cp /startdir_host/PKGBUILD* /startdir
-+ chown nobody /startdir/PKGBUILD*
+ # Safety check
+ if [[ ! -w PKGBUILD ]]; then
++ # XXX: internationalize this message
+ echo "Can't write to PKGBUILD!"
+ exit 1
+ fi
+
+- sudo -u nobody makepkg "${makepkg_args[@]}" || exit 1
++ # Sync deps now, as networking may be disabled during _chrootbuild
++ cp /repo/repo.db /var/lib/pacman/sync/repo.db
++ sudo -u nobody makepkg "${makepkg_args[@]}" -o
+}
+
+_chrootbuild() {
@@ -256,14 +263,12 @@
+ shopt -s nullglob
+
+ cd /startdir
++
++ sudo -u nobody makepkg "${makepkg_args[@]}" -e || exit 1
- # Safety check
- if [[ ! -w PKGBUILD ]]; then
-+ # XXX: internationalize this message
- echo "Can't write to PKGBUILD!"
- exit 1
- fi
-@@ -321,12 +381,24 @@
+ if $run_namcap; then
+ pacman -S --needed --noconfirm namcap
+@@ -334,12 +409,24 @@
exit 0
}
@@ -286,9 +291,9 @@
+ local l
for l in "$copydir"/logdest/*; do
+ [[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l"
- mv "$l" "$LOGDEST"
-@@ -334,6 +406,10 @@
+@@ -353,6 +440,10 @@
}
# }}}
@@ -298,26 +303,24 @@
+
umask 0022
- load_vars /etc/makepkg.conf
-@@ -344,17 +420,25 @@
- [[ -d $SRCDEST ]] || SRCDEST=$PWD
- [[ -d $LOGDEST ]] || LOGDEST=$PWD
+ load_vars "$USER_HOME/.makepkg.conf"
+@@ -364,30 +455,45 @@
+ [[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
+ [[ -d $LOGDEST ]] || LOGDEST=$PWD
-create_chroot
+# Lock the chroot we want to use. We'll keep this lock until we exit.
+lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
-
--$update_first && arch-nspawn "$copydir" \
-- "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
-- pacman -Syu --noconfirm
++
+if [[ ! -d $copydir ]] || $clean_first; then
+ sync_chroot "$chrootdir" "$copy"
+fi
--[[ -n ${install_pkgs[*]} ]] && install_packages
-+$update_first && arch-nspawn "$copydir" pacman -Syu --noconfirm
+ $update_first && arch-nspawn "$copydir" \
+ "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
+ pacman -Syu --noconfirm
--prepare_chroot
+-[[ -n ${install_pkgs[*]} ]] && install_packages
+if [[ -n ${install_pkgs[*]:-} ]]; then
+ install_packages "$copydir" "${install_pkgs[@]}"
+ ret=$?
@@ -325,15 +328,21 @@
+ [[ -f PKGBUILD ]] || exit $ret
+fi
--download_sources
+-prepare_chroot
+prepare_chroot "$copydir" "$USER_HOME" "$repack"
-+
+
+-download_sources
+download_sources "$copydir" "$src_owner"
if arch-nspawn "$copydir" \
--bind-ro="$PWD:/startdir_host" \
-@@ -362,12 +446,12 @@
+ --bind-ro="$SRCDEST:/srcdest_host" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
++ /chrootprepare &&
++ arch-nspawn "$copydir" \
++ --bind-ro="$PWD:/startdir_host" \
++ --bind-ro="$SRCDEST:/srcdest_host" \
++ "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
/chrootbuild "${makepkg_args[@]}"
then
- move_products
@@ -347,7 +356,7 @@
if (( ret != 0 )); then
if $temp_chroot; then
-@@ -378,3 +462,4 @@
+@@ -398,3 +504,4 @@
else
true
fi
diff --git a/src/chroot-tools/mkarchroot.patch b/src/chroot-tools/mkarchroot.patch
new file mode 100644
index 0000000..9366d92
--- /dev/null
+++ b/src/chroot-tools/mkarchroot.patch
@@ -0,0 +1,30 @@
+--- mkarchroot.in 2014-05-10 22:10:54.871326879 -0400
++++ mkarchroot.ugly 2014-05-10 22:10:54.887993222 -0400
+@@ -1,4 +1,6 @@
+ #!/bin/bash
++# License: GNU GPLv2
++#
+ # This program 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; version 2 of the License.
+@@ -66,6 +68,11 @@
+ chmod 0755 "$working_dir"
+ fi
+
++_env=()
++while read -r varname; do
++ _env+=("$varname=${!varname}")
++done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$')
++env -i "${_env[@]}" \
+ pacstrap -GMcd ${pac_conf:+-C "$pac_conf"} "$working_dir" \
+ "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages'
+
+@@ -73,7 +80,7 @@
+ echo 'LANG=C' > "$working_dir/etc/locale.conf"
+ echo "$CHROOT_VERSION" > "$working_dir/.arch-chroot"
+
+-exec arch-nspawn \
++exec $(librelib chroot/arch-nspawn) \
+ ${pac_conf:+-C "$pac_conf"} \
+ ${makepkg_conf:+-M "$makepkg_conf"} \
+ ${cache_dir:+-c "$cache_dir"} \
diff --git a/src/dagpkg b/src/dagpkg
new file mode 100755
index 0000000..e1487d5
--- /dev/null
+++ b/src/dagpkg
@@ -0,0 +1,222 @@
+#!/usr/bin/env bash
+#
+# dagpkg - create a directed graph of package dependencies and build
+# them in topological order
+
+# Copyright (C) 2014 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2014 Michał Masłowski <mtjm@mtjm.eu>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+set -e
+
+source libremessages
+source $(librelib conf)
+
+# Source variables from libretools
+load_files libretools
+check_vars libretools FULLBUILDCMD || exit 1
+#check_vars libretools HOOKPREBUILD HOOKLOCALRELEASE || exit 1 # optional
+
+# Source variables from makepkg
+load_files makepkg
+check_vars makepkg CARCH || exit 1
+
+# Globals:
+# - temp_dir
+# - log
+# - name (sort of, it's also local to visit_pkgbuild() )
+# - prev
+# - I
+# - marks
+# - various PKGBUILD variables:
+# - pkgbase/pkgname
+# - epoch/pkgver/pkgrel
+# - arch
+# - {,make,check}depends
+
+# End inmediately but print an useful message
+trap_exit() {
+ local signal=$1; shift
+ local msg=("$@")
+ term_title "error!"
+ echo
+ error "(%s) %s (leftovers on %s)" \
+ "${0##*/}" "$(print "${msg[@]}")" "${temp_dir}"
+ trap -- "$signal"
+ kill "-$signal" "$$"
+}
+
+setup_traps trap_exit
+
+source_pkgbuild() {
+ # Source this PKGBUILD, if it doesn't exist, exit
+ if ! load_PKGBUILD &>/dev/null; then
+ error "No PKGBUILD in %s" "$PWD"
+ exit 1
+ fi
+
+ # Save resources
+ # This is intentionally less exhaustive than unset_PKGBUILD()
+ # XXX: document which things we actually *want* to not be unset.
+ unset pkgdesc license groups backup install md5sums sha1sums \
+ sha256sums source options &>/dev/null
+
+ unset build package &>/dev/null
+
+ local _pkg
+ for _pkg in "${pkgname[@]}"; do
+ unset "package_${_pkg}" &>/dev/null || true
+ done
+
+ # This is the name of the package
+ name="${pkgbase:-${pkgname[0]}}"
+}
+
+source_pkgbuild
+
+# A temporary work dir and log file
+temp_dir="${1:-$(mktemp -dt ${name}-testpkg-XXXX)}"
+log="${temp_dir}/buildorder"
+
+# Mark array for DFS-based topological sort. See
+# https://en.wikipedia.org/wiki/Topological_sort for an explanation of
+# the algorithm. Key: package name, value: 0 for unvisited package, 1
+# during visit, 2 after visit.
+declare -A marks
+
+# Visit a PKGBUILD for graph building.
+visit_pkgbuild() {
+ # The name of the previous package
+ prev="${1}"
+
+ local name
+ source_pkgbuild
+
+ # If it's already built we don't bother
+ if is_built "${pkgname[0]}" "$(get_full_version "${pkgname[0]}")"; then
+ return
+ fi
+
+ # Detect cycle or already visited package
+ case "${marks[$name]:-0}" in
+ 1) msg2 "cycle found with %s depending on %s" $prev $name
+ exit 1;;
+ 2) return;;
+ esac
+
+ msg "%s (%s)" ${name} ${prev}
+
+ if ! in_array "${CARCH}" "${arch[@]}"; then
+ warning "%s isn't ported to %s yet" ${name} ${CARCH}
+ fi
+
+ # If the envvar I contains this package, ignore it and exit
+ if in_array "$name" $I; then
+ msg2 "%s ignored" ${name}
+ return
+ fi
+
+ # Mark the package as being visited
+ marks[$name]=1
+
+ # Recurse into dependencies
+ local d
+ for d in "${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}"; do
+ # Cleanup dependency versions
+ d=$(echo $d | sed "s/[<>=].*//")
+
+ # Where's the pkgbuild?
+ local w=$(toru-where $d)
+
+ # Skip if not available
+ test -z "$w" && continue
+
+ # Go to this dir
+ pushd $w &>/dev/null
+
+ visit_pkgbuild "$name"
+
+ popd &>/dev/null
+ done
+
+ # Mark the package as finished
+ marks[$name]=2
+ # Append it to the reversed list of packages to build.
+ echo "$name" >> "${log}"
+}
+
+# If we specified a work dir on the cli it means we want to skip
+# dependency graph creation and jump to build whatever is there
+if [ -z "${1}" ]; then
+ # Visit the root PKGBUILD to make the graph.
+ visit_pkgbuild ""
+else
+ msg "Resuming build..."
+fi
+
+# enter work dir
+pushd "${temp_dir}" &>/dev/null
+nl ${log} | while read order pkg; do
+ # skip if already built
+ if test -f "${pkg}/built_ok"; then
+ warning "tried to build %s twice" "%{pkg}"
+ continue
+ fi
+
+ # where's this package?
+ local w="$(toru-where "$pkg")"
+ test -z "$w" && continue
+
+ # copy to work dir if not already
+ # this means you can make modifications to the pkgbuild during the
+ # graph build or remove the dir after a build failure and let dagpkg
+ # copy a new version
+ test -d "$pkg" || cp -r "$w" "$pkg"
+ pushd "$pkg" &>/dev/null
+
+ term_title "$pkg($order)"
+
+ msg "Building %s" ${pkg}
+
+ # upgrade the system
+ # this would probably have to go on HOOKPREBUILD if you're working
+ # outside chroots
+ sudo -E pacman -Syu --noconfirm
+
+ # run the pre build command from libretools.conf
+ if [[ -n "$HOOKPREBUILD" ]]; then
+ ${HOOKPREBUILD}
+ fi
+
+ # run the build command
+ ${FULLBUILDCMD}
+
+ # Run local release hook with $1 = $repo
+ if [[ -n "$HOOKLOCALRELEASE" ]]; then
+ ${HOOKLOCALRELEASE} "$(basename "$(dirname "$w")")"
+ fi
+
+ # it's built!
+ touch built_ok
+
+ popd &>/dev/null
+done
+
+popd &>/dev/null
+# cleanup
+rm -rf ${log} "${temp_dir}"
+
+term_title "done"
diff --git a/src/devtools/.gitignore b/src/devtools/.gitignore
index 097fcde..d669bbd 100644
--- a/src/devtools/.gitignore
+++ b/src/devtools/.gitignore
@@ -1,3 +1,4 @@
*
!Makefile
!.gitignore
+!*.patch
diff --git a/src/devtools/checkpkg.patch b/src/devtools/checkpkg.patch
new file mode 100644
index 0000000..2e3bb63
--- /dev/null
+++ b/src/devtools/checkpkg.patch
@@ -0,0 +1,45 @@
+--- checkpkg.in 2014-03-21 13:59:31.849658036 -0400
++++ checkpkg.ugly 2014-03-21 14:20:52.340291982 -0400
+@@ -1,8 +1,30 @@
+ #!/bin/bash
++# License: Unspecified
+
+ shopt -s extglob
+
+-m4_include(lib/common.sh)
++. $(librelib messages)
++
++usage() {
++ print 'Usage: %s [-h]' "${0##*/}"
++ print 'Compare a locally built a package with the one in the repositories.'
++ echo
++ prose 'This should be run from a directory containing a
++ PKGBUILD. It searches for a locally built package
++ corresponding to the PKGBUILD, and downloads the last
++ version of that package from the pacman repositories.
++ It then compares the list of .so files provided by each
++ version of the package. It does this for each part of
++ a split package.'
++}
++
++if [[ $1 = '-h' ]]; then
++ usage
++ exit 0
++elif [[ $# -gt 0 ]]; then
++ usage >&2
++ exit 1
++fi
+
+ # Source makepkg.conf; fail if it is not found
+ if [[ -r '/etc/makepkg.conf' ]]; then
+@@ -17,7 +39,9 @@
+ fi
+
+ if [[ ! -f PKGBUILD ]]; then
+- die 'This must be run in the directory of a built package.'
++ error 'This must be run in the directory of a built package.'
++ usage >&2
++ exit 1
+ fi
+
+ . ./PKGBUILD
diff --git a/src/devtools/find-libdeps.patch b/src/devtools/find-libdeps.patch
new file mode 100644
index 0000000..fe8e2fe
--- /dev/null
+++ b/src/devtools/find-libdeps.patch
@@ -0,0 +1,47 @@
+--- find-libdeps.in 2014-03-21 13:59:32.059649315 -0400
++++ find-libdeps.ugly 2014-03-21 14:21:18.955744982 -0400
+@@ -1,6 +1,7 @@
+ #!/bin/bash
++# License: Unspecified
+
+-m4_include(lib/common.sh)
++. $(librelib messages)
+
+ set -e
+ shopt -s extglob
+@@ -19,12 +20,32 @@
+ *) die "Unknown mode %s" "$script_mode" ;;
+ esac
+
++usage() {
++ print "Usage: find-lib(deps|provides) [options] <package file|extracted package dir>"
++ print "Find library dependencies or provides of a package."
++ echo
++ prose 'Prints a list of library dependencies in the format:'
++ echo
++ print ' <soname>=<soversion>-<soarch>'
++ echo
++ prose 'Where <soversion> is the shared library version, or
++ <soname> repeated if there is no version attached; and
++ <soarch> is the architecture of the library (either `32`
++ or `64`, based on the ELF Class).'
++ echo
++ print "Options:"
++ flag "--ignore-internal" "Ignore internal libraries; libraries
++ without a version attached"
++ flag "-h" "Show this message"
++}
+ if [[ -z $1 ]]; then
+- echo "${0##*/} [options] <package file|extracted package dir>"
+- echo "Options:"
+- echo " --ignore-internal ignore internal libraries"
++ usage >&2
+ exit 1
+ fi
++if [[ $1 = '-h' ]]; then
++ usage
++ exit 0
++fi
+
+ if [[ -d $1 ]]; then
+ pushd $1 >/dev/null
diff --git a/src/devtools/finddeps.patch b/src/devtools/finddeps.patch
new file mode 100644
index 0000000..feae920
--- /dev/null
+++ b/src/devtools/finddeps.patch
@@ -0,0 +1,35 @@
+--- finddeps.in 2014-03-21 13:59:32.249641424 -0400
++++ finddeps.ugly 2014-03-21 14:21:09.949489174 -0400
+@@ -2,19 +2,26 @@
+ #
+ # finddeps - find packages that depend on a given depname
+ #
++# License: Unspecified
+
+-m4_include(lib/common.sh)
++. $(librelib messages)
+
+ match=$1
+
++usage() {
++ print 'Usage: %s <depname>' "${0##*/}"
++ print 'Find packages that depend on a given depname.'
++ echo
++ prose 'Run this script from the top-level directory of your ABS tree.'
++}
+ if [[ -z $match ]]; then
+- echo 'Usage: finddeps <depname>'
+- echo ''
+- echo 'Find packages that depend on a given depname.'
+- echo 'Run this script from the top-level directory of your ABS tree.'
+- echo ''
++ usage >&2
+ exit 1
+ fi
++if [[ $match = '-h' ]]; then
++ usage
++ exit 0
++fi
+
+ find . -type d | while read d; do
+ if [[ -f "$d/PKGBUILD" ]]; then
diff --git a/src/devtools/lddd.patch b/src/devtools/lddd.patch
new file mode 100644
index 0000000..415b178
--- /dev/null
+++ b/src/devtools/lddd.patch
@@ -0,0 +1,29 @@
+--- lddd.in 2014-03-21 13:59:32.419634364 -0400
++++ lddd.ugly 2014-03-21 14:21:31.538503947 -0400
+@@ -2,8 +2,25 @@
+ #
+ # lddd - find broken library links on your machine
+ #
++# License: Unspecified
+
+-m4_include(lib/common.sh)
++. $(librelib messages)
++
++usage() {
++ print "Usage: %s [-h]" "${0##*/}"
++ print "Find broken library links on your machine."
++ echo
++ prose 'Scans $PATH and library directories for ELF files with
++ references to missing shared libraries.'
++}
++
++if [[ $1 = '-h' ]]; then
++ usage
++ exit 0
++elif [[ $# -gt 0 ]]; then
++ usage >&2
++ exit 1
++fi
+
+ ifs=$IFS
+ IFS="${IFS}:"
diff --git a/src/fullpkg/fullpkg b/src/fullpkg/fullpkg
index 978cf7b..e053c6e 100755
--- a/src/fullpkg/fullpkg
+++ b/src/fullpkg/fullpkg
@@ -1,8 +1,27 @@
#!/usr/bin/env bash
-# set -x # uncomment for debug
# Builds packages from ABS recursively. It tries to find dependencies that
# aren't built or need update and then makepkg them in order.
+# Copyright (C) 2011 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. libremessages
+
usage() {
print "Usage: %s [OPTIONS] [BUILD_DIR]" "${0##*/}"
print "A (libre)makepkg wrapper that will also build dependencies"
diff --git a/src/fullpkg/fullpkg-build b/src/fullpkg/fullpkg-build
index e824c2e..06d0d50 100755
--- a/src/fullpkg/fullpkg-build
+++ b/src/fullpkg/fullpkg-build
@@ -3,6 +3,25 @@
# Builds packages from ABS recursively. It tries to find dependencies that
# aren't built or need update and then makepkg them in order.
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2011 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
# TODO move __build to chroot
. libremessages
diff --git a/src/fullpkg/fullpkg-find b/src/fullpkg/fullpkg-find
index a96bc8a..c12888a 100755
--- a/src/fullpkg/fullpkg-find
+++ b/src/fullpkg/fullpkg-find
@@ -1,38 +1,39 @@
#!/usr/bin/env bash
# set -x # uncomment for debug
-# Copyright (c) 2011-2012 Joshua I. Haase H. (xihh) <hahj87@gmail.com>
-# Copyright (c) 2011-2012 Nicolás Reynolds <fauno@kiwwwi.com.ar>
-# Copyright (c) 2012 Michał Masłowski <mtjm@mtjm.eu>
-# Copyright (c) 2012-2013 Luke Shumaker <LukeShu@sbcglobal.net>
+# Copyright (C) 2011-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
#
# The copy_files() function is taken from makechrootpkg:
-# Copyright (c) 2007 Armin Luntzer <armin@archlinuxppc.org>
-# Copyright (c) 2007 Jason Chu <jchu@xentac.net>
-# Copyright (c) 2007, 2011 Dan McGee <dan@archlinux.org>
-# Copyright (c) 2007-2008 Travis Willard <travis@archlinux.org>
-# Copyright (c) 2007-2009 Aaron Griffin <aaronmgriffin@gmail.com>
-# Copyright (c) 2008 Simo Leone <simo@archlinux.org>
-# Copyright (c) 2009 Biru Ionut <biru.ionut@gmail.com>
-# Copyright (c) 2009 Biru Ionut <ionut@archlinux.ro>
-# Copyright (c) 2009 Evangelos Foutras <foutrelis@gmail.com>
-# Copyright (c) 2009 Francois Charette <francois@samarqand.localdomain>
-# Copyright (c) 2009 Nezmer <Nezmer@allurelinux.org>
-# Copyright (c) 2009 Ronald van Haren <pressh@gmail.com>
-# Copyright (c) 2009-2011 Andrea Scarpino <andrea@archlinux.org>
-# Copyright (c) 2009-2012 Allan McRae <allan@archlinux.org>
-# Copyright (c) 2009-2012 Eric Bélanger <snowmaniscool@gmail.com>
-# Copyright (c) 2009-2012 Pierre Schmitz <pierre@archlinux.de>
-# Copyright (c) 2010 Byron Clark <byron@theclarkfamily.name>
-# Copyright (c) 2011 Ionut Biru <ibiru@archlinux.org>
-# Copyright (c) 2011 Lukas Fleischer <archlinux@cryptocrack.de>
-# Copyright (c) 2011-2012 Florian Pritz <bluewind@xinu.at>
-# Copyright (c) 2011-2013 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
-# Copyright (c) 2013 Sébastien Luttringer <seblu@seblu.net>
+# Copyright (C) 2007 Armin Luntzer <armin@archlinuxppc.org>
+# Copyright (C) 2007 Jason Chu <jchu@xentac.net>
+# Copyright (C) 2007, 2011 Dan McGee <dan@archlinux.org>
+# Copyright (C) 2007-2008 Travis Willard <travis@archlinux.org>
+# Copyright (C) 2007-2009 Aaron Griffin <aaronmgriffin@gmail.com>
+# Copyright (C) 2008 Simo Leone <simo@archlinux.org>
+# Copyright (C) 2009 Biru Ionut <ibiru@archlinux.org>
+# Copyright (C) 2009 Evangelos Foutras <foutrelis@gmail.com>
+# Copyright (C) 2009 Francois Charette <francois@samarqand.localdomain>
+# Copyright (C) 2009 Nezmer <Nezmer@allurelinux.org>
+# Copyright (C) 2009 Ronald van Haren <pressh@gmail.com>
+# Copyright (C) 2009-2011 Andrea Scarpino <andrea@archlinux.org>
+# Copyright (C) 2009-2012 Allan McRae <allan@archlinux.org>
+# Copyright (C) 2009-2012 Eric Bélanger <snowmaniscool@gmail.com>
+# Copyright (C) 2009-2012 Pierre Schmitz <pierre@archlinux.de>
+# Copyright (C) 2010 Byron Clark <byron@theclarkfamily.name>
+# Copyright (C) 2011 Ionut Biru <ibiru@archlinux.org>
+# Copyright (C) 2011 Lukas Fleischer <archlinux@cryptocrack.de>
+# Copyright (C) 2011-2012 Florian Pritz <bluewind@xinu.at>
+# Copyright (C) 2011-2013 Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
+# Copyright (C) 2013 Sébastien Luttringer <seblu@seblu.net>
#
# Because of the code from makechrootpkg, this file is GPLv2, instead of GPLv3
# like most of libretools.
#
+# License: GNU GPLv2
+#
# This program 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; version 2 of the License.
@@ -51,7 +52,7 @@
# Get repo name. Asumes ${ABSROOT}/repo/package/PKGBUILD
guess_repo() {
- basename $(dirname $(pwd))
+ basename "$(dirname "$(pwd)")"
}
# This function is stolen from makechrootpkg.
@@ -120,11 +121,12 @@ find_deps() {
## Check next levels
declare -i next_level=$LEVEL+1
- # All deps in separate line, only once, without version.
- deps=($(echo "${depends[@]} ${makedepends[@]}" | \
- sed "s/[=<>]\+[^ ]\+//g" | \
- tr ' ' "\n" | \
- sort -u))
+ # All deps
+ local deps=("${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}")
+ # Strip version specifiers
+ deps=("${deps[@]%%[=<>]*}")
+ # Filter out duplicates
+ read -d $'\n' -a deps <<<"$(printf '%s\n' "${deps[@]}"|sort -u)"
local _dep
for _dep in "${deps[@]}"; do
@@ -139,7 +141,7 @@ find_deps() {
pushd "${pkgdir}" > /dev/null
# runs itself on dep's PKGBUILD dir
- $0 -l ${next_level} ${build_dir} || return $?
+ "$0" -l "${next_level}" "${build_dir}" || return $?
popd > /dev/null
fi
diff --git a/src/gitget/gitget b/src/gitget/gitget
index 194ec05..fe5d46b 100755
--- a/src/gitget/gitget
+++ b/src/gitget/gitget
@@ -1,7 +1,9 @@
#!/usr/bin/env bash
-# Copyright (c) 2012-2013 Pacman Development Team <pacman-dev@archlinux.org>
-# Copyright (c) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2012-2013 Pacman Development Team <pacman-dev@archlinux.org>
+# Copyright (C) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -85,7 +87,7 @@ download_git_checkout() {
fi
fi
msg2 "Updating %s %s repo..." "${name}" "git"
- if ! git pull origin "$ref"; then
+ if ! { git fetch --all -p && git checkout "$ref" && git pull origin "$ref"; } ; then
# only warn on failure to allow offline builds
warning "Failure while updating %s %s repo" "${repo}" "git"
fi
@@ -143,8 +145,7 @@ download_git_bare() {
}
usage() {
- print 'Usage: %s [OPTIONS] bare URL DIRECTORY' "${0##*/}"
- print 'Usage: %s [OPTIONS] checkout URL DIRECTORY' "${0##*/}"
+ print 'Usage: %s [OPTIONS] [bare|checkout] URL DIRECTORY' "${0##*/}"
print 'A URL-handler for git urls. Capable of updating or cloning.'
echo
prose "Clones or pulls from the git URL, to a local DIRECTORY. If
diff --git a/src/gitget/libregit b/src/gitget/libregit
index f89a402..41aefc3 100755
--- a/src/gitget/libregit
+++ b/src/gitget/libregit
@@ -1,6 +1,8 @@
#!/usr/bin/env bash
-# Copyright (c) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -18,18 +20,17 @@
. libremessages
usage() {
- print 'Usage: %s repo ref dir' "${0##*/}"
+ print 'Usage: %s REPO REF DIR' "${0##*/}"
print 'A compatability wrapper around `gitget checkout`'
echo
prose "This exists because gitget used to be called libregit, and took
the arguments in this format, and I'm sure there are a few
scripts floating around that use it."
echo
- prose "Clones or pulls from the git URL 'repo', and checks out the git
- ref 'ref' to the directory 'dir'."
+ prose "Clones or pulls from the git URL '<REPO>', and checks out the git
+ ref '<REF>' to the directory '<DIR>'."
}
-
main() {
[[ $# == 3 ]] || { usage >&2; return 1; }
repo=$1
@@ -38,3 +39,5 @@ main() {
gitget checkout "${repo}#ref=${ref}" "${dir}"
}
+
+main "$@"
diff --git a/src/is_built b/src/is_built
index ba5f061..67c0d8d 100755
--- a/src/is_built
+++ b/src/is_built
@@ -1,4 +1,24 @@
#!/usr/bin/env bash
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011-2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# 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 <http://www.gnu.org/licenses/>.
. libremessages
diff --git a/src/lib/Makefile b/src/lib/Makefile
index 4f24ad3..495abb1 100644
--- a/src/lib/Makefile
+++ b/src/lib/Makefile
@@ -1,5 +1,5 @@
copy_files = common.sh.in
-libexecs = $(filter-out librelib,$(wildcard libre*))
+libexecs = $(filter-out librelib,$(progs))
# include common.sh in libs explicitly, because it might not exist yet
# when the wildcard is performed
libs = $(sort $(wildcard *.sh) common.sh)
@@ -14,7 +14,13 @@ common.sh: %: %.in %.top Makefile
@{ \
cat '$*.top' && \
echo && \
- sed -r -e '/encoding problem/d;/LANG=/d' -e 's/mesg=\$$(.)/mesg="$$(_ "$$\1")"/' '$*.in' && \
+ sed -r \
+ -e '/encoding problem/d;/LANG=/d' \
+ -e 's/mesg=\$$(.)/mesg="$$(_ "$$\1")"/' \
+ -e 's/gettext /_l _ /g' \
+ -e "s/^(\s+)(msg|error) '/\1_l \2 '/" \
+ -e 's|lock\(\)\s*\{|lock()\n{|' \
+ '$*.in' && \
echo && \
cat '$*.bottom' && \
:; } > '$@'
diff --git a/src/lib/common.sh.top b/src/lib/common.sh.top
index 054301b..d45a7dd 100644
--- a/src/lib/common.sh.top
+++ b/src/lib/common.sh.top
@@ -4,23 +4,22 @@
# This file is included by libremessages.
# You should probably use libremessages instead of this.
-# This program 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; version 2 of the License.
-#
-# This program 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.
+# License: Unspecified
+
+shopt -s extglob
if [[ -z ${_INCLUDE_COMMON_SH:-} ]]; then
_INCLUDE_COMMON_SH=true
-export TEXTDOMAIN='libretools'
-export TEXTDOMAINDIR='/usr/share/locale'
+[[ -n ${TEXTDOMAIN:-} ]] || export TEXTDOMAIN='libretools'
+[[ -n ${TEXTDOMAINDIR:-} ]] || export TEXTDOMAINDIR='/usr/share/locale'
if type gettext &>/dev/null; then
_() { gettext "$@"; }
else
_() { echo "$@"; }
fi
+
+_l() {
+ TEXTDOMAIN='librelib' TEXTDOMAINDIR='/usr/share/locale' "$@"
+}
diff --git a/src/lib/conf.sh b/src/lib/conf.sh
index 561ae9e..1aa7b56 100644
--- a/src/lib/conf.sh
+++ b/src/lib/conf.sh
@@ -1,11 +1,13 @@
#!/bin/bash # non-executable, but put this there as a hint to text editors
# This may be included with or without `set -euE`
-# Copyright (c) 2012-2013 by Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2012-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
#
# This program 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
+# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
@@ -122,7 +124,7 @@ load_files() {
# Check whether the variables listed are properly set.
# If not, it prints a message saying to set them in the configuration file(s)
# for $slug.
-check_vars() {
+check_vars() (
local slug=$1; shift
local ret=0
@@ -132,10 +134,10 @@ check_vars() {
if [[ -z ${!VAR:-} ]]; then
type print &>/dev/null || . libremessages
if [[ $(list_files $slug|wc -l) -gt 1 ]]; then
- print "Configure '%s' in one of:" "$VAR"
+ _l print "Configure '%s' in one of:" "$VAR"
list_files $slug | sed 's/./ -> &/'
else
- print "Configure '%s' in '%s'" "$VAR" "$(list_files $slug)"
+ _l print "Configure '%s' in '%s'" "$VAR" "$(list_files $slug)"
fi
ret=1
fi
@@ -144,7 +146,7 @@ check_vars() {
if [[ $ret != 0 ]]; then
return 1
fi
-}
+)
# Usage: get_var <slug> <var_name> <default_value>
# Does not work with arrays
diff --git a/src/lib/libreblacklist b/src/lib/libreblacklist
index 5db1a3f..8aa33cc 100755
--- a/src/lib/libreblacklist
+++ b/src/lib/libreblacklist
@@ -2,11 +2,13 @@
# This may be included with or without `set -euE`
# When run directly, it does `set -euE`
-# Copyright (c) 2013 by Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv2+
#
# This program 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
+# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
@@ -48,7 +50,7 @@ blacklist-update() (
local remote_blacklist="$BLACKLIST"
local local_blacklist="$XDG_CACHE_HOME/libretools/blacklist.txt"
- stat_busy "Downloading blacklist of proprietary software packages"
+ _l stat_busy "Downloading blacklist of proprietary software packages"
mkdir -p "${local_blacklist%/*}"
if wget -N -q -O "${local_blacklist}.part" "$remote_blacklist" 2>/dev/null; then
@@ -58,9 +60,9 @@ blacklist-update() (
stat_done
rm "${local_blacklist}.part"
if [[ -e "$local_blacklist" ]]; then
- warning "Using local copy of blacklist"
+ _l warning "Using local copy of blacklist"
else
- error "Download failed, exiting"
+ _l error "Download failed, exiting"
return 1
fi
@@ -109,6 +111,8 @@ if [[ "${0##*/}" == libreblacklist ]]; then
sed 's/\r/\n/g'<<<"$1"|sed -e '/^$/d' -e 's/^# //'
}
usage() {
+ export TEXTDOMAIN='librelib'
+ export TEXTDOMAINDIR='/usr/share/locale'
. $(librelib messages)
if [[ $# -eq 0 ]]; then
print "Usage: %s [-h] COMMAND [ARGUMENTS]" "${0##*/}"
@@ -135,7 +139,7 @@ if [[ "${0##*/}" == libreblacklist ]]; then
}
if [[ $# -eq 0 ]]; then
- usage >/dev/stderr
+ usage >&2
exit 1
fi
_blacklist_cmd=$1
diff --git a/src/lib/librelib b/src/lib/librelib
index a58f5d3..63d9a26 100755
--- a/src/lib/librelib
+++ b/src/lib/librelib
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
-# Copyright (c) 2013 by Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -16,18 +18,31 @@
default_libdir=/usr/lib/libretools
-if ! type gettext &>/dev/null; then
- gettext() { echo "$@"; }
+if type gettext &>/dev/null; then
+ _() { gettext "$@"; }
+else
+ _() { echo "$@"; }
fi
+_l() {
+ TEXTDOMAIN='librelib' TEXTDOMAINDIR='/usr/share/locale' "$@"
+}
+
print() {
- mesg=$1
+ local mesg="$(_ "$1")"
shift
- printf -- "$(gettext "$mesg")\n" "$@"
+ printf -- "$mesg\n" "$@"
+}
+
+_html_whitespace_collapse() {
+ [[ $# == 0 ]] || panic
+ tr '\n' ' ' | sed -r -e 's/\t/ /g' -e 's/ +/ /g'
}
prose() {
- print "$@" | fmt -su
+ [[ $# -ge 1 ]] || panic
+ local mesg="$(_ "$(_html_whitespace_collapse <<<"$1")")"; shift
+ printf -- "$mesg" "$@" | fmt -u
}
cmd=${0##*/}
@@ -54,11 +69,11 @@ usage() {
main() {
if [[ $# != 1 ]]; then
- usage >&2
+ _l usage >&2
return 2
fi
if [[ $1 == '-h' ]]; then
- usage
+ _l usage
return 0;
fi
@@ -76,7 +91,7 @@ main() {
return 0;
fi
done
- print '%s: could not find library: %s' "$cmd" "$lib" >> /dev/stderr
+ _l print '%s: could not find library: %s' "$cmd" "$lib" >&2
return 1
}
diff --git a/src/lib/libremessages b/src/lib/libremessages
index c6d08e2..b89e2bc 100755
--- a/src/lib/libremessages
+++ b/src/lib/libremessages
@@ -2,28 +2,33 @@
# This may be included with or without `set -euE`
# When run directly, it does `set -euE`
-# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
-# Copyright (c) 2006-2010 Pacman Development Team <pacman-dev@archlinux.org>
-# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
-# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
-# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk>
-# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org>
-# Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
-# Copyright (c) 2011 by Joshua Haase <hahj87@gmail.com>
-# Copyright (c) 2012-2013 by Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+
+# For just the setup_traps() function:
+# Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>
+# Copyright (C) 2006-2010 Pacman Development Team <pacman-dev@archlinux.org>
+# Copyright (C) 2005 Aurelien Foret <orelien@chez.com>
+# Copyright (C) 2005 Christian Hamar <krics@linuxforum.hu>
+# Copyright (C) 2006 Alex Smith <alex@alex-smith.me.uk>
+# Copyright (C) 2006 Andras Voroskoi <voroskoi@frugalware.org>
+# Copyright (C) 2006 Miklos Vajna <vmiklos@frugalware.org>
#
-# This program 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.
+# License: GNU GPLv2+
#
-# This program 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.
+# This program 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 2 of the License, or
+# (at your option) any later version.
#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
################################################################################
# Inherit most functions from devtools #
@@ -36,7 +41,7 @@
################################################################################
panic() {
- echo "$(_ 'panic: malformed call to internal function')" >&2
+ echo "$(_l _ 'panic: malformed call to internal function')" >&2
exit 1
}
@@ -88,8 +93,6 @@ bullet() {
# bullet.
flag() {
[[ $# == 2 ]] || panic
- local n='
-'
local flag=$1
local desc="$(_ "$(_html_whitespace_collapse <<<"$2")")"
@@ -99,7 +102,7 @@ flag() {
done
local lines
- IFS=$n lines=($(fmt -u -w $((73-indent)) <<<"$desc"))
+ IFS=$'\n' lines=($(fmt -u -w $((73-indent)) <<<"$desc"))
local line
for line in "${lines[@]}"; do
printf " %-${indent}s %s\n" "$flag" "$line"
@@ -119,6 +122,38 @@ term_title() {
printf "$fmt" "$*"
}
+# Usage: setup_traps [handler]
+# Sets up traps on TERM, HUP, QUIT and INT signals, as well as the ERR event,
+# similar to makepkg.
+#
+# If `handler` is specified, instead of using the default handler
+# (which is good for most purposes), it will call the command handler
+# with the arguments:
+#
+# ${handler} SIGNAL_NAME MESSAGE_FMT [MESSAGE_PARAMS...]
+#
+# where MESSAGE_* are printf-like stuff.
+setup_traps() {
+ [[ $# -le 1 ]] || panic
+ if [[ $# == 1 ]]; then
+ eval "_libremessages_trap_exit() { $1 \"\$@\"; }"
+ else
+ _libremessages_trap_exit() {
+ local signal=$1; shift
+ echo
+ error "$@"
+ trap -- "$signal"
+ kill "-$signal" "$$"
+ }
+ fi
+ set -E
+ for signal in TERM HUP QUIT; do
+ trap "_libremessages_trap_exit $signal '%s signal caught. Exiting...' $signal" $signal
+ done
+ trap '_libremessages_trap_exit INT "Aborted by user! Exiting..."' INT
+ trap '_libremessages_trap_exit USR1 "An unknown error has occurred. Exiting..."' ERR
+}
+
################################################################################
# Run one of the defined functions if invoked directly #
################################################################################
diff --git a/src/lib/libremessages.1.ronn b/src/lib/libremessages.1.ronn
index b91a958..2bf73a1 100644
--- a/src/lib/libremessages.1.ronn
+++ b/src/lib/libremessages.1.ronn
@@ -69,6 +69,15 @@ Unless otherwise noted, these do not implicitly call `gettext`.
Joins all arguments with whitespace, and sets the terminal title
to that.
+ * `setup_traps` [<HANDLER>]:
+ Sets traps on TERM, HUP, QUIT and INT signals, as sell as the ERR
+ event, similar to makepkg. If <HANDLER> is specified, instead of
+ using the default handler (which is good for most purposes), it
+ will call <HANDLER> with the arguments
+ `<HANDLER> <SIGNAL_NAME> <MESSAGE> [<MESSAGE_ARGS>...]`, where
+ <MESSAGE> is a `printf`(1)-formatted string, and <MESSAGE_ARGS>
+ are its arguments.
+
### PROSE ROUTINES
These routines print to standard output, ande are useful for printing
@@ -104,7 +113,7 @@ For each of these, <MESSAGE> is fed through `gettext` automatically.
These routines print to standard error, and all take arguments in the
same format as `printf`(1), except for `stat_done`, which doesn't take
-any arguments.
+any arguments. Each of these print to stderr, not stdout.
For each of these, <MESSAGE> is fed through `gettext` automatically.
@@ -147,15 +156,16 @@ these, you could end up deleting a lot of someone's work.
* `cleanup` [<EXIT_STATUS>]:
*If* `setup_workdir` has been run, `rm -rf "$WORKDIR"`. If given
- a numeric argument, it will then call `exit`(1) with that argument.
+ a numeric argument, it will then call `exit`(1) with that
+ argument, otherwise it calls `exit`(1) with a status of 0.
* `abort`:
Calls `msg` with the message "Aborting...", then calls
- `cleanup 0`.
+ `cleanup 255`.
* `die` <MESSAGE> [<ARGS>...]:
Exactly like `error`, but calls `cleanup` and calls `exit`(1)
- with a status of 1.
+ with a status of 255.
### LOCKFILE ROUTINES
@@ -178,6 +188,13 @@ these, you could end up deleting a lot of someone's work.
These routines relate to `makepkg`(8).
+ * `find_cached_package` <PKGNAME> <PKGVER>[-<PKGREL] <ARCH>:
+ Searches for a localy built copy of the specified package, in
+ <PKGDEST> and the current working directory. If <PKGREL> is not
+ specified, any value will match. If multiple matching files are
+ found (not counting duplicate links), then an error is printed to
+ stderr and nothing is prented to stdout.
+
* `get_full_version` [<PKGNAME>]:
Inspects variables that are set, and prints the full version
spec, including <epoch> if necessary, <pkgver>, and <pkgrel>. By
@@ -188,12 +205,6 @@ These routines relate to `makepkg`(8).
## BUGS
-libremessages sets <TEXTDOMAIN> to `libretools` unconditionally,
-making it generally unsuitable for use outside of libretools. If you
-override <TEXTDOMAIN> after loading the library, that should work, but
-you will also have to provide translations for libremessage's internal
-messages (such as "ERROR" or "Warning").
-
Generating `.pot` files for the prose functions is a pain. The
libretools Makefiles have rules to do it, but it might make sense to
pull it into a separate program.
@@ -202,9 +213,6 @@ pull it into a separate program.
xterm and rxvt (and their various <TERM> values;
"rxvt-unicode-256color" is still rxvt).
-Also, I think `abort` calling `cleanup 1` would make more sense than
-`cleanup 0`.
-
## SEE ALSO
librelib(7), gettext(1), common.sh(3)
diff --git a/src/librefetch/librefetch b/src/librefetch/librefetch
index 93bcd1e..8b02205 100755
--- a/src/librefetch/librefetch
+++ b/src/librefetch/librefetch
@@ -1,7 +1,9 @@
#!/usr/bin/env bash
# librefetch
#
-# Copyright 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+# Copyright (C) 2013-2014 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This file is part of Parabola.
#
@@ -18,17 +20,17 @@
# You should have received a copy of the GNU General Public License
# along with Parabola. If not, see <http://www.gnu.org/licenses/>.
-. $(librelib conf.sh)
-. libremessages
+. $(librelib conf)
+. $(librelib messages)
+setup_traps
declare -r tempdir="$(mktemp -d --tmpdir ${0##*/}.XXXXXXXXXXX)"
-cleanup() { rm -rf -- "$tempdir"; }
-trap cleanup EXIT
+trap "rm -rf -- $(printf '%q' "$tempdir")" EXIT
cmd=${0##*/}
usage() {
print "Usage: %s [OPTIONS] SOURCE_URL [OUTPUT_FILE]" "$cmd"
- print "Usage: %s -[g|P|V|h]" "$cmd"
+ print "Usage: %s -[g|S|M|h]" "$cmd"
print "Downloads or creates a liberated source tarball."
echo
prose "The default mode is to create OUTPUT_FILE, first by trying
@@ -37,9 +39,12 @@ usage() {
prose "If OUTPUT_FILE isn't specified, it defaults to the non-directory
part of SOURCE_URL, in the current directory."
echo
- prose "In download mode, the glob '*://' is stripped from the beginning
- of SOURCE_URL, and the resulting path is attempted to be
- downloaded from the configured mirror."
+ prose "Unless '-C' is specified, if SOURCE_URL does not begin with a
+ configured mirror, create mode is inhibited."
+ echo
+ prose "In download mode, it simply tries to download SOURCE_URL. At the
+ beginning of a URL, 'libre://' expands to the first configured
+ mirror."
echo
prose "In create mode, it looks at a build script, and uses that to
create the source tarball. SOURCE_URL is ignored, except that it
@@ -48,13 +53,14 @@ usage() {
prose "The default build script is 'PKGBUILD', or 'SRCBUILD' if it
exists."
echo
- prose "Unrecognized options are passed straight to makepkg."
+ prose "Other options, if they are valid \`makepkg\` options, are passed
+ straight to makepkg."
echo
prose "%s does NOT support getopt-style flag combining. You must use
'-a -b', not '-ab'." "$cmd"
echo
print "Example usage:"
- print ' $ %s libre://mypackage-1.0.tar.gz' "$cmd"
+ print ' $ %s https://repo.parabolagnulinux.org/other/mypackage/mypackage-1.0.tar.gz' "$cmd"
echo
print "Options:"
print " Settings:"
@@ -65,7 +71,8 @@ usage() {
directory, it is used instead"
print " Alternate modes:"
flag "-g, --geninteg" "Generage integrity checks for source files"
- flag "-P, --print" "Print the effective build script (SRCBUILD)"
+ flag "-S, --srcbuild" "Print the effective build script (SRCBUILD)"
+ flag "-M, --makepkg" "Print the effective makepkg script"
flag "-h, --help" "Show this message"
}
@@ -74,13 +81,27 @@ main() {
makepkg_opts=()
extra_opts=()
mode=download-create
- parse_options "$@"
+ if ! parse_options "$@"; then
+ usage >&2
+ exit 1
+ fi
# Mode: help ###########################################################
if [[ $mode =~ help ]]; then
usage
- return 0
+ exit 0
+ fi
+
+ ########################################################################
+
+ makepkg="$(modified_makepkg "$(which makepkg)")"
+
+ # Mode: makepkg ########################################################
+
+ if [[ $mode =~ makepkg ]]; then
+ cat "$makepkg"
+ exit 0
fi
########################################################################
@@ -88,70 +109,76 @@ main() {
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)")"
+ if [[ ! -f "$BUILDFILE" ]]; then
+ error "%s does not exist." "$BUILDFILE"
+ exit 1
+ fi
+ case "$BUILDFILE" in
+ */SRCBUILD) srcbuild="$(modified_srcbuild "$BUILDFILE")";;
+ *) srcbuild="$(modified_pkgbuild "$BUILDFILE")";;
+ esac
# 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
+ exit 0
fi
- # Mode: print ##########################################################
+ # Mode: srcbuild #######################################################
- 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
+ if [[ $mode =~ srcbuild ]]; then
cat "$srcbuild"
- return 0
+ exit 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
+ local src="${extra_opts[0]}"
+ local dst="${extra_opts[1]:-${src##*/}}"
+
+ # Don't canonicalize $src unless mode =~ download, and we've validated
+ # that $MIRRORS is configured.
+
+ # Canonicalize $dst
+ dst="$(readlink -m -- "$dst")"
# Mode: download #######################################################
if [[ $mode =~ download ]]; then
load_files librefetch
- check_vars librefetch MIRROR DOWNLOADER || return 1
+ check_vars librefetch MIRRORS DOWNLOADER || exit 1
- local url="${MIRROR}/${src}"
+ # Canonicalize $src
+ if [[ "$src" == libre://* ]]; then
+ src="${MIRRORS[0]}/${src#libre://}"
+ fi
+
+ # check to see if $src is a candidate for create mode
+ local inmirror=false;
+ local mirror
+ for mirror in "${MIRRORS[@]}"; do
+ if [[ "$src" == "$mirror"* ]]; then
+ inmirror=true
+ break
+ fi
+ done
+ if ! $inmirror; then
+ # inhibit create
+ mode=download
+ fi
local dlcmd="${DOWNLOADER}"
- dlcmd="${dlcmd//\%o/\"$dst\"}"
- dlcmd="${dlcmd//\%u/\"$url\"}"
- { eval "$dlcmd"; } >> /dev/stderr && return 0
+ [[ $dlcmd = *%u* ]] || dlcmd="$dlcmd %u"
+ dlcmd="${dlcmd//\%o/\"\$dst\"}"
+ dlcmd="${dlcmd//\%u/\"\$src\"}"
+
+ { eval "$dlcmd"; } >&2 && exit 0
fi
# Mode: create #########################################################
@@ -163,16 +190,23 @@ main() {
export pkg_file=$dst
cd "$BUILDFILEDIR"
- "$makepkg" "${makepkg_opts[@]}" -p "$srcbuild" >> /dev/stderr || return $?
+ "$makepkg" "${makepkg_opts[@]}" -p "$srcbuild" >&2 || exit $?
fi
}
# sets the variables BUILDFILE, makepkg_opts, extra_opts, mode
parse_options() {
- # Detect makepkg options that take a second argument
+ # Detect makepkg options
local makepkg_orig="$(which 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'))
+ # --long flags that take a second argument
+ local makepkg_opt2long=( $(LC_ALL=C "${makepkg_orig}" -h | sed -rn 's/\s*(--\S*) <.*/\1/p'))
+ # -s hort flags that take a second argument
+ local makepkg_opt2short=($(LC_ALL=C "${makepkg_orig}" -h | sed -rn 's/\s*(-.) <.*/\1/p'))
+ # all flags
+ local makepkg_argall=( $(LC_ALL=C "${makepkg_orig}" -h | sed -rn \
+ -e 's/^ +(-.) .*/\1/p' \
+ -e 's/^ +(-.), (--\S*) .*/\1\n\2/p' \
+ -e 's/^ +(--\S*) .*/\1/p'))
local opt
local have_opt
@@ -193,19 +227,43 @@ parse_options() {
-C) mode=create;;
-D) mode=download;;
-g|--geninteg) mode=checksums;;
- -P|--print) mode=print;;
+ -S|--srcbuild) mode=srcbuild;;
+ -M|--makepkg) mode=makepkg;;
-p) BUILDFILE="$(readlink -m -- "$opt")";;
-h|--help) mode=help;;
+ --) shift; break;;
-*)
- makepkg_opts+=("$arg")
- $have_opt && makepkg_opts+=("$opt")
+ if in_array "${arg}" "${makepkg_argall[@]}"; then
+ makepkg_opts+=("$arg")
+ $have_opt && makepkg_opts+=("$opt")
+ else
+ print '%s: invalid flag: %s' "$cmd" "$arg"
+ return 1
+ fi
;;
- --) shift; break;;
*) extra_opts+=("$arg");;
esac
shift
done
extra_opts+=("$@")
+
+ # check the number of extra_opts
+ case "$mode" in
+ help) # don't worry about it
+ :;;
+ checksums|srcbuild|makepkg) # don't take any extra arguments
+ if [[ ${#extra_opts[@]} != 0 ]]; then
+ print "%s: found extra non-flag arguments: %s" "$cmd" "${extra_opts[*]}" >&2
+ return 1
+ fi
+ ;;
+ *download*|*create*) # take 1 or 2 extra arguments
+ if [[ ${#extra_opts[@]} != 1 ]] && [[ ${#extra_opts[@]} != 2 ]]; then
+ print "%s: %d non-flag arguments found, expected 1 or 2: %s" "$cmd" ${#extra_opts[@]} >&2
+ return 1
+ fi
+ ;;
+ esac
}
# Modify makepkg ###############################################################
@@ -215,20 +273,27 @@ 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
+ # This is long/gross. What it does:
+ # - pass --format=ustar to bsdtar, to inhibit it using the pax format
+ # - take the files that would be included in the tarball, and use
+ # find/sort/xargs to order them before passing them to bsdtar
+ s/bsdtar(.*) - ([^|]*) \|/find \2 -print0 | LC_ALL=C sort --zero-terminated | bsdtar --null --files-from - --format=ustar --no-recursion \1 - |/
s/create_signature .*/&; return $?/ # do not procede to create symlinks
}
/tidy_install\(\) \{/,/^\}$/ {
- /for .*PURGE_TARGETS/itidy_install_purge
+ /for .*PURGE_TARGETS/itidy_install_purge
/for .*PURGE_TARGETS/,/done/d
- /^\}$/ifind . -exec touch --date="1990-01-01 0:0:0 +0" {} +
+ /^\}$/ifind . -exec touch --no-dereference --date="1990-01-01 0:0:0 +0" -- {} +
}
/download_sources\(\) \{/ {
arm -rf "$srcdir"\nmkdir "$srcdir"
}
+s|Making package:|Making source:|
+s:Checking (run|build)time dependencies\.\.\.:Checking source dependencies...:
+
s|srcdir=.*|&-libre|
s|pkgdirbase=.*|&-libre|
s|check_build_status$|:|
diff --git a/src/librefetch/librefetch.8.ronn b/src/librefetch/librefetch.8.ronn
index c2b8ffe..6ee3ce8 100644
--- a/src/librefetch/librefetch.8.ronn
+++ b/src/librefetch/librefetch.8.ronn
@@ -3,32 +3,41 @@ librefetch(8) -- downloads or creates a liberated source tarball
## SYNOPSIS
-`librefetch` [options] <source-url> [<output-file>]<br>
-`librefetch` -[g|V|h]
+`librefetch` [<OPTIONS>] <SOURCE-URL> [<OUTPUT-FILE>]<br>
+`librefetch` `-`[`g`|`S`|`M`|`h`]
## DESCRIPTION
`librefetch` is a program to streamline creation of custom source
tarballs for `PKGBUILD(5)` files.
-To automatically use `librefetch` to download or create a source
-tarball, you can add `libre://FILENAME.tar.gz` to the source array in
-your `PKGBUILD`. This works because a post-install script for the
-package adds `librefetch` as a download agent for `libre://` to
-`makepkg.conf`. Because of this, it is almost never necessary to call
-`librefetch` manually.
+If a URL mentioned in the <source> array in a `PKGUILD` is in a
+location that Parabola uploads "custom" source tarballs to (or
+configured locations), and no file is at that URL, librefetch will
+automatically create it for you.
-There are 7 modes:
+This works because a post-install script for the package configures
+`librefetch` as the download agent for `https://` URLs in
+`makepkg.conf`; allowing it to jump in and create a file if need be.
+Because of this, it is almost never necessary to call `librefetch`
+manually.
+
+The post-install script also configures `librefetch` as the download
+agent for `libre://` URLs, for compatability with PKGBUILDs that used
+a previous version of librefetch.
+
+There are 5 modes:
- * `download-create`: The default mode. First try `download` mode,
- then `create` mode.
* `download`: Download the tarball from the configured mirror.
* `create`: Create the tarball from a `PKGBUILD`/`SRCBUILD`.
* `checksums`: Generate integrity checks for source files.
- * `print`: Print the effective build script.
- * `version`: Print `librefetch` version information.
+ * `srcbuild`: Print the effective build script.
+ * `makepkg`: Print the effective makepkg script.
* `help`: Print `librefetch` usage information.
+The normal mode of operation is `download` mode. If `download` mode
+fails, it may choose to try `create` mode.
+
## OPTIONS
* `-C`: Force `create` mode (don't download)
@@ -38,20 +47,43 @@ There are 7 modes:
directory, it is used instead.
* `-g` | `--geninteg`: Use `checksums` mode: Generate integrity
checks for source files.
- * `-P` | `--print`: Use `print` mode: print the effective build script.
- * `-V` | `--version`: Use `version` mode: Show version information.
+ * `-S` | `--srcbuild`: Use `srcbuild` mode: print the effective build
+ script.
+ * `-M` | `--makepkg`: Use `makepkg` mode: print the effective makepkg
+ script.
* `-h` | `--help`: Use `help` mode: Show useage information.
+Other options, if they are documented in `makepkg -h`, are passed to
+the modified copy of makepkg created during `create` mode.
+
+## DOWNLOAD MODE
+
+If <SOURCE-URL> begins with the string `libre://`, it is replaced with
+the first value in <MIRRORS>, as configured in `librefetch.conf(5)`;
+this is for compatability with PKGBUILDs that used a previous version
+of librefetch.
+
+It uses <DOWNLOADER>, as configured in `librefetch.conf` to attempt to
+download the source tarball from that URL. If that fails, and
+following conditions are met, it proceeds to `create` mode:
+
+ * The `-D` flag has not been specified to inhibit `create` mode.
+ * The <SOURCE-URL> begins with one of the values in <MIRRORS>.
+
+The latter requirement allows librefetch to be used as a generic
+HTTP(S) download agent, that can automatically create files from
+whitelisted locations.
+
## CREATE MODE
The principle of `create` mode is that a special `PKGBUILD(5)`, called
-a `SRCBUILD(5)`, installs source files to `$pkgdir`, and the resulting
-"package" is then used as a source tarball. The `SRCBUILD` exists in
-the same directory as the `PKGBUILD`. It can be created manually, or
-generated on-the-fly from the `PKGBUILD`. Extra steps are taken to
-ensure that as long as the same directory contents go in, an identical
-tarball will come out--the checksum of the file should not change
-based on when it is built or who builds it.
+`SRCBUILD(5)`, that installs source files to <$pkgdir>, and the
+resulting "package" is then used as a source tarball. The `SRCBUILD`
+exists in the same directory as the `PKGBUILD`. It can be created
+manually, or generated on-the-fly from the `PKGBUILD`. Extra steps
+are taken to ensure that as long as the same directory contents go in,
+an identical tarball will come out--the checksum of the file should
+not change based on when it is built or who builds it.
The `SRCBUILD` is either created, or sanitized if it already exists,
then fed to a modified version of `makepkg(8)`.
@@ -68,19 +100,19 @@ remain intact.
As explained in the `CREATE MODE` section, in `create` mode, this
program generates an `SRCBUILD` file. For debugging purposes, this
-file can be printed instead of executed with `print` mode.
+file can be printed instead of executed with `srcbuild` mode.
### PRE-EXISTING SRCBUILD
The use of `SRCBUILD` files pre-dates `librefetch`. By convention,
-they set `PKGDEST` and `PKGEXT` in `package()` in order to modify the
+they set <PKGDEST> and <PKGEXT> in `package()` in order to modify the
behavior of `makepkg`. Because a modified version of `makepkg` is
used, this interferes with the correct behavior. To compensate for
this, lines containing "`PKGDEST=`" or "`PKGEXT=`" are deleted from
the `SRCBUILD`.
The general idea is that `build()` makes any modifications to the
-source, then `package()` copies it from `$srcdir` to `$pkgdir`.
+source, then `package()` copies it from <$srcdir> to <$pkgdir>.
### SRCBUILD FROM PKGBUILD
@@ -106,31 +138,32 @@ Following is a table of the translations.
makedepends = mkdepends
Functions
prepare() { :; }
- build() { mksource; }
- check() { :; }
+ build() { mksource; }
+ check() { :; }
package() { cp -a "$srcdir"/*/ "$pkgdir/"; }
The `mksource()` function does not need to be defined. If it isn't
defined, then no transformations will be made to the source between it
-being extracted to `$srcdir` and copied to `$pkgdir`.
+being extracted to <$srcdir> and copied to <$pkgdir>.
In summary:
- * Set `mksource=()` and `mkmd5sums=(`) to act as `source=(`) and
- `md5sums=()`
+ * Set <mksource=()> and <mkmd5sums=()> to act as <source=()> and
+ <md5sums=()>, respectively.
* Declare a `mksource()` function to make modifications to the
source, if nescessary.
Other changes:
- * `pkgname` is set to `pkgbase`, or the first element of the
- `pkgname` array.
- * `options=()` is set have `makepkg` avoid making changes to
- `$pkgdir`. The exact change is:
+ * <pkgname> is set to <pkgbase>, or the first element of the
+ <pkgname> array (the effect is that split packaging is turnes
+ off).
+ * <options=()> is set have `makepkg` avoid making changes to
+ <$pkgdir>. The exact change is:
options=(!strip docs libtool staticlibs emptydirs !zipman purge !upx)
- * `PURGE_TARGETS=()` has vcs directories added to it:
+ * <PURGE_TARGETS=()> has vcs directories added to it:
PURGE_TARGETS=(.bzr/ .cvs/ .git/ .hg/ .svn/ .makepkg/)
@@ -138,20 +171,27 @@ Other changes:
The following modifications are made to makepkg:
- * Allow us to manipulate the output file (`$pkg_file`)
- * Do not include metadata in the output file (`${comp_files[@]}`)
+ * Allow us to manipulate the output file (<$pkg_file>)
+ * Do not include metadata in the output file (<${comp_files[@]}>)
* Force 'ustar' tar format, don't allow it to upgrade to 'pax' to
store extended file attributes.
* Don't symlink the resulting file into the current directory.
- * `PURGE_TARGETS` interprets an item as a directory if it ends with a
+ * <PURGE_TARGETS> interprets an item as a directory if it ends with a
slash ("/").
- * Timestamps in `$pkgdir` are reset to "1990-01-01 0:0:0 +0", so that
+ * Timestamps in <$pkgdir> are reset to "1990-01-01 0:0:0 +0", so that
the resulting tarball will be the same, regardless of when it was
created.
- * append `-libre` to `$srcdir`
- * append `-libre` to `$pkgbasedir` (which becomes `$pkgdir`)
+ * Sort the files included in the tarball; normally the order of files
+ in a tarball is essentially random (even if it tends to be the same
+ when re-created on the same machine).
+ * append `-libre` to <$srcdir>
+ * append `-libre` to <$pkgbasedir> (which becomes <$pkgdir>)
* Don't check if the package has already been built.
+For debugging purposes, this modified makepkg can be printed instead
+of executed with `makepkg` mode. Before it is run in create mode,
+`PKGEXT`, `PKGDEST`, and `pkg_file` are set as environment variables.
+
## CONFIGURATION
See `librefetch.conf(5)` for details on configuring librefetch using
diff --git a/src/librefetch/librefetch.conf b/src/librefetch/librefetch.conf
index ce328d8..6948e8d 100644
--- a/src/librefetch/librefetch.conf
+++ b/src/librefetch/librefetch.conf
@@ -1,2 +1,5 @@
-MIRROR='https://repo.parabolagnulinux.org/other/'
+MIRRORS=(
+ 'https://repo.parabolagnulinux.org/sources/'
+ 'https://repo.parabolagnulinux.org/other/'
+)
DOWNLOADER='/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
diff --git a/src/librefetch/librefetch.conf.5.ronn b/src/librefetch/librefetch.conf.5.ronn
index 4e59877..6158104 100644
--- a/src/librefetch/librefetch.conf.5.ronn
+++ b/src/librefetch/librefetch.conf.5.ronn
@@ -24,13 +24,19 @@ If `$XDG_CONFIG_HOME` is not set, a default value is set:
## OPTIONS
- * `MIRROR='https://repo.parabolagnulinux.org/other/'`:
- The location to download pre-built source tarball in download
- mode.
+ * `MIRRORS=( ... )`:
+ A list of locations that generated source tarballs may be located
+ at. If a URL begins with `libre://`, then `libre://` is replaced
+ with the first location listed here.
* `DOWNLOADER='/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'`:
The HTTP client to use when downloading pre-built source tarballs
- in download mode.
+ in download mode. The format and semantics are similar to
+ `DLAGENTS` in `makepkg.conf`(5). If present, `%u` will be replaced
+ with the download URL (correctly quoted), otherwise the download
+ URL will be appended to the end of the command. If present, `%o`
+ will be replaced with the local filename that it should be
+ downloaded to.
## SEE ALSO
-librefetch(8)
+librefetch(8), makepkg.conf(5)
diff --git a/src/libretools.conf b/src/libretools.conf
index ff989f0..12c4392 100644
--- a/src/libretools.conf
+++ b/src/libretools.conf
@@ -37,7 +37,7 @@ ABSLIBRESEND=ssh://git@projects.parabolagnulinux.org:1863/srv/git/abslibre.git
## Where to upload packages to
# '/staging/' is appended; this is for compatability with previous versions.
-REPODEST=repo@repo:/srv/http/repo/staging-$LIBREUSER
+REPODEST=repo@repo:/srv/http/repo/staging/$LIBREUSER
## Assumes something similar in your .ssh/config:
# Host repo
# Port 1863
@@ -48,22 +48,21 @@ HOOKPRERELEASE="ssh -fN ${REPODEST%%:*}"
HOOKPOSTRELEASE="sudo librechroot clean-repo"
################################################################################
-# fullpkg/treepkg #
+# dagpkg/fullpkg/treepkg #
################################################################################
-# Note: fullpkg accepts HOOK* settings not being set, treepkg requires them to
-# be set.
+# Note: Not being set is valid for any of the HOOK* settings.
+# Run a command to modify ./PKGBUILD before building
# NOTE: fullpkg ONLY
#HOOKPKGBUILDMOD="mips-add"
-# Run a command before running FULLBUILDCMD, usually to cleanup uneeded packages
-# Note: Recent versions of libremakepkg run chcleanup for you.
-# NOTE: treepkg ONLY
-HOOKPREBUILD=":"
-#HOOKPREBUILD="chcleanup"
+# Run a command before running FULLBUILDCMD
+# NOTE: IGNORED by fullpkg
+#HOOKPREBUILD=""
## Uncomment one of those or make one of your choice
+# NOTE: fullpkg passes this to eval(1bash), where the others run it directly.
# Normal
FULLBUILDCMD="sudo libremakepkg"
# Cross compiling
diff --git a/src/mips64el-tools/add-mips64el b/src/mips64el-tools/add-mips64el
index 17b167b..bb1bb69 100755
--- a/src/mips64el-tools/add-mips64el
+++ b/src/mips64el-tools/add-mips64el
@@ -1,6 +1,23 @@
#!/usr/bin/env bash
# Change all arch array that aren't any or mips64el already
+# Copyright (C) 2011 Nicolás Reynolds <fauno@parabola.nu>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
find -name 'PKGBUILD' -exec sed -i "s/^\(arch=([^)anym]\+\))/\1 'mips64el')/" '{}' \;
exit $?
diff --git a/src/mips64el-tools/librebasebuilder b/src/mips64el-tools/librebasebuilder
index 6b8c8bb..34c1027 100755
--- a/src/mips64el-tools/librebasebuilder
+++ b/src/mips64el-tools/librebasebuilder
@@ -1,6 +1,9 @@
#!/usr/bin/env bash
# -*- coding: utf-8 -*-
-# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+
+# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+#
+# License: GNU GPLv3+
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
diff --git a/src/mips64el-tools/mips-add b/src/mips64el-tools/mips-add
index 402036e..ef708ec 100755
--- a/src/mips64el-tools/mips-add
+++ b/src/mips64el-tools/mips-add
@@ -1,4 +1,21 @@
#!/usr/bin/env bash
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
. libremessages
if ! grep mips64el PKGBUILD >/dev/null; then # Add mips64el in ${arch} array if it isn't 'any'
warning "Adding mips64el arch"
diff --git a/src/mips64el-tools/mipsrelease b/src/mips64el-tools/mipsrelease
index ffa223d..fec2a1b 100755
--- a/src/mips64el-tools/mipsrelease
+++ b/src/mips64el-tools/mipsrelease
@@ -1,9 +1,26 @@
#!/usr/bin/env bash
-# Lic: GPLv3+
-# Author: Nicolas Reynolds <fauno@kiwwwi.com.ar>
# Local release of mips64el packages + clean ABS sync
# Called by HOOKLOCALRELEASE
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
# $1 repo
# $2+ packages
@@ -37,7 +54,7 @@ main() {
# Get all needed sources
load_PKGBUILD
pkgs=()
- makepkg --source -f --skippgpcheck
+ makepkg --source -f --skippgpcheck -c
msg "Adding packages to [stage3]..."
for name in "${pkgname[@]}"; do
diff --git a/src/pkgbuild-check-nonfree b/src/pkgbuild-check-nonfree
index 18fac91..11eaf42 100755
--- a/src/pkgbuild-check-nonfree
+++ b/src/pkgbuild-check-nonfree
@@ -2,11 +2,12 @@
# -*- tab-width: 4 ; sh-basic-offset: 4 -*-
# pkgbuild-check-nonfree
-# Copyright 2010 Haase Hernández
-# Copyright 2010 Joseph Graham
-# Copyright 2010 Joshua Ismael
-# Copyright 2010 Nicolás Reynolds
-# Copyright 2012-2013 Luke Shumaker
+# Copyright (C) 2011 Joseph Graham (Xylon) <joe@t67.eu>
+# Copyright (C) 2010-2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2010-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012-2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This file is part of Parabola.
#
diff --git a/src/pkgbuild-summarize-nonfree b/src/pkgbuild-summarize-nonfree
index 7b005d5..cf3be28 100755
--- a/src/pkgbuild-summarize-nonfree
+++ b/src/pkgbuild-summarize-nonfree
@@ -1,4 +1,22 @@
#!/bin/bash
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# 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 <http://www.gnu.org/licenses/>.
. $(librelib messages)
diff --git a/src/repo-diff b/src/repo-diff
new file mode 100755
index 0000000..e36edad
--- /dev/null
+++ b/src/repo-diff
@@ -0,0 +1,75 @@
+#!/usr/bin/env bash
+# Shows a diff between repo databases
+
+# Copyright (C) 2013 Nicolás Reynolds <fauno@parabola.nu>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. libremessages
+
+usage() {
+ print "Usage: %s arch/core/i686 parabola/core/i686" "${0##*/}"
+ print "Compares two repo databases using distro/repo/architecture format."
+ echo
+ print 'Shortcuts:'
+ flag 'arch' 'expands to Arch Linux repo url'
+ flag 'parabola' 'expands to Parabola GNU/Linux-libre repo url'
+}
+
+if test $# -eq 0; then
+ usage
+ exit 0
+fi
+
+b() { bsdtar ztf $1 | cut -d "/" -f1 | sort -u ; }
+n() { echo "$1".db | tr "/" "-"; }
+
+# hopefully simple way to convert
+# parabola/libre/i686
+# to
+# http://repo.parabolagnulinux.org/libre/os/i686/libre.db
+# add more distros here
+g() {
+ echo "$1" | sed -e "s,^\([^/]\+\)/\([^/]\+\)/\([^/]\+\)$,\1/\2/os/\3/\2.db," \
+ -e "s,^parabola/,http://repo.parabolagnulinux.org/," \
+ -e "s,^arch\(linux\)\?/,http://mirrors.kernel.org/archlinux/,"
+}
+
+mkdir ${0##*/}.$$
+pushd ${0##*/}.$$ >/dev/null
+
+d=""
+for i in $1 $2; do
+ n=$(n "$i")
+
+ test -z "$n" && exit 1
+
+ wget -O "$n" -nv $(g "$i")
+ b "$n" >${n}.orig
+
+ d+=" ${n}.orig"
+done
+
+{
+ printf "$(gettext "Difference between %s and %s")\n---\n" $1 $2
+ which diffstat &>/dev/null && diff -auN "${d[@]}" | diffstat
+ diff -auN "${d[@]}"
+} >../${n}.diff
+
+popd >/dev/null
+rm -r ${0##*/}.$$
+
+print "Difference save on %s" "${n}.diff"
diff --git a/src/toru/toru b/src/toru/toru
index 3c45efd..142e9e4 100755
--- a/src/toru/toru
+++ b/src/toru/toru
@@ -1,6 +1,25 @@
#!/usr/bin/env bash
# Queries the ABS
-# License: GPL3
+
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2011 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+# Copyright (C) 2012-2013 Michał Masłowski <mtjm@mtjm.eu>
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
## TODO
# * Add license text
diff --git a/src/toru/toru-info b/src/toru/toru-info
index d73d2ad..a427050 100755
--- a/src/toru/toru-info
+++ b/src/toru/toru-info
@@ -1,5 +1,23 @@
#!/usr/bin/env bash
# Prints info about a given pkgname
+
+# Copyright (C) 2012 Nicolás Reynolds <fauno@parabola.nu>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
. libremessages
. $(librelib conf)
diff --git a/src/toru/toru-path b/src/toru/toru-path
index 6c86e88..32ddc24 100755
--- a/src/toru/toru-path
+++ b/src/toru/toru-path
@@ -1,5 +1,23 @@
#!/usr/bin/env bash
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
source toru-utils
TORUPATH=${T:-${TORUPATH}}
diff --git a/src/toru/toru-utils b/src/toru/toru-utils
index 96aa35e..164f418 100755
--- a/src/toru/toru-utils
+++ b/src/toru/toru-utils
@@ -1,5 +1,23 @@
#!/usr/bin/env bash
+# Copyright (C) 2011-2012 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2012 Joshua Ismael Haase Hernández (xihh) <hahj87@gmail.com>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
. libremessages
. $(librelib conf.sh)
load_files libretools
diff --git a/src/toru/toru-where b/src/toru/toru-where
index 4b3ff1b..e70d135 100755
--- a/src/toru/toru-where
+++ b/src/toru/toru-where
@@ -1,5 +1,23 @@
#!/usr/bin/env bash
# Locates a PKGBUILD dir on toru's path cache
+
+# Copyright (C) 2012 Nicolás Reynolds <fauno@parabola.nu>
+#
+# License: GNU GPLv3+
+#
+# This program 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.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
. $(librelib conf.sh)
load_files libretools
check_vars libretools TORUPATH || exit 1
diff --git a/src/treepkg b/src/treepkg
index e509dac..9d3c0c3 100755
--- a/src/treepkg
+++ b/src/treepkg
@@ -1,6 +1,9 @@
#!/usr/bin/env bash
-#set -x
-# (c) 2012 Nicolás Reynolds <fauno@parabola.nu>
+
+# Copyright (C) 2012-2013 Nicolás Reynolds <fauno@parabola.nu>
+# Copyright (C) 2013 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# License: GNU GPLv3+
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,10 +22,12 @@ source libremessages
source $(librelib conf.sh)
load_files libretools
-check_vars libretools HOOKPREBUILD FULLBUILDCMD HOOKLOCALRELEASE || exit 1
+check_vars libretools FULLBUILDCMD || exit 1
+# The following variables are actually optional
+#check_vars libretools HOOKPREBUILD HOOKLOCALRELEASE || exit 1
load_files makepkg
-term_title "$(basename $0)"
+term_title "${0##*/}"
# End inmediately but print an useful message
trap_exit() {
@@ -114,6 +119,7 @@ BUILD=${B:-true}
CLEANUP=${C:-true}
# Skip BUILDORDER creation and build anything on BUILDDIR
BUILDNOW=${N:-false}
+IGNORE=(${I})
if [[ ! -z $1 ]] && [[ $DEPTH -eq 0 ]]; then
BUILDNOW=true
@@ -125,6 +131,12 @@ if ! ${BUILDNOW}; then
# If this package is already built quit silently
for _pkg in "${pkgname[@]}"; do
+
+ if in_array "${_pkg}" "${IGNORE[@]}"; then
+ add_order "ignore"
+ exit 0
+ fi
+
if is_built "${_pkg}" "$(get_full_version ${_pkg})"; then
add_order "ignore"
exit 0
@@ -198,11 +210,16 @@ if [[ ${DEPTH} -eq 0 ]]; then
pushd "${BUILDDIR}/${_pkg}" >/dev/null
sudo -E pacman -Syu --noconfirm
- ${HOOKPREBUILD}
+ if [[ -n "${HOOKPREBUILD:-}" ]]; then
+ ${HOOKPREBUILD}
+ fi
${FULLBUILDCMD}
+
# Run local release hook with $1 = $repo
- ${HOOKLOCALRELEASE} $(egrep ";${_pkg#*_};" "${BUILDORDER}" | cut -d';' -f6)
+ if [[ -n "${HOOKLOCALRELEASE:-}" ]]; then
+ ${HOOKLOCALRELEASE} $(egrep ";${_pkg#*_};" "${BUILDORDER}" | cut -d';' -f6)
+ fi
touch built_ok
popd >/dev/null