diff options
author | Luke Shumaker <LukeShu@sbcglobal.net> | 2012-11-28 19:15:36 -0500 |
---|---|---|
committer | Luke Shumaker <LukeShu@sbcglobal.net> | 2012-11-28 19:15:36 -0500 |
commit | 0cd3fa6722a0b7bd8fd959172c697cc3daec3952 (patch) | |
tree | 67d221e71b780af4d326d264ed739ddbffa3b6de | |
parent | 7a60fbf538ec67f810c329f52b4375fd54a513d1 (diff) |
rm makechrootpkg, mv {mk,}archroot
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | bash_completion.in | 21 | ||||
-rw-r--r-- | makechrootpkg.in | 306 | ||||
-rw-r--r-- | zsh_completion.in | 14 |
4 files changed, 5 insertions, 342 deletions
@@ -8,9 +8,7 @@ BINPROGS = \ finddeps \ lddd -SBINPROGS = \ - mkarchroot \ - makechrootpkg +SBINPROGS= SHAREFILES = \ lib/common.sh @@ -38,8 +36,8 @@ install: install -m0755 ${SBINPROGS} $(DESTDIR)$(PREFIX)/sbin install -m0644 ${SHAREFILES} $(DESTDIR)$(PREFIX)/share/devtools + install -m0755 mkarchroot $(DESTDIR)$(PREFIX)/sbin/archroot ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides - ln -sf mkarchroot $(DESTDIR)$(PREFIX)/sbin/archroot install -Dm0644 bash_completion $(DESTDIR)$(PREFIX)/share/bash-completion/completions/devtools install -Dm0644 zsh_completion $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools diff --git a/bash_completion.in b/bash_completion.in index 33e232a..5e4fe66 100644 --- a/bash_completion.in +++ b/bash_completion.in @@ -1,24 +1,5 @@ #!/bin/bash -_makechrootpkg() { - local cur - COMPREPLY=() - _get_comp_words_by_ref cur - - case $cur in - -*) - COMPREPLY=( $( compgen -W '-I -c -d -h -l -r -u' -- "$cur" ) ) - ;; - *) - _filedir - return 0 - ;; - esac - - true -} && -complete -F _makechrootpkg makechrootpkg - _mkarchroot() { local cur COMPREPLY=() @@ -36,7 +17,7 @@ _mkarchroot() { true } && -complete -F _mkarchroot mkarchroot +complete -F _mkarchroot archroot # ex:et ts=2 sw=2 ft=sh diff --git a/makechrootpkg.in b/makechrootpkg.in deleted file mode 100644 index 05286c6..0000000 --- a/makechrootpkg.in +++ /dev/null @@ -1,306 +0,0 @@ -#!/bin/bash -# 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. - -m4_include(lib/common.sh) - -shopt -s nullglob - -makepkg_args='-s --noconfirm -L' -repack=false -update_first=false -clean_first=false -install_pkg= -add_to_db=false -run_namcap=false -chrootdir= -passeddir= - -default_copy=$USER -[[ -n $SUDO_USER ]] && default_copy=$SUDO_USER -[[ -z $default_copy || $default_copy = root ]] && default_copy=copy -src_owner=${SUDO_USER:-$USER} - -usage() { - echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]" - echo ' Run this script in a PKGBUILD dir to build a package inside a' - echo ' clean chroot. All unrecognized arguments passed to this script' - echo ' will be passed to makepkg.' - echo '' - echo ' The chroot dir consists of the following directories:' - echo ' <chrootdir>/{root, copy} but only "root" is required' - echo ' by default. The working copy will be created as needed' - echo '' - echo 'The chroot "root" directory must be created via the following' - echo 'command:' - echo ' mkarchroot <chrootdir>/root base base-devel sudo' - echo '' - echo "Default makepkg args: $makepkg_args" - echo '' - echo 'Flags:' - echo '-h This help' - echo '-c Clean the chroot before building' - echo '-u Update the working copy of the chroot before building' - echo ' This is useful for rebuilds without dirtying the pristine' - echo ' chroot' - echo '-d Add the package to a local db at /repo after building' - echo '-r <dir> The chroot dir to use' - echo '-I <pkg> Install a package into the working copy of the chroot' - echo '-l <copy> The directory to use as the working copy of the chroot' - echo ' Useful for maintaining multiple copies.' - echo " Default: $default_copy" - echo '-n Run namcap on the package' - exit 1 -} - -while getopts 'hcudr:I:l:n' arg; do - case "$arg" in - h) usage ;; - c) clean_first=true ;; - u) update_first=true ;; - d) add_to_db=true ;; - r) passeddir="$OPTARG" ;; - I) install_pkg="$OPTARG" ;; - l) copy="$OPTARG" ;; - n) run_namcap=true; makepkg_args="$makepkg_args -i" ;; - *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; - esac -done - -# Canonicalize chrootdir, getting rid of trailing / -chrootdir=$(readlink -e "$passeddir") - -if [[ ${copy:0:1} = / ]]; then - copydir=$copy -else - [[ -z $copy ]] && copy=$default_copy - copydir="$chrootdir/$copy" -fi - -# Pass all arguments after -- right to makepkg -makepkg_args="$makepkg_args ${*:$OPTIND}" - -# See if -R was passed to makepkg -for arg in ${*:$OPTIND}; do - if [[ $arg = -R ]]; then - repack=true - break - fi -done - -if (( EUID )); then - die 'This script must be run as root.' -fi - -if [[ ! -f PKGBUILD && -z $install_pkg ]]; then - die 'This must be run in a directory containing a PKGBUILD.' -fi - -if [[ ! -d $chrootdir ]]; then - die "No chroot dir defined, or invalid path '$passeddir'" -fi - -if [[ ! -d $chrootdir/root ]]; then - die "Missing chroot dir root directory. Try using: mkarchroot $chrootdir/root base base-devel sudo" -fi - -umask 0022 - -# Lock the chroot we want to use. We'll keep this lock until we exit. -# Note this is the same FD number as in mkarchroot -lock_open_write 9 "$copydir.lock" "Locking chroot copy '$copy'" - -if [[ ! -d $copydir ]] || $clean_first; then - # Get a read lock on the root chroot to make - # sure we don't clone a half-updated chroot - lock_open_read 8 "$chrootdir/root.lock" "Locking clean chroot" - - stat_busy 'Creating clean working copy' - use_rsync=false - if type -P btrfs >/dev/null; then - [[ -d $copydir ]] && btrfs subvolume delete "$copydir" &>/dev/null - btrfs subvolume snapshot "$chrootdir/root" "$copydir" &>/dev/null || - use_rsync=true - else - use_rsync=true - fi - - if $use_rsync; then - mkdir -p "$copydir" - rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir" - fi - stat_done - - # Drop the read lock again - lock_close 8 -fi - -if [[ -n $install_pkg ]]; then - pkgname="${install_pkg##*/}" - cp "$install_pkg" "$copydir/$pkgname" - - mkarchroot -r "pacman -U /$pkgname --noconfirm" "$copydir" - ret=$? - - rm "$copydir/$pkgname" - - # Exit early, we've done all we need to - exit $ret -fi - -$update_first && mkarchroot -u "$copydir" - -mkdir -p "$copydir/build" - -# Remove anything in there UNLESS -R (repack) was passed to makepkg -$repack || rm -rf "$copydir"/build/* - -# Read .makepkg.conf and .gnupg/pubring.gpg even if called via sudo -if [[ -n $SUDO_USER ]]; then - SUDO_HOME="$(eval echo ~$SUDO_USER)" - makepkg_conf="$SUDO_HOME/.makepkg.conf" - if [[ -r "$SUDO_HOME/.gnupg/pubring.gpg" ]]; then - install -D "$SUDO_HOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg" - fi -else - makepkg_conf="$HOME/.makepkg.conf" - if [[ -r "$HOME/.gnupg/pubring.gpg" ]]; then - install -D "$HOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg" - fi -fi - -# Get SRC/PKGDEST from makepkg.conf -if [[ -f $makepkg_conf ]]; then - eval $(grep '^SRCDEST=' "$makepkg_conf") - eval $(grep '^PKGDEST=' "$makepkg_conf") - eval $(grep '^MAKEFLAGS=' "$makepkg_conf") - eval $(grep '^PACKAGER=' "$makepkg_conf") -fi - -[[ -z $SRCDEST ]] && eval $(grep '^SRCDEST=' /etc/makepkg.conf) -[[ -z $PKGDEST ]] && eval $(grep '^PKGDEST=' /etc/makepkg.conf) -[[ -z $MAKEFLAGS ]] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) -[[ -z $PACKAGER ]] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) - -# Use PKGBUILD directory if PKGDEST or SRCDEST don't exist -[[ -d $PKGDEST ]] || PKGDEST=. -[[ -d $SRCDEST ]] || SRCDEST=. - -mkdir -p "$copydir/pkgdest" -if ! grep -q 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf"; then - echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf" -fi - -mkdir -p "$copydir/srcdest" -if ! grep -q 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf"; then - echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf" -fi - -if [[ -n $MAKEFLAGS ]]; then - sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" - echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" -fi - -if [[ -n $PACKAGER ]]; then - sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf" - echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf" -fi - -# Set target CARCH as it might be used within the PKGBUILD to select correct sources -eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf") -export CARCH - -# Copy PKGBUILD and sources -cp PKGBUILD "$copydir/build/" -( - source PKGBUILD - for file in "${source[@]}"; do - file="${file%%::*}" - file="${file##*://*/}" - if [[ -f $file ]]; then - cp "$file" "$copydir/srcdest/" - elif [[ -f $SRCDEST/$file ]]; then - cp "$SRCDEST/$file" "$copydir/srcdest/" - fi - done - - # Find all changelog and install files, even inside functions - for i in 'changelog' 'install'; do - while read -r file; do - # evaluate any bash variables used - eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\" - [[ -f $file ]] && cp "$file" "$copydir/build/" - done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) - done -) - -chown -R nobody "$copydir"/{build,pkgdest,srcdest} - -cat > "$copydir/etc/sudoers.d/nobody-pacman" <<EOF -Defaults env_keep += "HOME" -nobody ALL = NOPASSWD: /usr/bin/pacman -EOF -chmod 440 "$copydir/etc/sudoers.d/nobody-pacman" - -# This is a little gross, but this way the script is recreated every time in the -# working copy -cat >"$copydir/chrootbuild" <<EOF -#!/bin/bash -. /etc/profile -export HOME=/build - -cd /build -sudo -u nobody ${MAKEPKG:-makepkg} $makepkg_args || touch BUILD_FAILED - -[[ -f BUILD_FAILED ]] && exit 1 - -if $run_namcap; then - pacman -S --needed --noconfirm namcap - for pkgfile in /build/PKGBUILD /pkgdest/*.pkg.tar.?z; do - echo "Checking \${pkgfile##*/}" - sudo -u nobody namcap "\$pkgfile" 2>&1 | tee "/build/\${pkgfile##*/}-namcap.log" - done -fi - -exit 0 -EOF -chmod +x "$copydir/chrootbuild" - -if mkarchroot -r "/chrootbuild" "$copydir"; then - for pkgfile in "$copydir"/pkgdest/*.pkg.tar.?z; do - if $add_to_db; then - mkdir -p "$copydir/repo" - pushd "$copydir/repo" >/dev/null - cp "$pkgfile" . - repo-add repo.db.tar.gz "${pkgfile##*/}" - popd >/dev/null - fi - - chown "$src_owner" "$pkgfile" - mv "$pkgfile" "$PKGDEST" - done - - for l in "$copydir"/build/*-{build,check,namcap,package,package_*}.log; do - chown "$src_owner" "$l" - [[ -f $l ]] && mv "$l" . - done -else - # Just in case. We returned 1, make sure we fail - touch "$copydir/build/BUILD_FAILED" -fi - -for f in "$copydir"/srcdest/*; do - chown "$src_owner" "$f" - mv "$f" "$SRCDEST" -done - -if [[ -e $copydir/build/BUILD_FAILED ]]; then - rm "$copydir/build/BUILD_FAILED" - die "Build failed, check $copydir/build" -fi diff --git a/zsh_completion.in b/zsh_completion.in index 51a023b..ec07b3b 100644 --- a/zsh_completion.in +++ b/zsh_completion.in @@ -1,4 +1,4 @@ -#compdef archbuild finddeps makechrootpkg mkarchroot +#compdef finddeps archroot _archbuild_args=( '-c[Recreate the chroot before building]' @@ -9,17 +9,7 @@ _finddeps_args=( '1:packages:_devtools_completions_all_packages' ) -_makechrootpkg_args=( - '-I[Install a package into the working copy]:target:_files -g "*.pkg.tar.*(.)"' - '-c[Clean the chroot before building]' - '-d[Add the package to a local db at /repo after building]' - '-h[Display usage]' - '-l[The directory to use as the working copy]:copy_dir:_files -/' - '-r[The chroot dir to use]:chroot_dir:_files -/' - '-u[Update the working copy of the chroot before building]' -) - -_mkarchroot_args=( +_archroot_args=( '-r[Run a program within the context of the chroot]:app' '-u[Update the chroot via pacman]' '-f[Force overwrite of files in the working-dir]' |