From 46c4def0733a78ce08702d188e3e1a141fb07316 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 29 Aug 2011 10:53:50 +0200 Subject: Support non-standard install locations This build system overhaul allows for adding (define-style) macros to our scripts. All source files are now suffixed with ".in" to clarify that they might contain unprocessed defines. The Makefile provides a new rule to preprocess source files and generate proper output scripts. Also, add a "@pkgdatadir@" define (as used in GNU Autotools) and use it instead of hardcoded paths to "/usr/share/devtools" everywhere. We missed this when adding PREFIX support to the build system in commit 35fc83ce7d8dc26cd424321f2e8638d05da0a6d4. Signed-off-by: Lukas Fleischer --- .gitignore | 13 +++ Makefile | 8 +- archbuild | 68 ------------ archbuild.in | 68 ++++++++++++ archco | 23 ---- archco.in | 23 ++++ archrelease | 67 ------------ archrelease.in | 67 ++++++++++++ archrm | 13 --- archrm.in | 13 +++ bash_completion | 69 ------------ bash_completion.in | 69 ++++++++++++ checkpkg | 90 ---------------- checkpkg.in | 90 ++++++++++++++++ commitpkg | 207 ------------------------------------ commitpkg.in | 207 ++++++++++++++++++++++++++++++++++++ finddeps | 46 -------- finddeps.in | 46 ++++++++ lddd | 46 -------- lddd.in | 46 ++++++++ makechrootpkg | 305 ----------------------------------------------------- makechrootpkg.in | 305 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mkarchroot | 231 ---------------------------------------- mkarchroot.in | 231 ++++++++++++++++++++++++++++++++++++++++ rebuildpkgs | 101 ------------------ rebuildpkgs.in | 101 ++++++++++++++++++ zsh_completion | 81 -------------- zsh_completion.in | 81 ++++++++++++++ 28 files changed, 1367 insertions(+), 1348 deletions(-) delete mode 100755 archbuild create mode 100644 archbuild.in delete mode 100755 archco create mode 100644 archco.in delete mode 100755 archrelease create mode 100644 archrelease.in delete mode 100755 archrm create mode 100644 archrm.in delete mode 100644 bash_completion create mode 100644 bash_completion.in delete mode 100755 checkpkg create mode 100644 checkpkg.in delete mode 100755 commitpkg create mode 100644 commitpkg.in delete mode 100755 finddeps create mode 100644 finddeps.in delete mode 100755 lddd create mode 100644 lddd.in delete mode 100755 makechrootpkg create mode 100644 makechrootpkg.in delete mode 100755 mkarchroot create mode 100644 mkarchroot.in delete mode 100755 rebuildpkgs create mode 100644 rebuildpkgs.in delete mode 100644 zsh_completion create mode 100644 zsh_completion.in diff --git a/.gitignore b/.gitignore index d823845..cd39b63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,15 @@ *~ devtools-*.tar.gz +archbuild +archco +archrelease +archrm +bash_completion +checkpkg +commitpkg +finddeps +lddd +makechrootpkg +mkarchroot +rebuildpkgs +zsh_completion diff --git a/Makefile b/Makefile index 6f7a238..47378ff 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,13 @@ ARCHBUILD_LINKS = \ multilib-build \ multilib-testing-build -all: +all: $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion + +%: %.in + @echo "GEN $@" + @sed -e "s|@pkgdatadir[@]|$(DESTDIR)$(PREFIX)/share/devtools|g" "$<" >"$@" + @chmod a-w "$@" + @chmod +x "$@" install: install -dm0755 $(DESTDIR)$(PREFIX)/bin diff --git a/archbuild b/archbuild deleted file mode 100755 index 5518996..0000000 --- a/archbuild +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -base_packages=(base base-devel sudo) - -cmd="${0##*/}" -if [[ "${cmd%%-*}" == 'multilib' ]]; then - repo="${cmd%-build}" - arch='x86_64' - base_packages+=(multilib-devel) -else - tag="${cmd%-build}" - repo=${tag%-*} - arch=${tag##*-} -fi -chroots='/var/tmp/archbuild' -clean_first=false - -usage() { - echo "usage $cmd" - echo ' -c Recreate the chroot before building' - echo ' -r Create chroots in this directory' - exit 1 -} - -while getopts 'cr:' arg; do - case "${arg}" in - c) clean_first=true ;; - r) chroots="$OPTARG" ;; - *) usage ;; - esac -done - -if [[ "$EUID" != '0' ]]; then - echo 'This script must be run as root.' - exit 1 -fi - -if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then - echo "Creating chroot for [${repo}] (${arch})..." - - for copy in "${chroots}/${repo}-${arch}"/*; do - [[ -d $copy ]] || continue - echo "Deleting chroot copy '$(basename "${copy}")'..." - - # Lock the copy - exec 9>"${copy}.lock" - flock 9 - - { type -P btrfs && btrfs subvolume delete "${copy}"; } &>/dev/null - rm -rf "${copy}" - done - exec 9>&- - - rm -rf "${chroots}/${repo}-${arch}" - mkdir -p "${chroots}/${repo}-${arch}" - setarch "${arch}" mkarchroot \ - -C "/usr/share/devtools/pacman-${repo}.conf" \ - -M "/usr/share/devtools/makepkg-${arch}.conf" \ - "${chroots}/${repo}-${arch}/root" \ - "${base_packages[@]}" -else - setarch ${arch} mkarchroot \ - -u \ - "${chroots}/${repo}-${arch}/root" -fi - -echo "Building in chroot for [${repo}] (${arch})..." -setarch "${arch}" makechrootpkg -c -r "${chroots}/${repo}-${arch}" diff --git a/archbuild.in b/archbuild.in new file mode 100644 index 0000000..92d2554 --- /dev/null +++ b/archbuild.in @@ -0,0 +1,68 @@ +#!/bin/bash + +base_packages=(base base-devel sudo) + +cmd="${0##*/}" +if [[ "${cmd%%-*}" == 'multilib' ]]; then + repo="${cmd%-build}" + arch='x86_64' + base_packages+=(multilib-devel) +else + tag="${cmd%-build}" + repo=${tag%-*} + arch=${tag##*-} +fi +chroots='/var/tmp/archbuild' +clean_first=false + +usage() { + echo "usage $cmd" + echo ' -c Recreate the chroot before building' + echo ' -r Create chroots in this directory' + exit 1 +} + +while getopts 'cr:' arg; do + case "${arg}" in + c) clean_first=true ;; + r) chroots="$OPTARG" ;; + *) usage ;; + esac +done + +if [[ "$EUID" != '0' ]]; then + echo 'This script must be run as root.' + exit 1 +fi + +if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then + echo "Creating chroot for [${repo}] (${arch})..." + + for copy in "${chroots}/${repo}-${arch}"/*; do + [[ -d $copy ]] || continue + echo "Deleting chroot copy '$(basename "${copy}")'..." + + # Lock the copy + exec 9>"${copy}.lock" + flock 9 + + { type -P btrfs && btrfs subvolume delete "${copy}"; } &>/dev/null + rm -rf "${copy}" + done + exec 9>&- + + rm -rf "${chroots}/${repo}-${arch}" + mkdir -p "${chroots}/${repo}-${arch}" + setarch "${arch}" mkarchroot \ + -C "@pkgdatadir@/pacman-${repo}.conf" \ + -M "@pkgdatadir@/makepkg-${arch}.conf" \ + "${chroots}/${repo}-${arch}/root" \ + "${base_packages[@]}" +else + setarch ${arch} mkarchroot \ + -u \ + "${chroots}/${repo}-${arch}/root" +fi + +echo "Building in chroot for [${repo}] (${arch})..." +setarch "${arch}" makechrootpkg -c -r "${chroots}/${repo}-${arch}" diff --git a/archco b/archco deleted file mode 100755 index 31134f4..0000000 --- a/archco +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -scriptname=${0##*/} - -if [ "$1" = '' ]; then - echo 'Usage: '$scriptname' ...' - exit 1 -fi - -case $scriptname in - archco) - SVNURL="svn+ssh://gerolde.archlinux.org/srv/svn-packages";; - communityco) - SVNURL="svn+ssh://aur.archlinux.org/srv/svn-packages";; - *) - echo "error: couldn't find svn url for $scriptname" - exit 1 - ;; -esac - -for i in "$@"; do - svn co "$SVNURL/$i" -done diff --git a/archco.in b/archco.in new file mode 100644 index 0000000..31134f4 --- /dev/null +++ b/archco.in @@ -0,0 +1,23 @@ +#!/bin/bash + +scriptname=${0##*/} + +if [ "$1" = '' ]; then + echo 'Usage: '$scriptname' ...' + exit 1 +fi + +case $scriptname in + archco) + SVNURL="svn+ssh://gerolde.archlinux.org/srv/svn-packages";; + communityco) + SVNURL="svn+ssh://aur.archlinux.org/srv/svn-packages";; + *) + echo "error: couldn't find svn url for $scriptname" + exit 1 + ;; +esac + +for i in "$@"; do + svn co "$SVNURL/$i" +done diff --git a/archrelease b/archrelease deleted file mode 100755 index 2f6a563..0000000 --- a/archrelease +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -abort() { - echo ${1:-'archrelease: Cancelled'} - exit 1 -} - -if [[ -z $1 ]]; then - abort 'Usage: archrelease ...' -fi - -# TODO: validate repo is really repo-arch - -if [[ ! -f PKGBUILD ]]; then - abort 'archrelease: PKGBUILD not found' -fi - -trunk=${PWD##*/} - -# Normally this should be trunk, but it may be something -# such as 'gnome-unstable' -IFS='/' read -r -d '' -a parts <<< "$PWD" -if [[ "${parts[@]:(-2):1}" == "repos" ]]; then - abort 'archrelease: Should not be in repos dir (try from trunk/)' -fi -unset parts - -if [[ $(svn status -q) ]]; then - abort 'archrelease: You have not committed your changes yet!' -fi - -pushd .. >/dev/null -IFS=$'\n' read -r -d '' -a known_files < <(svn ls -r HEAD "$trunk") -for file in "${known_files[@]}"; do - if [[ ${file:(-1)} = '/' ]]; then - abort "archrelease: subdirectories are not supported in package directories!" - fi -done - -for tag in "$@"; do - echo -n "copying ${trunk} to ${tag}..." - - if [[ -d repos/$tag ]]; then - declare -a trash - trash=() - while read -r file; do - trash+=("repos/$tag/$file") - done < <(svn ls "repos/$tag") - svn rm -q "${trash[@]}" - else - mkdir -p "repos/$tag" - svn add --parents -q "repos/$tag" - fi - - for file in "${known_files[@]}"; do - svn copy -q -r HEAD "$trunk/$file" "repos/$tag/" - done - - echo 'done' -done - -echo -n "releasing package..." -printf -v tag_list ", %s" "$@"; tag_list="${tag_list#, }" -svn commit -q -m "archrelease: copy ${trunk} to $tag_list" || abort -echo 'done' - -popd >/dev/null diff --git a/archrelease.in b/archrelease.in new file mode 100644 index 0000000..2f6a563 --- /dev/null +++ b/archrelease.in @@ -0,0 +1,67 @@ +#!/bin/bash + +abort() { + echo ${1:-'archrelease: Cancelled'} + exit 1 +} + +if [[ -z $1 ]]; then + abort 'Usage: archrelease ...' +fi + +# TODO: validate repo is really repo-arch + +if [[ ! -f PKGBUILD ]]; then + abort 'archrelease: PKGBUILD not found' +fi + +trunk=${PWD##*/} + +# Normally this should be trunk, but it may be something +# such as 'gnome-unstable' +IFS='/' read -r -d '' -a parts <<< "$PWD" +if [[ "${parts[@]:(-2):1}" == "repos" ]]; then + abort 'archrelease: Should not be in repos dir (try from trunk/)' +fi +unset parts + +if [[ $(svn status -q) ]]; then + abort 'archrelease: You have not committed your changes yet!' +fi + +pushd .. >/dev/null +IFS=$'\n' read -r -d '' -a known_files < <(svn ls -r HEAD "$trunk") +for file in "${known_files[@]}"; do + if [[ ${file:(-1)} = '/' ]]; then + abort "archrelease: subdirectories are not supported in package directories!" + fi +done + +for tag in "$@"; do + echo -n "copying ${trunk} to ${tag}..." + + if [[ -d repos/$tag ]]; then + declare -a trash + trash=() + while read -r file; do + trash+=("repos/$tag/$file") + done < <(svn ls "repos/$tag") + svn rm -q "${trash[@]}" + else + mkdir -p "repos/$tag" + svn add --parents -q "repos/$tag" + fi + + for file in "${known_files[@]}"; do + svn copy -q -r HEAD "$trunk/$file" "repos/$tag/" + done + + echo 'done' +done + +echo -n "releasing package..." +printf -v tag_list ", %s" "$@"; tag_list="${tag_list#, }" +svn commit -q -m "archrelease: copy ${trunk} to $tag_list" || abort +echo 'done' + +popd >/dev/null diff --git a/archrm b/archrm deleted file mode 100755 index 4a683f6..0000000 --- a/archrm +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -if [ "$1" = '' ]; then - echo 'Usage: archrm ' - exit 1 -fi - -# FIXME: Check if there are uncommited changes -#pushd $1 -# -#popd - -rm -rf $1 diff --git a/archrm.in b/archrm.in new file mode 100644 index 0000000..4a683f6 --- /dev/null +++ b/archrm.in @@ -0,0 +1,13 @@ +#!/bin/bash + +if [ "$1" = '' ]; then + echo 'Usage: archrm ' + exit 1 +fi + +# FIXME: Check if there are uncommited changes +#pushd $1 +# +#popd + +rm -rf $1 diff --git a/bash_completion b/bash_completion deleted file mode 100644 index cd959fc..0000000 --- a/bash_completion +++ /dev/null @@ -1,69 +0,0 @@ -_devtools_compgen() { - local i r - COMPREPLY=($(compgen -W '$*' -- "$cur")) - for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do - for r in ${!COMPREPLY[@]}; do - if [[ ${COMP_WORDS[i]} = ${COMPREPLY[r]} ]]; then - unset 'COMPREPLY[r]'; break - fi - done - done -} - -_archco_pkg() { - _devtools_compgen "$( - \pacman -$1 - )" -} - -_archco() { - local cur prev - COMPREPLY=() - cur=$(_get_cword) - prev=${COMP_WORDS[COMP_CWORD-1]} - - _archco_pkg Slq - true -} && -complete -F _archco archco communityco - -_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=() - _get_comp_words_by_ref cur - - case $cur in - -*) - COMPREPLY=( $( compgen -W '-C -M -c -f -h -n -r -u' -- "$cur" ) ) - ;; - *) - _filedir - return 0 - ;; - esac - - true -} && -complete -F _mkarchroot mkarchroot - - -# ex:et ts=2 sw=2 ft=sh diff --git a/bash_completion.in b/bash_completion.in new file mode 100644 index 0000000..cd959fc --- /dev/null +++ b/bash_completion.in @@ -0,0 +1,69 @@ +_devtools_compgen() { + local i r + COMPREPLY=($(compgen -W '$*' -- "$cur")) + for ((i=1; i < ${#COMP_WORDS[@]}-1; i++)); do + for r in ${!COMPREPLY[@]}; do + if [[ ${COMP_WORDS[i]} = ${COMPREPLY[r]} ]]; then + unset 'COMPREPLY[r]'; break + fi + done + done +} + +_archco_pkg() { + _devtools_compgen "$( + \pacman -$1 + )" +} + +_archco() { + local cur prev + COMPREPLY=() + cur=$(_get_cword) + prev=${COMP_WORDS[COMP_CWORD-1]} + + _archco_pkg Slq + true +} && +complete -F _archco archco communityco + +_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=() + _get_comp_words_by_ref cur + + case $cur in + -*) + COMPREPLY=( $( compgen -W '-C -M -c -f -h -n -r -u' -- "$cur" ) ) + ;; + *) + _filedir + return 0 + ;; + esac + + true +} && +complete -F _mkarchroot mkarchroot + + +# ex:et ts=2 sw=2 ft=sh diff --git a/checkpkg b/checkpkg deleted file mode 100755 index 94a7529..0000000 --- a/checkpkg +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -# Source makepkg.conf; fail if it is not found -if [[ -r '/etc/makepkg.conf' ]]; then - source '/etc/makepkg.conf' -else - echo '/etc/makepkg.conf not found!' - exit 1 -fi - -# Source user-specific makepkg.conf overrides -if [[ -r ~/.makepkg.conf ]]; then - source ~/.makepkg.conf -fi - -if [[ ! -f PKGBUILD ]]; then - echo 'This must be run in the directory of a built package.' - exit 1 -fi - -. PKGBUILD -if [[ $arch == 'any' ]]; then - CARCH='any' -fi - -STARTDIR=$(pwd) -TEMPDIR=$(mktemp -d /tmp/checkpkg-script.XXXX) -cd "$TEMPDIR" - -for _pkgname in "${pkgname[@]}"; do - if [[ -z ${epoch} ]] ; then - pkgfile=${_pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} - else - pkgfile=${_pkgname}-${epoch}:${pkgver}-${pkgrel}-${CARCH}${PKGEXT} - fi - - if [[ -f "$STARTDIR/$pkgfile" ]]; then - ln -s "$STARTDIR/$pkgfile" "$pkgfile" - elif [[ -f "$PKGDEST/$pkgfile" ]]; then - ln -s "$PKGDEST/$pkgfile" "$pkgfile" - else - echo "File \"$pkgfile\" doesn't exist" - exit 1 - fi - - pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname") - - if [[ $? -ne 0 ]]; then - echo "Couldn't download previous package for $_pkgname." - exit 1 - fi - - oldpkg=${pkgurl##*://*/} - - if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then - echo "The built package ($_pkgname) is the one in the repo right now!" - exit 1 - fi - - if [[ ! -f $oldpkg ]]; then - if [[ $pkgurl = file://* ]]; then - ln -s "${pkgurl#file://}" "${pkgurl##file://*/}" - elif [[ -f "$PKGDEST/$oldpkg" ]]; then - ln -s "$PKGDEST/$oldpkg" "$oldpkg" - elif [[ -f "$STARTDIR/$oldpkg" ]]; then - ln -s "$STARTDIR/$oldpkg" "$oldpkg" - else - wget --quiet "$pkgurl" - fi - fi - - bsdtar tf "$oldpkg" | sort > "filelist-$_pkgname-old" - bsdtar tf "$pkgfile" | sort > "filelist-$_pkgname" - - sdiff -s "filelist-$_pkgname-old" "filelist-$_pkgname" - - if diff "filelist-$_pkgname-old" "filelist-$_pkgname" | grep '\.so' > /dev/null 2>&1; then - mkdir -p pkg - cd pkg - bsdtar xf ../"$pkgfile" > /dev/null - diff "../filelist-$_pkgname-old" "../filelist-$_pkgname" | awk '/>.*\.so/{$1 = ""; print $0}' | while read i; do - echo "${i}: " "$(objdump -p "$i" | grep SONAME)" - done - cd .. - else - echo "No soname differences for $_pkgname." - fi -done - -echo "Files saved to $TEMPDIR" diff --git a/checkpkg.in b/checkpkg.in new file mode 100644 index 0000000..94a7529 --- /dev/null +++ b/checkpkg.in @@ -0,0 +1,90 @@ +#!/bin/bash + +# Source makepkg.conf; fail if it is not found +if [[ -r '/etc/makepkg.conf' ]]; then + source '/etc/makepkg.conf' +else + echo '/etc/makepkg.conf not found!' + exit 1 +fi + +# Source user-specific makepkg.conf overrides +if [[ -r ~/.makepkg.conf ]]; then + source ~/.makepkg.conf +fi + +if [[ ! -f PKGBUILD ]]; then + echo 'This must be run in the directory of a built package.' + exit 1 +fi + +. PKGBUILD +if [[ $arch == 'any' ]]; then + CARCH='any' +fi + +STARTDIR=$(pwd) +TEMPDIR=$(mktemp -d /tmp/checkpkg-script.XXXX) +cd "$TEMPDIR" + +for _pkgname in "${pkgname[@]}"; do + if [[ -z ${epoch} ]] ; then + pkgfile=${_pkgname}-${pkgver}-${pkgrel}-${CARCH}${PKGEXT} + else + pkgfile=${_pkgname}-${epoch}:${pkgver}-${pkgrel}-${CARCH}${PKGEXT} + fi + + if [[ -f "$STARTDIR/$pkgfile" ]]; then + ln -s "$STARTDIR/$pkgfile" "$pkgfile" + elif [[ -f "$PKGDEST/$pkgfile" ]]; then + ln -s "$PKGDEST/$pkgfile" "$pkgfile" + else + echo "File \"$pkgfile\" doesn't exist" + exit 1 + fi + + pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname") + + if [[ $? -ne 0 ]]; then + echo "Couldn't download previous package for $_pkgname." + exit 1 + fi + + oldpkg=${pkgurl##*://*/} + + if [[ ${oldpkg##*/} = ${pkgfile##*/} ]]; then + echo "The built package ($_pkgname) is the one in the repo right now!" + exit 1 + fi + + if [[ ! -f $oldpkg ]]; then + if [[ $pkgurl = file://* ]]; then + ln -s "${pkgurl#file://}" "${pkgurl##file://*/}" + elif [[ -f "$PKGDEST/$oldpkg" ]]; then + ln -s "$PKGDEST/$oldpkg" "$oldpkg" + elif [[ -f "$STARTDIR/$oldpkg" ]]; then + ln -s "$STARTDIR/$oldpkg" "$oldpkg" + else + wget --quiet "$pkgurl" + fi + fi + + bsdtar tf "$oldpkg" | sort > "filelist-$_pkgname-old" + bsdtar tf "$pkgfile" | sort > "filelist-$_pkgname" + + sdiff -s "filelist-$_pkgname-old" "filelist-$_pkgname" + + if diff "filelist-$_pkgname-old" "filelist-$_pkgname" | grep '\.so' > /dev/null 2>&1; then + mkdir -p pkg + cd pkg + bsdtar xf ../"$pkgfile" > /dev/null + diff "../filelist-$_pkgname-old" "../filelist-$_pkgname" | awk '/>.*\.so/{$1 = ""; print $0}' | while read i; do + echo "${i}: " "$(objdump -p "$i" | grep SONAME)" + done + cd .. + else + echo "No soname differences for $_pkgname." + fi +done + +echo "Files saved to $TEMPDIR" diff --git a/commitpkg b/commitpkg deleted file mode 100755 index 2a732b5..0000000 --- a/commitpkg +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash - -abort() { - echo ${1:-'Cancelled'} - exit 1 -} - -getpkgfile() { - if [[ ${#} -ne 1 ]]; then - echo 'ERROR: No canonical package found!' >&2 - exit 1 - elif [ ! -f "${1}" ]; then - echo "ERROR: Package ${1} not found!" >&2 - exit 1 - fi - - echo ${1} -} - -## -# usage : get_full_version( $epoch, $pkgver, $pkgrel ) -# return : full version spec, including epoch (if necessary), pkgver, pkgrel -## -get_full_version() { - if [[ $1 -eq 0 ]]; then - # zero epoch case, don't include it in version - echo $2-$3 - else - echo $1:$2-$3 - fi -} - -# Source makepkg.conf; fail if it is not found -if [ -r '/etc/makepkg.conf' ]; then - source '/etc/makepkg.conf' -else - abort '/etc/makepkg.conf not found!' -fi - -# Source user-specific makepkg.conf overrides -if [ -r ~/.makepkg.conf ]; then - . ~/.makepkg.conf -fi - -cmd=${0##*/} - -if [ ! -f PKGBUILD ]; then - abort 'No PKGBUILD file' -fi - -. PKGBUILD -pkgbase=${pkgbase:-$pkgname} - -case "$cmd" in - commitpkg) - if [ $# -eq 0 ]; then - abort 'usage: commitpkg [-l limit] [-a arch] [commit message]' - fi - repo="$1" - shift - ;; - *pkg) - repo="${cmd%pkg}" - ;; - *) - abort 'usage: commitpkg [-l limit] [-a arch] [commit message]' - ;; -esac - -case "$repo" in - core|extra|testing|staging) - server='gerolde.archlinux.org' ;; - community*|multilib*) - server='aur.archlinux.org' ;; - *) - server='gerolde.archlinux.org' - echo "Non-standard repository $repo in use, defaulting to server $server" ;; -esac - -# check if all local source files are under version control -for s in "${source[@]}"; do - if [[ $s != *://* ]] && ! svn status -v "$s" | grep -q '^[ AMRX~]'; then - abort "$s is not under version control" - fi -done - -# check if changelog and install files are under version control -for i in 'changelog' 'install'; do - filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) - for file in $filelist; do - # evaluate any bash variables used - eval file=${file} - if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then - abort "${file} is not under version control" - fi - done -done - -# see if any limit options were passed, we'll send them to rsync -rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y) -while getopts ':l:a:' flag; do - case $flag in - l) rsyncopts+=("--bwlimit=$2") ;; - a) commit_arch=$2 ;; - :) echo "option requires an argument -- '$OPTARG'" >&2 - exit 1 ;; - \?) echo "invalid option -- '$OPTARG'" >&2 - exit 1 ;; - esac -done -shift $(( OPTIND - 1 )) - -if [ -n "$(svn status -q)" ]; then - echo -n 'committing changes to trunk...' - msgtemplate="upgpkg: $pkgbase $(get_full_version ${epoch:-0} $pkgver $pkgrel)"$'\n\n' - if [ -n "$1" ]; then - svn commit -q -m "${msgtemplate}${1}" || abort - else - msgfile="$(mktemp)" - echo "$msgtemplate" > "$msgfile" - if [ -n "$SVN_EDITOR" ]; then - $SVN_EDITOR "$msgfile" - elif [ -n "$VISUAL" ]; then - $VISUAL "$msgfile" - elif [ -n "$EDITOR" ]; then - $EDITOR "$msgfile" - else - vi "$msgfile" - fi - [ -s "$msgfile" ] || abort - svn commit -q -F "$msgfile" || abort - unlink "$msgfile" - fi - echo 'done' -fi - -declare -a uploads - -for _arch in ${arch[@]}; do - if [ -n "$commit_arch" ] && [ "${_arch}" != "$commit_arch" ]; then - echo "skipping ${_arch}" - continue - fi - - for _pkgname in ${pkgname[@]}; do - fullver=$(get_full_version ${epoch:-0} $pkgver $pkgrel) - pkgfile=$(getpkgfile "$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null) - pkgdestfile=$(getpkgfile "$PKGDEST/$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null) - - if [ -f "$pkgfile" ]; then - pkgfile="./$pkgfile" - elif [ -f "$pkgdestfile" ]; then - pkgfile="$pkgdestfile" - else - echo "skipping ${_arch}" - continue 2 - fi - uploads+=("$pkgfile") - - if [[ $SIGNPKG == 'y' ]]; then - echo "Signing package ${pkgfile}..." - if [[ -n $GPGKEY ]]; then - SIGNWITHKEY="-u ${GPGKEY}" - fi - gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || abort - fi - - sigfile="${pkgfile}.sig" - if [ -f "${sigfile}" ]; then - uploads+=("$sigfile") - elif [[ $SIGNPKG == 'y' ]]; then - abort "Signature ${pkgfile}.sig was not found" - fi - done -done - -if [[ -n $commit_arch ]]; then - archrelease "$repo-$commit_arch" || abort -else - archrelease "${arch[@]/#/$repo-}" || abort -fi - -if [[ ${#uploads[*]} -gt 0 ]]; then - echo 'uploading all package and signature files' - rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || abort -fi - -if [ "${arch[*]}" == 'any' ]; then - if [ -d ../repos/$repo-i686 -a -d ../repos/$repo-x86_64 ]; then - pushd ../repos/ >/dev/null - echo "removing $repo-i686 and $repo-x86_64..." - svn rm $repo-i686 - svn rm $repo-x86_64 - svn commit -q -m "removed $repo-i686 and $repo-x86_64 for $pkgname" - echo 'done' - popd >/dev/null - fi -else - if [ -d ../repos/$repo-any ]; then - pushd ../repos/ >/dev/null - echo "removing $repo-any..." - svn rm $repo-any - svn commit -q -m "removed $repo-any for $pkgname" - echo 'done' - popd >/dev/null - fi -fi diff --git a/commitpkg.in b/commitpkg.in new file mode 100644 index 0000000..2a732b5 --- /dev/null +++ b/commitpkg.in @@ -0,0 +1,207 @@ +#!/bin/bash + +abort() { + echo ${1:-'Cancelled'} + exit 1 +} + +getpkgfile() { + if [[ ${#} -ne 1 ]]; then + echo 'ERROR: No canonical package found!' >&2 + exit 1 + elif [ ! -f "${1}" ]; then + echo "ERROR: Package ${1} not found!" >&2 + exit 1 + fi + + echo ${1} +} + +## +# usage : get_full_version( $epoch, $pkgver, $pkgrel ) +# return : full version spec, including epoch (if necessary), pkgver, pkgrel +## +get_full_version() { + if [[ $1 -eq 0 ]]; then + # zero epoch case, don't include it in version + echo $2-$3 + else + echo $1:$2-$3 + fi +} + +# Source makepkg.conf; fail if it is not found +if [ -r '/etc/makepkg.conf' ]; then + source '/etc/makepkg.conf' +else + abort '/etc/makepkg.conf not found!' +fi + +# Source user-specific makepkg.conf overrides +if [ -r ~/.makepkg.conf ]; then + . ~/.makepkg.conf +fi + +cmd=${0##*/} + +if [ ! -f PKGBUILD ]; then + abort 'No PKGBUILD file' +fi + +. PKGBUILD +pkgbase=${pkgbase:-$pkgname} + +case "$cmd" in + commitpkg) + if [ $# -eq 0 ]; then + abort 'usage: commitpkg [-l limit] [-a arch] [commit message]' + fi + repo="$1" + shift + ;; + *pkg) + repo="${cmd%pkg}" + ;; + *) + abort 'usage: commitpkg [-l limit] [-a arch] [commit message]' + ;; +esac + +case "$repo" in + core|extra|testing|staging) + server='gerolde.archlinux.org' ;; + community*|multilib*) + server='aur.archlinux.org' ;; + *) + server='gerolde.archlinux.org' + echo "Non-standard repository $repo in use, defaulting to server $server" ;; +esac + +# check if all local source files are under version control +for s in "${source[@]}"; do + if [[ $s != *://* ]] && ! svn status -v "$s" | grep -q '^[ AMRX~]'; then + abort "$s is not under version control" + fi +done + +# check if changelog and install files are under version control +for i in 'changelog' 'install'; do + filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) + for file in $filelist; do + # evaluate any bash variables used + eval file=${file} + if ! svn status -v "${file}" | grep -q '^[ AMRX~]'; then + abort "${file} is not under version control" + fi + done +done + +# see if any limit options were passed, we'll send them to rsync +rsyncopts=(-e ssh -p --chmod=ug=rw,o=r -c -h -L --progress --partial -y) +while getopts ':l:a:' flag; do + case $flag in + l) rsyncopts+=("--bwlimit=$2") ;; + a) commit_arch=$2 ;; + :) echo "option requires an argument -- '$OPTARG'" >&2 + exit 1 ;; + \?) echo "invalid option -- '$OPTARG'" >&2 + exit 1 ;; + esac +done +shift $(( OPTIND - 1 )) + +if [ -n "$(svn status -q)" ]; then + echo -n 'committing changes to trunk...' + msgtemplate="upgpkg: $pkgbase $(get_full_version ${epoch:-0} $pkgver $pkgrel)"$'\n\n' + if [ -n "$1" ]; then + svn commit -q -m "${msgtemplate}${1}" || abort + else + msgfile="$(mktemp)" + echo "$msgtemplate" > "$msgfile" + if [ -n "$SVN_EDITOR" ]; then + $SVN_EDITOR "$msgfile" + elif [ -n "$VISUAL" ]; then + $VISUAL "$msgfile" + elif [ -n "$EDITOR" ]; then + $EDITOR "$msgfile" + else + vi "$msgfile" + fi + [ -s "$msgfile" ] || abort + svn commit -q -F "$msgfile" || abort + unlink "$msgfile" + fi + echo 'done' +fi + +declare -a uploads + +for _arch in ${arch[@]}; do + if [ -n "$commit_arch" ] && [ "${_arch}" != "$commit_arch" ]; then + echo "skipping ${_arch}" + continue + fi + + for _pkgname in ${pkgname[@]}; do + fullver=$(get_full_version ${epoch:-0} $pkgver $pkgrel) + pkgfile=$(getpkgfile "$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null) + pkgdestfile=$(getpkgfile "$PKGDEST/$_pkgname-$fullver-${_arch}".pkg.tar.?z 2>/dev/null) + + if [ -f "$pkgfile" ]; then + pkgfile="./$pkgfile" + elif [ -f "$pkgdestfile" ]; then + pkgfile="$pkgdestfile" + else + echo "skipping ${_arch}" + continue 2 + fi + uploads+=("$pkgfile") + + if [[ $SIGNPKG == 'y' ]]; then + echo "Signing package ${pkgfile}..." + if [[ -n $GPGKEY ]]; then + SIGNWITHKEY="-u ${GPGKEY}" + fi + gpg --detach-sign --use-agent ${SIGNWITHKEY} "${pkgfile}" || abort + fi + + sigfile="${pkgfile}.sig" + if [ -f "${sigfile}" ]; then + uploads+=("$sigfile") + elif [[ $SIGNPKG == 'y' ]]; then + abort "Signature ${pkgfile}.sig was not found" + fi + done +done + +if [[ -n $commit_arch ]]; then + archrelease "$repo-$commit_arch" || abort +else + archrelease "${arch[@]/#/$repo-}" || abort +fi + +if [[ ${#uploads[*]} -gt 0 ]]; then + echo 'uploading all package and signature files' + rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || abort +fi + +if [ "${arch[*]}" == 'any' ]; then + if [ -d ../repos/$repo-i686 -a -d ../repos/$repo-x86_64 ]; then + pushd ../repos/ >/dev/null + echo "removing $repo-i686 and $repo-x86_64..." + svn rm $repo-i686 + svn rm $repo-x86_64 + svn commit -q -m "removed $repo-i686 and $repo-x86_64 for $pkgname" + echo 'done' + popd >/dev/null + fi +else + if [ -d ../repos/$repo-any ]; then + pushd ../repos/ >/dev/null + echo "removing $repo-any..." + svn rm $repo-any + svn commit -q -m "removed $repo-any for $pkgname" + echo 'done' + popd >/dev/null + fi +fi diff --git a/finddeps b/finddeps deleted file mode 100755 index ded7a93..0000000 --- a/finddeps +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -# -# finddeps - find packages that depend on a given depname -# - -if [ "$1" = '' ]; then - echo 'usage: finddeps ' - echo '' - echo 'Find packages that depend on a given depname.' - echo 'Run this script from the top-level directory of your ABS tree.' - echo '' - exit 0 -fi - -match=$1 -tld=$(pwd) - -for d in $(find . -type d); do - cd $d - if [ -f PKGBUILD ]; then - unset pkgname depends makedepends - . PKGBUILD - for dep in "${depends[@]}"; do - # lose the version comparator, if any - depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (depends)" - fi - done - for dep in "${makedepends[@]}"; do - # lose the version comparator, if any - depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (makedepends)" - fi - done - for dep in "${optdepends[@]/:*}"; do - # lose the version comaparator, if any - depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (optdepends)" - fi - done - fi - cd $tld -done diff --git a/finddeps.in b/finddeps.in new file mode 100644 index 0000000..ded7a93 --- /dev/null +++ b/finddeps.in @@ -0,0 +1,46 @@ +#!/bin/bash +# +# finddeps - find packages that depend on a given depname +# + +if [ "$1" = '' ]; then + echo 'usage: finddeps ' + echo '' + echo 'Find packages that depend on a given depname.' + echo 'Run this script from the top-level directory of your ABS tree.' + echo '' + exit 0 +fi + +match=$1 +tld=$(pwd) + +for d in $(find . -type d); do + cd $d + if [ -f PKGBUILD ]; then + unset pkgname depends makedepends + . PKGBUILD + for dep in "${depends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + if [ "$depname" = "$match" ]; then + echo "$d (depends)" + fi + done + for dep in "${makedepends[@]}"; do + # lose the version comparator, if any + depname=${dep%%[<>=]*} + if [ "$depname" = "$match" ]; then + echo "$d (makedepends)" + fi + done + for dep in "${optdepends[@]/:*}"; do + # lose the version comaparator, if any + depname=${dep%%[<>=]*} + if [ "$depname" = "$match" ]; then + echo "$d (optdepends)" + fi + done + fi + cd $tld +done diff --git a/lddd b/lddd deleted file mode 100755 index 9695c9b..0000000 --- a/lddd +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh -# -# lddd - find broken library links on your machine -# - -ifs=$IFS -IFS="${IFS}:" - -libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" -extras= - -TEMPDIR=$(mktemp -d /tmp/lddd-script.XXXX) - -echo 'Go out and drink some tea, this will take a while :) ...' -# Check ELF binaries in the PATH and specified dir trees. -for tree in $PATH $libdirs $extras; do - echo DIR $tree - - # Get list of files in tree. - files=$(find $tree -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \ - -name '*.rb' ! -name '*.ko' ! -name '*.pc' ! -name '*.enc' ! -name '*.cf' ! -name '*.def' ! -name '*.rules' ! -name \ - '*.cmi' ! -name '*.mli' ! -name '*.ml' ! -name '*.cma' ! -name '*.cmx' ! -name '*.cmxa' ! -name '*.pod' ! -name '*.pm' \ - ! -name '*.pl' ! -name '*.al' ! -name '*.tcl' ! -name '*.bs' ! -name '*.o' ! -name '*.png' ! -name '*.gif' ! -name '*.cmo' \ - ! -name '*.cgi' ! -name '*.defs' ! -name '*.conf' ! -name '*_LOCALE' ! -name 'Compose' ! -name '*_OBJS' ! -name '*.msg' ! \ - -name '*.mcopclass' ! -name '*.mcoptype') - IFS=$ifs - for i in $files; do - if [ $(file $i | grep -c 'ELF') -ne 0 ]; then - # Is an ELF binary. - if [ $(ldd $i 2>/dev/null | grep -c 'not found') -ne 0 ]; then - # Missing lib. - echo "$i:" >> $TEMPDIR/raw.txt - ldd $i 2>/dev/null | grep 'not found' >> $TEMPDIR/raw.txt - fi - fi - done -done -grep '^/' $TEMPDIR/raw.txt | sed -e 's/://g' >> $TEMPDIR/affected-files.txt -# invoke pacman -for i in $(cat $TEMPDIR/affected-files.txt); do - pacman -Qo $i | awk '{print $4,$5}' >> $TEMPDIR/pacman.txt -done -# clean list -sort -u $TEMPDIR/pacman.txt >> $TEMPDIR/possible-rebuilds.txt - -echo "Files saved to $TEMPDIR" diff --git a/lddd.in b/lddd.in new file mode 100644 index 0000000..9695c9b --- /dev/null +++ b/lddd.in @@ -0,0 +1,46 @@ +#!/bin/sh +# +# lddd - find broken library links on your machine +# + +ifs=$IFS +IFS="${IFS}:" + +libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" +extras= + +TEMPDIR=$(mktemp -d /tmp/lddd-script.XXXX) + +echo 'Go out and drink some tea, this will take a while :) ...' +# Check ELF binaries in the PATH and specified dir trees. +for tree in $PATH $libdirs $extras; do + echo DIR $tree + + # Get list of files in tree. + files=$(find $tree -type f ! -name '*.a' ! -name '*.la' ! -name '*.py*' ! -name '*.txt' ! -name '*.h' ! -name '*.ttf' ! \ + -name '*.rb' ! -name '*.ko' ! -name '*.pc' ! -name '*.enc' ! -name '*.cf' ! -name '*.def' ! -name '*.rules' ! -name \ + '*.cmi' ! -name '*.mli' ! -name '*.ml' ! -name '*.cma' ! -name '*.cmx' ! -name '*.cmxa' ! -name '*.pod' ! -name '*.pm' \ + ! -name '*.pl' ! -name '*.al' ! -name '*.tcl' ! -name '*.bs' ! -name '*.o' ! -name '*.png' ! -name '*.gif' ! -name '*.cmo' \ + ! -name '*.cgi' ! -name '*.defs' ! -name '*.conf' ! -name '*_LOCALE' ! -name 'Compose' ! -name '*_OBJS' ! -name '*.msg' ! \ + -name '*.mcopclass' ! -name '*.mcoptype') + IFS=$ifs + for i in $files; do + if [ $(file $i | grep -c 'ELF') -ne 0 ]; then + # Is an ELF binary. + if [ $(ldd $i 2>/dev/null | grep -c 'not found') -ne 0 ]; then + # Missing lib. + echo "$i:" >> $TEMPDIR/raw.txt + ldd $i 2>/dev/null | grep 'not found' >> $TEMPDIR/raw.txt + fi + fi + done +done +grep '^/' $TEMPDIR/raw.txt | sed -e 's/://g' >> $TEMPDIR/affected-files.txt +# invoke pacman +for i in $(cat $TEMPDIR/affected-files.txt); do + pacman -Qo $i | awk '{print $4,$5}' >> $TEMPDIR/pacman.txt +done +# clean list +sort -u $TEMPDIR/pacman.txt >> $TEMPDIR/possible-rebuilds.txt + +echo "Files saved to $TEMPDIR" diff --git a/makechrootpkg b/makechrootpkg deleted file mode 100755 index a60c9fe..0000000 --- a/makechrootpkg +++ /dev/null @@ -1,305 +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. - -FORCE='n' -RUN='' -MAKEPKG_ARGS='-s --noconfirm' -REPACK='' -WORKDIR=$PWD - -update_first='0' -clean_first='0' -install_pkg='' -add_to_db=0 - -chrootdir='' - -APPNAME=$(basename "${0}") - -default_copy=$USER -[[ -n $SUDO_USER ]] && default_copy=$SUDO_USER -[[ -z $default_copy || $default_copy = root ]] && default_copy=copy - -usage() { - echo "usage ${APPNAME} [options] -r [--] [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 ' /{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 /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 The chroot dir to use' - echo '-I Install a package into the working copy of the chroot' - echo '-l The directory to use as the working copy of the chroot' - echo ' Useful for maintaining multiple copies.' - echo " Default: $default_copy" - exit 1 -} - -while getopts 'hcudr:I:l:' arg; do - case "${arg}" in - h) usage ;; - c) clean_first=1 ;; - u) update_first=1 ;; - d) add_to_db=1 ;; - r) chrootdir="$OPTARG" ;; - I) install_pkg="$OPTARG" ;; - l) copy="$OPTARG" ;; - *) MAKEPKG_ARGS="$MAKEPKG_ARGS -$arg $OPTARG" ;; - esac -done - -# Canonicalize chrootdir, getting rid of trailing / -chrootdir=$(readlink -e "$chrootdir") - -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=1 - break; - fi -done - -if [ "$EUID" != '0' ]; then - echo 'This script must be run as root.' - exit 1 -fi - -if [ ! -f PKGBUILD -a -z "$install_pkg" ]; then - echo 'This must be run in a directory containing a PKGBUILD.' - exit 1 -fi - -if [ ! -d "$chrootdir" ]; then - echo "No chroot dir defined, or invalid path '$chrootdir'" - exit 1 -fi - -if [ ! -d "$chrootdir/root" ]; then - echo 'Missing chroot dir root directory.' - echo "Try using: mkarchroot $chrootdir/root base base-devel sudo" - usage -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 -exec 9>"$copydir.lock" -if ! flock -n 9; then - echo -n "locking chroot copy '$copy'..." - flock 9 - echo "done" -fi - -if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then - # Get a read lock on the root chroot to make - # sure we don't clone a half-updated chroot - exec 8>"$chrootdir/root.lock" - - if ! flock -sn 8; then - echo -n "locking clean chroot..." - flock -s 8 - echo "done" - fi - - echo -n '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 - echo 'done' - - # Drop the read lock again - exec 8>&- -fi - -if [ -n "$install_pkg" ]; then - pkgname="$(basename "$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 - -if [ $update_first -eq 1 ]; then - mkarchroot -u "$copydir" -fi - -[ -d "$copydir/build" ] || mkdir "$copydir/build" - -if [ "$REPACK" != "1" ]; then - # Remove anything in there UNLESS -R (repack) was passed to makepkg - rm -rf "$copydir/build/"* -fi - -# Read .makepkg.conf even if called via sudo -if [ -n "${SUDO_USER}" ]; then - makepkg_conf="/$(eval echo ~${SUDO_USER})/.makepkg.conf" -else - makepkg_conf="~/.makepkg.conf" -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) - -[ -d "$copydir/pkgdest" ] || mkdir "$copydir/pkgdest" -if ! grep 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then - echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf" -fi - -[ -d "$copydir/srcdest" ] || mkdir "$copydir/srcdest" -if ! grep 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then - echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf" -fi -[ -z "${MAKEFLAGS}" ] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) -if [ -n "${MAKEFLAGS}" ]; then - sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" - echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" -fi -[ -z "${PACKAGER}" ] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) -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 -source=($(. PKGBUILD; echo ${source[@]})) -cp PKGBUILD "$copydir/build/" -for f in ${source[@]}; do - basef=$(echo $f | sed 's|::.*||' | sed 's|^.*://.*/||g') - if [ -f "$basef" ]; then - cp "$basef" "$copydir/srcdest/" - elif [ -f "$SRCDEST/$basef" ]; then - cp "$SRCDEST/$basef" "$copydir/srcdest/" - fi -done - -( . PKGBUILD -for i in 'changelog' 'install'; do - filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) - for file in $filelist; do - # evaluate any bash variables used - eval file=${file} - if [[ -f "$file" ]]; then - cp "$file" "$copydir/build/" - fi - done -done -) - -chown -R nobody "$copydir/build" -chown -R nobody "$copydir/srcdest" -chown -R nobody "$copydir/pkgdest" - -echo 'nobody ALL = NOPASSWD: /usr/bin/pacman' > "$copydir/etc/sudoers.d/nobody-pacman" -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 </dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log -exit 0 -EOF -) > "$copydir/chrootbuild" -chmod +x "$copydir/chrootbuild" - -if mkarchroot -r "/chrootbuild" "$copydir"; then - for pkgfile in "${copydir}"/pkgdest/*.pkg.tar.*; do - [ -e "$pkgfile" ] || continue - if [ "$add_to_db" -eq "1" ]; then - mkdir -p "${copydir}/repo" - pushd "${copydir}/repo" >/dev/null - cp "$pkgfile" . - repo-add repo.db.tar.gz "$(basename "$pkgfile")" - popd >/dev/null - fi - - if [ -d "$PKGDEST" ]; then - mv "$pkgfile" "${PKGDEST}" - else - mv "$pkgfile" "${WORKDIR}" - fi - done - - for l in "${copydir}"/build/{namcap,*-{build,check,package,package_*}}.log; do - [ -f "$l" ] && mv "$l" "${WORKDIR}" - done -else - #just in case. We returned 1, make sure we fail - touch "${copydir}/build/BUILD_FAILED" -fi - -for f in "${copydir}"/srcdest/*; do - [ -e "$f" ] || continue - if [ -d "$SRCDEST" ]; then - mv "$f" "${SRCDEST}" - else - mv "$f" "${WORKDIR}" - fi -done - -if [ -e "${copydir}/build/BUILD_FAILED" ]; then - echo "Build failed, check $copydir/build" - rm "${copydir}/build/BUILD_FAILED" - exit 1 -fi diff --git a/makechrootpkg.in b/makechrootpkg.in new file mode 100644 index 0000000..a60c9fe --- /dev/null +++ b/makechrootpkg.in @@ -0,0 +1,305 @@ +#!/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. + +FORCE='n' +RUN='' +MAKEPKG_ARGS='-s --noconfirm' +REPACK='' +WORKDIR=$PWD + +update_first='0' +clean_first='0' +install_pkg='' +add_to_db=0 + +chrootdir='' + +APPNAME=$(basename "${0}") + +default_copy=$USER +[[ -n $SUDO_USER ]] && default_copy=$SUDO_USER +[[ -z $default_copy || $default_copy = root ]] && default_copy=copy + +usage() { + echo "usage ${APPNAME} [options] -r [--] [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 ' /{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 /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 The chroot dir to use' + echo '-I Install a package into the working copy of the chroot' + echo '-l The directory to use as the working copy of the chroot' + echo ' Useful for maintaining multiple copies.' + echo " Default: $default_copy" + exit 1 +} + +while getopts 'hcudr:I:l:' arg; do + case "${arg}" in + h) usage ;; + c) clean_first=1 ;; + u) update_first=1 ;; + d) add_to_db=1 ;; + r) chrootdir="$OPTARG" ;; + I) install_pkg="$OPTARG" ;; + l) copy="$OPTARG" ;; + *) MAKEPKG_ARGS="$MAKEPKG_ARGS -$arg $OPTARG" ;; + esac +done + +# Canonicalize chrootdir, getting rid of trailing / +chrootdir=$(readlink -e "$chrootdir") + +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=1 + break; + fi +done + +if [ "$EUID" != '0' ]; then + echo 'This script must be run as root.' + exit 1 +fi + +if [ ! -f PKGBUILD -a -z "$install_pkg" ]; then + echo 'This must be run in a directory containing a PKGBUILD.' + exit 1 +fi + +if [ ! -d "$chrootdir" ]; then + echo "No chroot dir defined, or invalid path '$chrootdir'" + exit 1 +fi + +if [ ! -d "$chrootdir/root" ]; then + echo 'Missing chroot dir root directory.' + echo "Try using: mkarchroot $chrootdir/root base base-devel sudo" + usage +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 +exec 9>"$copydir.lock" +if ! flock -n 9; then + echo -n "locking chroot copy '$copy'..." + flock 9 + echo "done" +fi + +if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then + # Get a read lock on the root chroot to make + # sure we don't clone a half-updated chroot + exec 8>"$chrootdir/root.lock" + + if ! flock -sn 8; then + echo -n "locking clean chroot..." + flock -s 8 + echo "done" + fi + + echo -n '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 + echo 'done' + + # Drop the read lock again + exec 8>&- +fi + +if [ -n "$install_pkg" ]; then + pkgname="$(basename "$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 + +if [ $update_first -eq 1 ]; then + mkarchroot -u "$copydir" +fi + +[ -d "$copydir/build" ] || mkdir "$copydir/build" + +if [ "$REPACK" != "1" ]; then + # Remove anything in there UNLESS -R (repack) was passed to makepkg + rm -rf "$copydir/build/"* +fi + +# Read .makepkg.conf even if called via sudo +if [ -n "${SUDO_USER}" ]; then + makepkg_conf="/$(eval echo ~${SUDO_USER})/.makepkg.conf" +else + makepkg_conf="~/.makepkg.conf" +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) + +[ -d "$copydir/pkgdest" ] || mkdir "$copydir/pkgdest" +if ! grep 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then + echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf" +fi + +[ -d "$copydir/srcdest" ] || mkdir "$copydir/srcdest" +if ! grep 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then + echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf" +fi +[ -z "${MAKEFLAGS}" ] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) +if [ -n "${MAKEFLAGS}" ]; then + sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" + echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" +fi +[ -z "${PACKAGER}" ] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) +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 +source=($(. PKGBUILD; echo ${source[@]})) +cp PKGBUILD "$copydir/build/" +for f in ${source[@]}; do + basef=$(echo $f | sed 's|::.*||' | sed 's|^.*://.*/||g') + if [ -f "$basef" ]; then + cp "$basef" "$copydir/srcdest/" + elif [ -f "$SRCDEST/$basef" ]; then + cp "$SRCDEST/$basef" "$copydir/srcdest/" + fi +done + +( . PKGBUILD +for i in 'changelog' 'install'; do + filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) + for file in $filelist; do + # evaluate any bash variables used + eval file=${file} + if [[ -f "$file" ]]; then + cp "$file" "$copydir/build/" + fi + done +done +) + +chown -R nobody "$copydir/build" +chown -R nobody "$copydir/srcdest" +chown -R nobody "$copydir/pkgdest" + +echo 'nobody ALL = NOPASSWD: /usr/bin/pacman' > "$copydir/etc/sudoers.d/nobody-pacman" +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 </dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log +exit 0 +EOF +) > "$copydir/chrootbuild" +chmod +x "$copydir/chrootbuild" + +if mkarchroot -r "/chrootbuild" "$copydir"; then + for pkgfile in "${copydir}"/pkgdest/*.pkg.tar.*; do + [ -e "$pkgfile" ] || continue + if [ "$add_to_db" -eq "1" ]; then + mkdir -p "${copydir}/repo" + pushd "${copydir}/repo" >/dev/null + cp "$pkgfile" . + repo-add repo.db.tar.gz "$(basename "$pkgfile")" + popd >/dev/null + fi + + if [ -d "$PKGDEST" ]; then + mv "$pkgfile" "${PKGDEST}" + else + mv "$pkgfile" "${WORKDIR}" + fi + done + + for l in "${copydir}"/build/{namcap,*-{build,check,package,package_*}}.log; do + [ -f "$l" ] && mv "$l" "${WORKDIR}" + done +else + #just in case. We returned 1, make sure we fail + touch "${copydir}/build/BUILD_FAILED" +fi + +for f in "${copydir}"/srcdest/*; do + [ -e "$f" ] || continue + if [ -d "$SRCDEST" ]; then + mv "$f" "${SRCDEST}" + else + mv "$f" "${WORKDIR}" + fi +done + +if [ -e "${copydir}/build/BUILD_FAILED" ]; then + echo "Build failed, check $copydir/build" + rm "${copydir}/build/BUILD_FAILED" + exit 1 +fi diff --git a/mkarchroot b/mkarchroot deleted file mode 100755 index 8e74c54..0000000 --- a/mkarchroot +++ /dev/null @@ -1,231 +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. - -FORCE='n' -RUN='' -NOCOPY='n' - -working_dir='' - -APPNAME=$(basename "${0}") - -# usage: usage -usage() { - echo "usage ${APPNAME} [options] working-dir [package-list | app]" - echo ' options:' - echo ' -r Run "app" within the context of the chroot' - echo ' -u Update the chroot via pacman' - echo ' -f Force overwrite of files in the working-dir' - echo ' -C Location of a pacman config file' - echo ' -M Location of a makepkg config file' - echo ' -n Do not copy config files into the chroot' - echo ' -c Set pacman cache. Default: /var/cache/pacman/pkg' - echo ' -h This message' - exit $1 -} - -while getopts 'r:ufnhC:M:c:' arg; do - case "${arg}" in - r) RUN="$OPTARG" ;; - u) RUN='/bin/sh -c "pacman -Syu --noconfirm && (pacman -Qqu >/dev/null && pacman -Su --noconfirm || exit 0)"' ;; - f) FORCE='y' ;; - C) pac_conf="$OPTARG" ;; - M) makepkg_conf="$OPTARG" ;; - n) NOCOPY='y' ;; - c) cache_dir="$OPTARG" ;; - h|?) usage 0 ;; - *) echo "invalid argument '${arg}'"; usage 1 ;; - esac -done - -if [ "$EUID" != '0' ]; then - echo 'error: this script must be run as root.' - exit 1 -fi - -shift $(($OPTIND - 1)) - -if [ "$RUN" = '' -a $# -lt 2 ]; then - echo 'you must specify a directory and one or more packages' - usage 1 -elif [ $# -lt 1 ]; then - echo 'you must specify a directory' - usage 1 -fi - -working_dir="$(readlink -f ${1})" -shift 1 - -[ "${working_dir}" = '' ] && echo 'error: please specify a working directory' && usage 1 - -if [ -z "$cache_dir" ]; then - cache_conf=${working_dir}/etc/pacman.conf - [ ! -f $cache_conf ] && cache_conf=${pac_conf:-/etc/pacman.conf} - cache_dir=$( (grep -m 1 '^CacheDir' $cache_conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir\s*=\s*//') - unset cache_conf -fi - -if [ -f /etc/pacman.d/mirrorlist ]; then - host_mirror=$(pacman -Sddp extra/devtools 2>/dev/null | sed -E 's#(.*/)extra/os/.*#\1$repo/os/$arch#') -fi -if [ -z "${host_mirror}" ]; then - host_mirror='http://mirrors.kernel.org/archlinux/$repo/os/$arch' -fi -if echo "${host_mirror}" | grep -q 'file://'; then - host_mirror_path=$(echo "${host_mirror}" | sed -E 's#file://(/.*)/\$repo/os/\$arch#\1#g') -fi - -# {{{ functions -chroot_mount() { - [ -e "${working_dir}/sys" ] || mkdir "${working_dir}/sys" - mount -t sysfs sysfs "${working_dir}/sys" - - [ -e "${working_dir}/proc" ] || mkdir "${working_dir}/proc" - mount -t proc proc "${working_dir}/proc" - - [ -e "${working_dir}/dev" ] || mkdir "${working_dir}/dev" - mount -t tmpfs dev "${working_dir}/dev" -o mode=0755,size=10M,nosuid - mknod -m 666 "${working_dir}/dev/null" c 1 3 - mknod -m 666 "${working_dir}/dev/zero" c 1 5 - mknod -m 600 "${working_dir}/dev/console" c 5 1 - mknod -m 644 "${working_dir}/dev/random" c 1 8 - mknod -m 644 "${working_dir}/dev/urandom" c 1 9 - mknod -m 666 "${working_dir}/dev/tty" c 5 0 - mknod -m 666 "${working_dir}/dev/tty0" c 4 0 - mknod -m 666 "${working_dir}/dev/full" c 1 7 - ln -s /proc/kcore "${working_dir}/dev/core" - ln -s /proc/self/fd "${working_dir}/dev/fd" - ln -s /proc/self/fd/0 "${working_dir}/dev/stdin" - ln -s /proc/self/fd/1 "${working_dir}/dev/stdout" - ln -s /proc/self/fd/2 "${working_dir}/dev/stderr" - - [ -e "${working_dir}/dev/shm" ] || mkdir "${working_dir}/dev/shm" - mount -t tmpfs shm "${working_dir}/dev/shm" -o nodev,nosuid,size=128M - - [ -e "${working_dir}/dev/pts" ] || mkdir "${working_dir}/dev/pts" - mount -t devpts devpts "${working_dir}/dev/pts" -o newinstance,ptmxmode=666 - ln -s pts/ptmx "${working_dir}/dev/ptmx" - - [ -e "${cache_dir}" ] || mkdir -p "${cache_dir}" - [ -e "${working_dir}/${cache_dir}" ] || mkdir -p "${working_dir}/${cache_dir}" - mount -o bind "${cache_dir}" "${working_dir}/${cache_dir}" - - if [ -n "${host_mirror_path}" ]; then - [ -e "${working_dir}/${host_mirror_path}" ] || mkdir -p "${working_dir}/${host_mirror_path}" - mount -o bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}" - mount -o remount,ro,bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}" - fi - - trap 'chroot_umount' EXIT INT QUIT TERM HUP -} - -copy_hostconf () { - chroot "${working_dir}" /bin/findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS > "${working_dir}/etc/mtab" - cp /etc/resolv.conf "${working_dir}/etc/resolv.conf" - echo "Server = ${host_mirror}" > ${working_dir}/etc/pacman.d/mirrorlist -} - -chroot_umount () { - umount "${working_dir}/proc" - umount "${working_dir}/sys" - umount "${working_dir}/dev/pts" - umount "${working_dir}/dev/shm" - umount "${working_dir}/dev" - umount "${working_dir}/${cache_dir}" - [ -n "${host_mirror_path}" ] && umount "${working_dir}/${host_mirror_path}" -} - -chroot_lock () { - # Only reopen the FD if it wasn't handed to us - if [ "$(readlink -f /dev/fd/9)" != "${working_dir}.lock" ]; then - exec 9>"${working_dir}.lock" - fi - - # Lock the chroot. Take note of the FD number. - if ! flock -n 9; then - echo -n "locking chroot..." - flock 9 - echo "done" - fi -} -# }}} - -umask 0022 -if [ "$RUN" != "" ]; then - # run chroot {{{ - #Sanity check - if [ ! -f "${working_dir}/.arch-chroot" ]; then - echo "error: '${working_dir}' does not appear to be a Arch chroot" - echo ' please build the image using mkarchroot' - exit 1 - fi - - chroot_lock - chroot_mount - copy_hostconf - - eval chroot "${working_dir}" ${RUN} - - # }}} -else - # {{{ build chroot - if [ -e "${working_dir}" -a "${FORCE}" = "n" ]; then - echo "error: working dir '${working_dir}' already exists - try using -f" - exit 1 - fi - - if { type -P btrfs && btrfs subvolume create "${working_dir}"; } &>/dev/null; then - chmod 0755 "${working_dir}" - fi - - mkdir -p "${working_dir}/var/lib/pacman/sync" - mkdir -p "${working_dir}/etc/" - - chroot_lock - chroot_mount - - pacargs="--noconfirm --root=${working_dir} --cachedir=${cache_dir}" - if [ "$pac_conf" != "" ]; then - pacargs="$pacargs --config=${pac_conf}" - fi - - if [ $# -ne 0 ]; then - op='-Sy' - if [ "$FORCE" = "y" ]; then - op="${op}f" - fi - if ! pacman ${op} ${pacargs} $@; then - echo 'error: failed to install all packages' - exit 1 - fi - fi - - if [ -d "${working_dir}/lib/modules" ]; then - ldconfig -r "${working_dir}" - fi - - if [ "$pac_conf" != "" -a "$NOCOPY" = "n" ]; then - cp ${pac_conf} ${working_dir}/etc/pacman.conf - fi - - if [ "$makepkg_conf" != "" -a "$NOCOPY" = "n" ]; then - cp ${makepkg_conf} ${working_dir}/etc/makepkg.conf - fi - - if [ -e "${working_dir}/etc/locale.gen" ]; then - sed -i 's@^#\(en_US\|de_DE\)\(\.UTF-8\)@\1\2@' "${working_dir}/etc/locale.gen" - chroot "${working_dir}" locale-gen - fi - - if [ ! -e "${working_dir}/.arch-chroot" ]; then - date +%s > "${working_dir}/.arch-chroot" - fi - # }}} -fi diff --git a/mkarchroot.in b/mkarchroot.in new file mode 100644 index 0000000..8e74c54 --- /dev/null +++ b/mkarchroot.in @@ -0,0 +1,231 @@ +#!/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. + +FORCE='n' +RUN='' +NOCOPY='n' + +working_dir='' + +APPNAME=$(basename "${0}") + +# usage: usage +usage() { + echo "usage ${APPNAME} [options] working-dir [package-list | app]" + echo ' options:' + echo ' -r Run "app" within the context of the chroot' + echo ' -u Update the chroot via pacman' + echo ' -f Force overwrite of files in the working-dir' + echo ' -C Location of a pacman config file' + echo ' -M Location of a makepkg config file' + echo ' -n Do not copy config files into the chroot' + echo ' -c Set pacman cache. Default: /var/cache/pacman/pkg' + echo ' -h This message' + exit $1 +} + +while getopts 'r:ufnhC:M:c:' arg; do + case "${arg}" in + r) RUN="$OPTARG" ;; + u) RUN='/bin/sh -c "pacman -Syu --noconfirm && (pacman -Qqu >/dev/null && pacman -Su --noconfirm || exit 0)"' ;; + f) FORCE='y' ;; + C) pac_conf="$OPTARG" ;; + M) makepkg_conf="$OPTARG" ;; + n) NOCOPY='y' ;; + c) cache_dir="$OPTARG" ;; + h|?) usage 0 ;; + *) echo "invalid argument '${arg}'"; usage 1 ;; + esac +done + +if [ "$EUID" != '0' ]; then + echo 'error: this script must be run as root.' + exit 1 +fi + +shift $(($OPTIND - 1)) + +if [ "$RUN" = '' -a $# -lt 2 ]; then + echo 'you must specify a directory and one or more packages' + usage 1 +elif [ $# -lt 1 ]; then + echo 'you must specify a directory' + usage 1 +fi + +working_dir="$(readlink -f ${1})" +shift 1 + +[ "${working_dir}" = '' ] && echo 'error: please specify a working directory' && usage 1 + +if [ -z "$cache_dir" ]; then + cache_conf=${working_dir}/etc/pacman.conf + [ ! -f $cache_conf ] && cache_conf=${pac_conf:-/etc/pacman.conf} + cache_dir=$( (grep -m 1 '^CacheDir' $cache_conf || echo 'CacheDir = /var/cache/pacman/pkg') | sed 's/CacheDir\s*=\s*//') + unset cache_conf +fi + +if [ -f /etc/pacman.d/mirrorlist ]; then + host_mirror=$(pacman -Sddp extra/devtools 2>/dev/null | sed -E 's#(.*/)extra/os/.*#\1$repo/os/$arch#') +fi +if [ -z "${host_mirror}" ]; then + host_mirror='http://mirrors.kernel.org/archlinux/$repo/os/$arch' +fi +if echo "${host_mirror}" | grep -q 'file://'; then + host_mirror_path=$(echo "${host_mirror}" | sed -E 's#file://(/.*)/\$repo/os/\$arch#\1#g') +fi + +# {{{ functions +chroot_mount() { + [ -e "${working_dir}/sys" ] || mkdir "${working_dir}/sys" + mount -t sysfs sysfs "${working_dir}/sys" + + [ -e "${working_dir}/proc" ] || mkdir "${working_dir}/proc" + mount -t proc proc "${working_dir}/proc" + + [ -e "${working_dir}/dev" ] || mkdir "${working_dir}/dev" + mount -t tmpfs dev "${working_dir}/dev" -o mode=0755,size=10M,nosuid + mknod -m 666 "${working_dir}/dev/null" c 1 3 + mknod -m 666 "${working_dir}/dev/zero" c 1 5 + mknod -m 600 "${working_dir}/dev/console" c 5 1 + mknod -m 644 "${working_dir}/dev/random" c 1 8 + mknod -m 644 "${working_dir}/dev/urandom" c 1 9 + mknod -m 666 "${working_dir}/dev/tty" c 5 0 + mknod -m 666 "${working_dir}/dev/tty0" c 4 0 + mknod -m 666 "${working_dir}/dev/full" c 1 7 + ln -s /proc/kcore "${working_dir}/dev/core" + ln -s /proc/self/fd "${working_dir}/dev/fd" + ln -s /proc/self/fd/0 "${working_dir}/dev/stdin" + ln -s /proc/self/fd/1 "${working_dir}/dev/stdout" + ln -s /proc/self/fd/2 "${working_dir}/dev/stderr" + + [ -e "${working_dir}/dev/shm" ] || mkdir "${working_dir}/dev/shm" + mount -t tmpfs shm "${working_dir}/dev/shm" -o nodev,nosuid,size=128M + + [ -e "${working_dir}/dev/pts" ] || mkdir "${working_dir}/dev/pts" + mount -t devpts devpts "${working_dir}/dev/pts" -o newinstance,ptmxmode=666 + ln -s pts/ptmx "${working_dir}/dev/ptmx" + + [ -e "${cache_dir}" ] || mkdir -p "${cache_dir}" + [ -e "${working_dir}/${cache_dir}" ] || mkdir -p "${working_dir}/${cache_dir}" + mount -o bind "${cache_dir}" "${working_dir}/${cache_dir}" + + if [ -n "${host_mirror_path}" ]; then + [ -e "${working_dir}/${host_mirror_path}" ] || mkdir -p "${working_dir}/${host_mirror_path}" + mount -o bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}" + mount -o remount,ro,bind "${host_mirror_path}" "${working_dir}/${host_mirror_path}" + fi + + trap 'chroot_umount' EXIT INT QUIT TERM HUP +} + +copy_hostconf () { + chroot "${working_dir}" /bin/findmnt -rnu -o SOURCE,TARGET,FSTYPE,OPTIONS > "${working_dir}/etc/mtab" + cp /etc/resolv.conf "${working_dir}/etc/resolv.conf" + echo "Server = ${host_mirror}" > ${working_dir}/etc/pacman.d/mirrorlist +} + +chroot_umount () { + umount "${working_dir}/proc" + umount "${working_dir}/sys" + umount "${working_dir}/dev/pts" + umount "${working_dir}/dev/shm" + umount "${working_dir}/dev" + umount "${working_dir}/${cache_dir}" + [ -n "${host_mirror_path}" ] && umount "${working_dir}/${host_mirror_path}" +} + +chroot_lock () { + # Only reopen the FD if it wasn't handed to us + if [ "$(readlink -f /dev/fd/9)" != "${working_dir}.lock" ]; then + exec 9>"${working_dir}.lock" + fi + + # Lock the chroot. Take note of the FD number. + if ! flock -n 9; then + echo -n "locking chroot..." + flock 9 + echo "done" + fi +} +# }}} + +umask 0022 +if [ "$RUN" != "" ]; then + # run chroot {{{ + #Sanity check + if [ ! -f "${working_dir}/.arch-chroot" ]; then + echo "error: '${working_dir}' does not appear to be a Arch chroot" + echo ' please build the image using mkarchroot' + exit 1 + fi + + chroot_lock + chroot_mount + copy_hostconf + + eval chroot "${working_dir}" ${RUN} + + # }}} +else + # {{{ build chroot + if [ -e "${working_dir}" -a "${FORCE}" = "n" ]; then + echo "error: working dir '${working_dir}' already exists - try using -f" + exit 1 + fi + + if { type -P btrfs && btrfs subvolume create "${working_dir}"; } &>/dev/null; then + chmod 0755 "${working_dir}" + fi + + mkdir -p "${working_dir}/var/lib/pacman/sync" + mkdir -p "${working_dir}/etc/" + + chroot_lock + chroot_mount + + pacargs="--noconfirm --root=${working_dir} --cachedir=${cache_dir}" + if [ "$pac_conf" != "" ]; then + pacargs="$pacargs --config=${pac_conf}" + fi + + if [ $# -ne 0 ]; then + op='-Sy' + if [ "$FORCE" = "y" ]; then + op="${op}f" + fi + if ! pacman ${op} ${pacargs} $@; then + echo 'error: failed to install all packages' + exit 1 + fi + fi + + if [ -d "${working_dir}/lib/modules" ]; then + ldconfig -r "${working_dir}" + fi + + if [ "$pac_conf" != "" -a "$NOCOPY" = "n" ]; then + cp ${pac_conf} ${working_dir}/etc/pacman.conf + fi + + if [ "$makepkg_conf" != "" -a "$NOCOPY" = "n" ]; then + cp ${makepkg_conf} ${working_dir}/etc/makepkg.conf + fi + + if [ -e "${working_dir}/etc/locale.gen" ]; then + sed -i 's@^#\(en_US\|de_DE\)\(\.UTF-8\)@\1\2@' "${working_dir}/etc/locale.gen" + chroot "${working_dir}" locale-gen + fi + + if [ ! -e "${working_dir}/.arch-chroot" ]; then + date +%s > "${working_dir}/.arch-chroot" + fi + # }}} +fi diff --git a/rebuildpkgs b/rebuildpkgs deleted file mode 100755 index be279bb..0000000 --- a/rebuildpkgs +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -# This script rebuilds a list of packages in order -# and reports anything that fails -# -# Due to sudo usage, it is recommended to allow makechrootpkg -# to be run with NOPASSWD in your sudoers file -# -# FIXME -# Currently uses $(pwd)/rebuilds as the directory for rebuilding... -# TODO make this work for community too - -if [ $# -le 1 ]; then - echo "usage: $(basename $0) " - echo " example: $(basename $0) ~/chroot readline bash foo bar baz" - exit 1 -fi - -# Source makepkg.conf; fail if it is not found -if [ -r '/etc/makepkg.conf' ]; then - source '/etc/makepkg.conf' -else - echo '/etc/makepkg.conf not found!' - exit 1 -fi - -die () { - echo $@ >&2 - exit 1 -} - -bump_pkgrel() { - # Get the current pkgrel from SVN and update the working copy with it - # This prevents us from incrementing out of control :) - pbuild='.svn/text-base/PKGBUILD.svn-base' - oldrel=$(grep 'pkgrel=' $pbuild | cut -d= -f2) - - #remove decimals - rel=$(echo $oldrel | cut -d. -f1) - - newrel=$(($rel + 1)) - - sed -i "s/pkgrel=$oldrel/pkgrel=$newrel/" PKGBUILD -} - -pkg_from_pkgbuild() { - # we want the sourcing to be done in a subshell so we don't pollute our current namespace - export CARCH PKGEXT - (source PKGBUILD; echo "$pkgname-$pkgver-$pkgrel-$CARCH$PKGEXT") -} - -chrootdir="$1"; shift -pkgs="$@" - -SVNPATH='svn+ssh://gerolde.archlinux.org/srv/svn-packages' - -echo ":: Work will be done in $(pwd)/rebuilds" - -REBUILD_ROOT="$(pwd)/rebuilds" -mkdir -p "$REBUILD_ROOT" -cd "$REBUILD_ROOT" - -/usr/bin/svn co -N $SVNPATH - -FAILED="" -for pkg in $pkgs; do - cd "$REBUILD_ROOT/svn-packages" - - echo ":: Building '$pkg'" - /usr/bin/svn update "$pkg" - if [ ! -d "$pkg/trunk" ]; then - FAILED="$FAILED $pkg" - echo ":: $pkg does not exist in SVN" - continue - fi - cd "$pkg/trunk/" - - bump_pkgrel - - if ! sudo makechrootpkg -u -d -r "$chrootdir" -- --noconfirm; then - FAILED="$FAILED $pkg" - echo ":: $pkg Failed!" - else - pkgfile=$(pkg_from_pkgbuild) - if [ -e "$pkgfile" ]; then - echo ":: $pkg Complete" - else - FAILED="$FAILED $pkg" - echo ":: $pkg Failed, no package built!" - fi - fi -done - -cd "$REBUILD_ROOT" -if [ "$FAILED" != "" ]; then - echo 'Packages failed:' - for pkg in $FAILED; do - echo -e "\t$pkg" - done -fi - -echo 'SVN pkgbumps in svn-packages/ - commit when ready' diff --git a/rebuildpkgs.in b/rebuildpkgs.in new file mode 100644 index 0000000..be279bb --- /dev/null +++ b/rebuildpkgs.in @@ -0,0 +1,101 @@ +#!/bin/bash +# This script rebuilds a list of packages in order +# and reports anything that fails +# +# Due to sudo usage, it is recommended to allow makechrootpkg +# to be run with NOPASSWD in your sudoers file +# +# FIXME +# Currently uses $(pwd)/rebuilds as the directory for rebuilding... +# TODO make this work for community too + +if [ $# -le 1 ]; then + echo "usage: $(basename $0) " + echo " example: $(basename $0) ~/chroot readline bash foo bar baz" + exit 1 +fi + +# Source makepkg.conf; fail if it is not found +if [ -r '/etc/makepkg.conf' ]; then + source '/etc/makepkg.conf' +else + echo '/etc/makepkg.conf not found!' + exit 1 +fi + +die () { + echo $@ >&2 + exit 1 +} + +bump_pkgrel() { + # Get the current pkgrel from SVN and update the working copy with it + # This prevents us from incrementing out of control :) + pbuild='.svn/text-base/PKGBUILD.svn-base' + oldrel=$(grep 'pkgrel=' $pbuild | cut -d= -f2) + + #remove decimals + rel=$(echo $oldrel | cut -d. -f1) + + newrel=$(($rel + 1)) + + sed -i "s/pkgrel=$oldrel/pkgrel=$newrel/" PKGBUILD +} + +pkg_from_pkgbuild() { + # we want the sourcing to be done in a subshell so we don't pollute our current namespace + export CARCH PKGEXT + (source PKGBUILD; echo "$pkgname-$pkgver-$pkgrel-$CARCH$PKGEXT") +} + +chrootdir="$1"; shift +pkgs="$@" + +SVNPATH='svn+ssh://gerolde.archlinux.org/srv/svn-packages' + +echo ":: Work will be done in $(pwd)/rebuilds" + +REBUILD_ROOT="$(pwd)/rebuilds" +mkdir -p "$REBUILD_ROOT" +cd "$REBUILD_ROOT" + +/usr/bin/svn co -N $SVNPATH + +FAILED="" +for pkg in $pkgs; do + cd "$REBUILD_ROOT/svn-packages" + + echo ":: Building '$pkg'" + /usr/bin/svn update "$pkg" + if [ ! -d "$pkg/trunk" ]; then + FAILED="$FAILED $pkg" + echo ":: $pkg does not exist in SVN" + continue + fi + cd "$pkg/trunk/" + + bump_pkgrel + + if ! sudo makechrootpkg -u -d -r "$chrootdir" -- --noconfirm; then + FAILED="$FAILED $pkg" + echo ":: $pkg Failed!" + else + pkgfile=$(pkg_from_pkgbuild) + if [ -e "$pkgfile" ]; then + echo ":: $pkg Complete" + else + FAILED="$FAILED $pkg" + echo ":: $pkg Failed, no package built!" + fi + fi +done + +cd "$REBUILD_ROOT" +if [ "$FAILED" != "" ]; then + echo 'Packages failed:' + for pkg in $FAILED; do + echo -e "\t$pkg" + done +fi + +echo 'SVN pkgbumps in svn-packages/ - commit when ready' diff --git a/zsh_completion b/zsh_completion deleted file mode 100644 index d87850a..0000000 --- a/zsh_completion +++ /dev/null @@ -1,81 +0,0 @@ -#compdef archbuild archco archrelease archrm commitpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-i686-build=archbuild extra-x86_64-build=archbuild testing-i686-build=archbuild testing-x86_64-build=archbuild staging-i686-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild communityco=archco - -_arch=(i686 x86_64 any) - -_tags=( - core-i686 core-x86_64 core-any - extra-i686 extra-x86_64 extra-any - multilib-i686 multilib-x86_64 multilib-any - staging-i686 staging-x86_64 staging-any - testing-i686 testing-x86_64 testing-any - multilib-testing-i686 multilib-testing-x86_64 multilib-testing-any - community-i686 community-x86_64 community-any - community-staging-i686 community-staging-x86_64 community-staging-any - community-testing-i686 community-testing-x86_64 community-testing-any -) - -_archbuild_args=( - '-c[Recreate the chroot before building]' - '-r[Create chroots in this directory]:base_dir:_files -/' -) - -_archco_args=( - '*:packages:_devtools_completions_all_packages' -) - -_archrelease_args=( - "*:arch:($_tags[*])" -) - -_archrm_args=( - '1:path:_files -/' -) - -_commitpkg_args=( - "-a[Release to a specific architecture only]:arch:($_arch[*])" - '-l[Set bandwidth limit]:limit' - '1:commit_msg' -) - -_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=( - '-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]' - '-C[Location of a pacman config file]:pacman_config:_files' - '-M[Location of a makepkg config file]:makepkg_config:_files' - '-n[Do not copy config files into the chroot]' - '-c[Set pacman cache]:pacman_cache:_files -/' - '-h[Display usage]' -) - -_rebuildpkgs_args=( - '1:chroot_dir:_files -/' - '*:packages:_devtools_completions_all_packages' -) - -_devtools_completions_all_packages() { - typeset -U packages - packages=($(_call_program packages pacman -Sql)) - compadd - "${(@)packages}" -} - -_devtools() { - local argname="_${service}_args[@]" - _arguments -s "${(P)argname}" -} - -_devtools diff --git a/zsh_completion.in b/zsh_completion.in new file mode 100644 index 0000000..d87850a --- /dev/null +++ b/zsh_completion.in @@ -0,0 +1,81 @@ +#compdef archbuild archco archrelease archrm commitpkg finddeps makechrootpkg mkarchroot rebuildpkgs extrapkg=commitpkg corepkg=commitpkg testingpkg=commitpkg stagingpkg=commitpkg communitypkg=commitpkg community-testingpkg=commitpkg community-stagingpkg=commitpkg multilibpkg=commitpkg multilib-testingpkg=commitpkg extra-i686-build=archbuild extra-x86_64-build=archbuild testing-i686-build=archbuild testing-x86_64-build=archbuild staging-i686-build=archbuild staging-x86_64-build=archbuild multilib-build=archbuild multilib-testing-build=archbuild communityco=archco + +_arch=(i686 x86_64 any) + +_tags=( + core-i686 core-x86_64 core-any + extra-i686 extra-x86_64 extra-any + multilib-i686 multilib-x86_64 multilib-any + staging-i686 staging-x86_64 staging-any + testing-i686 testing-x86_64 testing-any + multilib-testing-i686 multilib-testing-x86_64 multilib-testing-any + community-i686 community-x86_64 community-any + community-staging-i686 community-staging-x86_64 community-staging-any + community-testing-i686 community-testing-x86_64 community-testing-any +) + +_archbuild_args=( + '-c[Recreate the chroot before building]' + '-r[Create chroots in this directory]:base_dir:_files -/' +) + +_archco_args=( + '*:packages:_devtools_completions_all_packages' +) + +_archrelease_args=( + "*:arch:($_tags[*])" +) + +_archrm_args=( + '1:path:_files -/' +) + +_commitpkg_args=( + "-a[Release to a specific architecture only]:arch:($_arch[*])" + '-l[Set bandwidth limit]:limit' + '1:commit_msg' +) + +_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=( + '-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]' + '-C[Location of a pacman config file]:pacman_config:_files' + '-M[Location of a makepkg config file]:makepkg_config:_files' + '-n[Do not copy config files into the chroot]' + '-c[Set pacman cache]:pacman_cache:_files -/' + '-h[Display usage]' +) + +_rebuildpkgs_args=( + '1:chroot_dir:_files -/' + '*:packages:_devtools_completions_all_packages' +) + +_devtools_completions_all_packages() { + typeset -U packages + packages=($(_call_program packages pacman -Sql)) + compadd - "${(@)packages}" +} + +_devtools() { + local argname="_${service}_args[@]" + _arguments -s "${(P)argname}" +} + +_devtools -- cgit v1.2.3-70-g09d2 From 21daec135add61bf0af74c1277b4f3eeff9cca64 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 29 Aug 2011 10:53:51 +0200 Subject: Makefile: Add a cleanup target Allows for using `make clean` to remove any output files generated by make(1). Signed-off-by: Lukas Fleischer --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 47378ff..9249da6 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,9 @@ all: $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion @chmod a-w "$@" @chmod +x "$@" +clean: + rm -f $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion + install: install -dm0755 $(DESTDIR)$(PREFIX)/bin install -dm0755 $(DESTDIR)$(PREFIX)/sbin @@ -84,4 +87,4 @@ dist: upload: scp devtools-$(V).tar.gz gerolde.archlinux.org:/srv/ftp/other/devtools/ -.PHONY: all install uninstall dist upload +.PHONY: all clean install uninstall dist upload -- cgit v1.2.3-70-g09d2 From 733668f4ccb42aba30b17811f3c9a1091de64cc2 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 14:46:10 +0200 Subject: makechrootpkg: Bashify syntax No functional change. Eliminates unused variables RUN and FORCE. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 224 +++++++++++++++++++++++++++---------------------------- 1 file changed, 111 insertions(+), 113 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index a60c9fe..6e1e37e 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -8,27 +8,22 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -FORCE='n' -RUN='' -MAKEPKG_ARGS='-s --noconfirm' -REPACK='' -WORKDIR=$PWD - -update_first='0' -clean_first='0' -install_pkg='' -add_to_db=0 - -chrootdir='' - -APPNAME=$(basename "${0}") +workdir="$PWD" +makepkg_args='-s --noconfirm' +repack=false +update_first=false +clean_first=false +install_pkg= +add_to_db=false +chrootdir= +appname=${0##*/} default_copy=$USER [[ -n $SUDO_USER ]] && default_copy=$SUDO_USER [[ -z $default_copy || $default_copy = root ]] && default_copy=copy usage() { - echo "usage ${APPNAME} [options] -r [--] [makepkg args]" + echo "usage $appname [options] -r [--] [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.' @@ -41,7 +36,7 @@ usage() { echo 'command:' echo ' mkarchroot /root base base-devel sudo' echo '' - echo "Default makepkg args: $MAKEPKG_ARGS" + echo "Default makepkg args: $makepkg_args" echo '' echo 'Flags:' echo '-h This help' @@ -59,22 +54,22 @@ usage() { } while getopts 'hcudr:I:l:' arg; do - case "${arg}" in + case "$arg" in h) usage ;; - c) clean_first=1 ;; - u) update_first=1 ;; - d) add_to_db=1 ;; + c) clean_first=true ;; + u) update_first=true ;; + d) add_to_db=true ;; r) chrootdir="$OPTARG" ;; I) install_pkg="$OPTARG" ;; l) copy="$OPTARG" ;; - *) MAKEPKG_ARGS="$MAKEPKG_ARGS -$arg $OPTARG" ;; + *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; esac done # Canonicalize chrootdir, getting rid of trailing / chrootdir=$(readlink -e "$chrootdir") -if [[ ${copy:0:1} = "/" ]]; then +if [[ ${copy:0:1} = / ]]; then copydir=$copy else [[ -z $copy ]] && copy=$default_copy @@ -82,32 +77,32 @@ else fi # Pass all arguments after -- right to makepkg -MAKEPKG_ARGS="$MAKEPKG_ARGS ${*:$OPTIND}" +makepkg_args="$makepkg_args ${*:$OPTIND}" # See if -R was passed to makepkg for arg in ${*:$OPTIND}; do - if [ "$arg" = '-R' ]; then - REPACK=1 - break; + if [[ $arg = -R ]]; then + repack=1 + break fi done -if [ "$EUID" != '0' ]; then +if (( EUID )); then echo 'This script must be run as root.' exit 1 fi -if [ ! -f PKGBUILD -a -z "$install_pkg" ]; then +if [[ ! -f PKGBUILD && -z $install_pkg ]]; then echo 'This must be run in a directory containing a PKGBUILD.' exit 1 fi -if [ ! -d "$chrootdir" ]; then +if [[ ! -d $chrootdir ]]; then echo "No chroot dir defined, or invalid path '$chrootdir'" exit 1 fi -if [ ! -d "$chrootdir/root" ]; then +if [[ ! -d $chrootdir/root ]]; then echo 'Missing chroot dir root directory.' echo "Try using: mkarchroot $chrootdir/root base base-devel sudo" usage @@ -124,7 +119,7 @@ if ! flock -n 9; then echo "done" fi -if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then +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 exec 8>"$chrootdir/root.lock" @@ -138,8 +133,9 @@ if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then echo -n '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 + [[ -d $copydir ]] && btrfs subvolume delete "$copydir" &>/dev/null + btrfs subvolume snapshot "$chrootdir/root" "$copydir" &>/dev/null || + use_rsync=true else use_rsync=true fi @@ -154,152 +150,154 @@ if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then exec 8>&- fi -if [ -n "$install_pkg" ]; then - pkgname="$(basename "$install_pkg")" +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 -if [ $update_first -eq 1 ]; then - mkarchroot -u "$copydir" -fi +$update_first && mkarchroot -u "$copydir" -[ -d "$copydir/build" ] || mkdir "$copydir/build" +mkdir -p "$copydir/build" -if [ "$REPACK" != "1" ]; then - # Remove anything in there UNLESS -R (repack) was passed to makepkg - rm -rf "$copydir/build/"* -fi +# Remove anything in there UNLESS -R (repack) was passed to makepkg +$repack || rm -rf "$copydir"/build/* # Read .makepkg.conf even if called via sudo -if [ -n "${SUDO_USER}" ]; then - makepkg_conf="/$(eval echo ~${SUDO_USER})/.makepkg.conf" +if [[ -n $SUDO_USER ]]; then + makepkg_conf="$(eval echo ~$SUDO_USER)/.makepkg.conf" else - makepkg_conf="~/.makepkg.conf" + makepkg_conf="$HOME/.makepkg.conf" 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}") +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) -[ -d "$copydir/pkgdest" ] || mkdir "$copydir/pkgdest" -if ! grep 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then +[[ -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) + +mkdir -p "$copydir/pkgdest" +if ! grep -q 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf"; then echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf" fi -[ -d "$copydir/srcdest" ] || mkdir "$copydir/srcdest" -if ! grep 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then +mkdir -p "$copydir/srcdest" +if ! grep -q 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf"; then echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf" fi -[ -z "${MAKEFLAGS}" ] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) -if [ -n "${MAKEFLAGS}" ]; then - sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" - echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" + +if [[ -n $MAKEFLAGS ]]; then + sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" + echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" fi -[ -z "${PACKAGER}" ] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) -if [ -n "${PACKAGER}" ]; then - sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf" - echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf" + +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 -source=($(. PKGBUILD; echo ${source[@]})) +source=( $(source PKGBUILD; echo ${source[@]}) ) cp PKGBUILD "$copydir/build/" -for f in ${source[@]}; do - basef=$(echo $f | sed 's|::.*||' | sed 's|^.*://.*/||g') - if [ -f "$basef" ]; then - cp "$basef" "$copydir/srcdest/" - elif [ -f "$SRCDEST/$basef" ]; then - cp "$SRCDEST/$basef" "$copydir/srcdest/" +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 -( . PKGBUILD -for i in 'changelog' 'install'; do - filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) - for file in $filelist; do - # evaluate any bash variables used - eval file=${file} - if [[ -f "$file" ]]; then - cp "$file" "$copydir/build/" - fi +( + source PKGBUILD + for i in changelog install; do + sed -n "s/^[[:space:]]*$i=//p" PKGBUILD | while IFS= read -r file; do + # evaluate any bash variables used + eval file="$file" + [[ -f $file ]] && cp "$file" "$copydir/build/" + done done -done ) -chown -R nobody "$copydir/build" -chown -R nobody "$copydir/srcdest" -chown -R nobody "$copydir/pkgdest" +chown -R nobody "$copydir"/{build,pkgdest,srcdest} echo 'nobody ALL = NOPASSWD: /usr/bin/pacman' > "$copydir/etc/sudoers.d/nobody-pacman" 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" </dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log + exit 0 EOF -) > "$copydir/chrootbuild" chmod +x "$copydir/chrootbuild" if mkarchroot -r "/chrootbuild" "$copydir"; then - for pkgfile in "${copydir}"/pkgdest/*.pkg.tar.*; do - [ -e "$pkgfile" ] || continue - if [ "$add_to_db" -eq "1" ]; then - mkdir -p "${copydir}/repo" - pushd "${copydir}/repo" >/dev/null + for pkgfile in "$copydir"/pkgdest/*.pkg.tar.*; do + [[ -e $pkgfile ]] || continue + if $add_to_db; then + mkdir -p "$copydir/repo" + pushd "$copydir/repo" >/dev/null cp "$pkgfile" . - repo-add repo.db.tar.gz "$(basename "$pkgfile")" + repo-add repo.db.tar.gz "${pkgfile##*/}" popd >/dev/null fi - if [ -d "$PKGDEST" ]; then - mv "$pkgfile" "${PKGDEST}" + if [[ -d $PKGDEST ]]; then + mv "$pkgfile" "$PKGDEST" else - mv "$pkgfile" "${WORKDIR}" + mv "$pkgfile" "$workdir" fi done - for l in "${copydir}"/build/{namcap,*-{build,check,package,package_*}}.log; do - [ -f "$l" ] && mv "$l" "${WORKDIR}" + for l in "$copydir"/build/{namcap,*-{build,check,package,package_*}}.log; do + [[ -f $l ]] && mv "$l" "$workdir" done else - #just in case. We returned 1, make sure we fail - touch "${copydir}/build/BUILD_FAILED" + # Just in case. We returned 1, make sure we fail + touch "$copydir/build/BUILD_FAILED" fi -for f in "${copydir}"/srcdest/*; do - [ -e "$f" ] || continue - if [ -d "$SRCDEST" ]; then - mv "$f" "${SRCDEST}" +for f in "$copydir"/srcdest/*; do + [[ -e $f ]] || continue + if [[ -d $SRCDEST ]]; then + mv "$f" "$SRCDEST" else - mv "$f" "${WORKDIR}" + mv "$f" "$workdir" fi done -if [ -e "${copydir}/build/BUILD_FAILED" ]; then +if [[ -e $copydir/build/BUILD_FAILED ]]; then echo "Build failed, check $copydir/build" - rm "${copydir}/build/BUILD_FAILED" + rm "$copydir/build/BUILD_FAILED" exit 1 fi -- cgit v1.2.3-70-g09d2 From 004ced2a33c06985d88b424d88facb0d8b1bdd27 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 14:51:58 +0200 Subject: makechrootpkg: Eliminate appname, only used once Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 6e1e37e..5538e95 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -16,14 +16,13 @@ clean_first=false install_pkg= add_to_db=false chrootdir= -appname=${0##*/} default_copy=$USER [[ -n $SUDO_USER ]] && default_copy=$SUDO_USER [[ -z $default_copy || $default_copy = root ]] && default_copy=copy usage() { - echo "usage $appname [options] -r [--] [makepkg args]" + echo "usage ${0##*/} [options] -r [--] [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.' -- cgit v1.2.3-70-g09d2 From e41deee5e5d471e90b951b1f68db5dc50c343b0c Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 14:56:49 +0200 Subject: makechrootpkg: Replace $workdir with . ($PWD) $workdir is never used when we change directory, so it's superfluous. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 5538e95..eb23c61 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -8,7 +8,6 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -workdir="$PWD" makepkg_args='-s --noconfirm' repack=false update_first=false @@ -274,12 +273,12 @@ if mkarchroot -r "/chrootbuild" "$copydir"; then if [[ -d $PKGDEST ]]; then mv "$pkgfile" "$PKGDEST" else - mv "$pkgfile" "$workdir" + mv "$pkgfile" . fi done for l in "$copydir"/build/{namcap,*-{build,check,package,package_*}}.log; do - [[ -f $l ]] && mv "$l" "$workdir" + [[ -f $l ]] && mv "$l" . done else # Just in case. We returned 1, make sure we fail @@ -291,7 +290,7 @@ for f in "$copydir"/srcdest/*; do if [[ -d $SRCDEST ]]; then mv "$f" "$SRCDEST" else - mv "$f" "$workdir" + mv "$f" . fi done -- cgit v1.2.3-70-g09d2 From 1df679974786fe4282fd675574d92a464c28f7cb Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:05:35 +0200 Subject: makechrootpkg: Always set PKGDEST and SRCDEST Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index eb23c61..1bed6b8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -188,6 +188,10 @@ fi [[ -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" @@ -270,11 +274,7 @@ if mkarchroot -r "/chrootbuild" "$copydir"; then popd >/dev/null fi - if [[ -d $PKGDEST ]]; then - mv "$pkgfile" "$PKGDEST" - else - mv "$pkgfile" . - fi + mv "$pkgfile" "$PKGDEST" done for l in "$copydir"/build/{namcap,*-{build,check,package,package_*}}.log; do @@ -287,11 +287,7 @@ fi for f in "$copydir"/srcdest/*; do [[ -e $f ]] || continue - if [[ -d $SRCDEST ]]; then - mv "$f" "$SRCDEST" - else - mv "$f" . - fi + mv "$f" "$SRCDEST" done if [[ -e $copydir/build/BUILD_FAILED ]]; then -- cgit v1.2.3-70-g09d2 From b9070bf0b8b6e8f154c718074058dba9c03b01e0 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:14:08 +0200 Subject: makechrootpkg: Use nullglob Use nullglob instead of checking for existence. If the glob doesn't match any files, it will be removed instead of staying unexpanded. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 1bed6b8..11fa401 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -8,6 +8,8 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. +shopt -s nullglob + makepkg_args='-s --noconfirm' repack=false update_first=false @@ -265,7 +267,6 @@ chmod +x "$copydir/chrootbuild" if mkarchroot -r "/chrootbuild" "$copydir"; then for pkgfile in "$copydir"/pkgdest/*.pkg.tar.*; do - [[ -e $pkgfile ]] || continue if $add_to_db; then mkdir -p "$copydir/repo" pushd "$copydir/repo" >/dev/null @@ -286,7 +287,6 @@ else fi for f in "$copydir"/srcdest/*; do - [[ -e $f ]] || continue mv "$f" "$SRCDEST" done -- cgit v1.2.3-70-g09d2 From 7a9f808a0fd80c14b32223fa73d5368294994e49 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:50:30 +0200 Subject: makechrootpkg: Source PKGBUILD only once Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 11fa401..04893b8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -219,20 +219,20 @@ eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf") export CARCH # Copy PKGBUILD and sources -source=( $(source PKGBUILD; echo ${source[@]}) ) cp PKGBUILD "$copydir/build/" -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 - ( 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 sed -n "s/^[[:space:]]*$i=//p" PKGBUILD | while IFS= read -r file; do # evaluate any bash variables used -- cgit v1.2.3-70-g09d2 From e66a1f3cd85b22cd5113684acdad50e5c077662e Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:59:57 +0200 Subject: makechrootpkg: Add option to explicitly run namcap Installs namcap if needed, *after* building the package, contrary to the former way of having to have namcap installed, e.g. via makedepends. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 04893b8..6bedf03 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -16,6 +16,7 @@ update_first=false clean_first=false install_pkg= add_to_db=false +run_namcap=false chrootdir= default_copy=$USER @@ -49,11 +50,12 @@ usage() { echo '-I Install a package into the working copy of the chroot' echo '-l The directory to use as the working copy of the chroot' echo ' Useful for maintaining multiple copies.' + echo '-n Run namcap on the package' echo " Default: $default_copy" exit 1 } -while getopts 'hcudr:I:l:' arg; do +while getopts 'hcudr:I:l:n' arg; do case "$arg" in h) usage ;; c) clean_first=true ;; @@ -62,6 +64,7 @@ while getopts 'hcudr:I:l:' arg; do r) chrootdir="$OPTARG" ;; I) install_pkg="$OPTARG" ;; l) copy="$OPTARG" ;; + n) run_namcap=true ;; *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; esac done @@ -259,7 +262,10 @@ sudo -u nobody makepkg $makepkg_args || touch BUILD_FAILED [[ -f BUILD_FAILED ]] && exit 1 -which namcap &>/dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log +if $run_namcap; then + pacman -S --needed --noconfirm namcap + namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log +fi exit 0 EOF -- cgit v1.2.3-70-g09d2 From a790c39c7dc3074e26b780054b0fc5a33eaa4a2b Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 16:47:39 +0200 Subject: makechrootpkg: If chroot is missing, exit instead of usage I'm not sure why this was handled differently than the other error conditions. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 6bedf03..092f195 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -108,7 +108,7 @@ fi if [[ ! -d $chrootdir/root ]]; then echo 'Missing chroot dir root directory.' echo "Try using: mkarchroot $chrootdir/root base base-devel sudo" - usage + exit 1 fi umask 0022 -- cgit v1.2.3-70-g09d2 From 022cd3d523a416ec2eba99220b82bfff40875c9d Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 8 Sep 2011 16:38:28 -0500 Subject: archrelease: call 'svn copy' once for all files We don't need to invoke svn copy on each file; it accepts multiple arguments. This cut Allan's time releasing one patch-friendly package from 5 minutes to 2 minutes. Signed-off-by: Dan McGee Signed-off-by: Lukas Fleischer --- archrelease.in | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/archrelease.in b/archrelease.in index 2f6a563..7bb4c8a 100644 --- a/archrelease.in +++ b/archrelease.in @@ -52,9 +52,8 @@ for tag in "$@"; do svn add --parents -q "repos/$tag" fi - for file in "${known_files[@]}"; do - svn copy -q -r HEAD "$trunk/$file" "repos/$tag/" - done + # copy all files at once from trunk to the subdirectory in repos/ + svn copy -q -r HEAD ${known_files[@]/#/$trunk/} "repos/$tag/" echo 'done' done -- cgit v1.2.3-70-g09d2 From a991c9a71f92aa24fd445e6189a6ac07c4ddb77c Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Tue, 27 Sep 2011 14:42:14 +1000 Subject: Always log builds in makechrootpkg It is very helpful to always log the build output in makechrootpkg so pass "-L" as a standard option to makepkg. Signed-off-by: Allan McRae Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 092f195..43acc3f 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -10,7 +10,7 @@ shopt -s nullglob -makepkg_args='-s --noconfirm' +makepkg_args='-s --noconfirm -L' repack=false update_first=false clean_first=false -- cgit v1.2.3-70-g09d2 From fe2040cd145344bfbe006e89c79348cce2ad2e13 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Wed, 12 Oct 2011 16:26:29 +0200 Subject: archrelease: Fix SVN error when repository is empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If trash is empty, `svn rm -q "${trash[@]}"` fails with: svn: Try 'svn help' for more info and then svn: Not enough arguments provided This doesn't result in any further malfunction but is kind of confusing and unexpected. Skipping `svn rm` on an empty trash fixes this. Reported-by: Alexander Rødseth Signed-off-by: Lukas Fleischer --- archrelease.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archrelease.in b/archrelease.in index 7bb4c8a..2f7725e 100644 --- a/archrelease.in +++ b/archrelease.in @@ -46,7 +46,7 @@ for tag in "$@"; do while read -r file; do trash+=("repos/$tag/$file") done < <(svn ls "repos/$tag") - svn rm -q "${trash[@]}" + [[ $trash ]] && svn rm -q "${trash[@]}" else mkdir -p "repos/$tag" svn add --parents -q "repos/$tag" -- cgit v1.2.3-70-g09d2 From 4800be25c2089927b340f01d974ae2707bca8a86 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:40:31 +0200 Subject: finddeps: Proper quoting, use double brackets Signed-off-by: Lukas Fleischer --- finddeps.in | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/finddeps.in b/finddeps.in index ded7a93..0d59634 100644 --- a/finddeps.in +++ b/finddeps.in @@ -3,7 +3,10 @@ # finddeps - find packages that depend on a given depname # -if [ "$1" = '' ]; then +match=$1 +tld=$(pwd) + +if [[ -z $match ]]; then echo 'usage: finddeps ' echo '' echo 'Find packages that depend on a given depname.' @@ -12,35 +15,26 @@ if [ "$1" = '' ]; then exit 0 fi -match=$1 -tld=$(pwd) - -for d in $(find . -type d); do - cd $d - if [ -f PKGBUILD ]; then +for d in "$(find . -type d)"; do + cd "$d" + if [[ -f PKGBUILD ]]; then unset pkgname depends makedepends . PKGBUILD for dep in "${depends[@]}"; do # lose the version comparator, if any depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (depends)" - fi + [[ $depname = $match ]] && echo "$d (depends)" done for dep in "${makedepends[@]}"; do # lose the version comparator, if any depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (makedepends)" - fi + [[ $depname = $match ]] && echo "$d (makedepends)" done for dep in "${optdepends[@]/:*}"; do # lose the version comaparator, if any depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (optdepends)" - fi + [[ $depname = $match ]] && echo "$d (optdepends)" done fi - cd $tld + cd "$tld" done -- cgit v1.2.3-70-g09d2 From 8edb443c125cb668e6609b5ff696e565b15a6069 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:43:26 +0200 Subject: finddeps: Remove redundant cd(1) Source the PKGBUILD using the correct path (relative to our base directory) instead of using cd(1) to switch to the ABS base directory first and to the package directory afterwards. This is very useful when trying to track errors, also: $ ~/src/devtools/finddeps libdaq ./community/snort (depends) PKGBUILD: line 17: ruby: command not found PKGBUILD: line 19: [: =: unary operator expected Versus: $ ~/src/devtools/finddeps libdaq ./community/snort (depends) ./community/ruby-pkgconfig/PKGBUILD: line 17: ruby: command not found ./community/lmms/PKGBUILD: line 19: [: =: unary operator expected Signed-off-by: Lukas Fleischer --- finddeps.in | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/finddeps.in b/finddeps.in index 0d59634..ec8cde4 100644 --- a/finddeps.in +++ b/finddeps.in @@ -4,7 +4,6 @@ # match=$1 -tld=$(pwd) if [[ -z $match ]]; then echo 'usage: finddeps ' @@ -16,10 +15,9 @@ if [[ -z $match ]]; then fi for d in "$(find . -type d)"; do - cd "$d" - if [[ -f PKGBUILD ]]; then + if [[ -f "$d/PKGBUILD" ]]; then unset pkgname depends makedepends - . PKGBUILD + . "$d/PKGBUILD" for dep in "${depends[@]}"; do # lose the version comparator, if any depname=${dep%%[<>=]*} @@ -36,5 +34,4 @@ for d in "$(find . -type d)"; do [[ $depname = $match ]] && echo "$d (optdepends)" done fi - cd "$tld" done -- cgit v1.2.3-70-g09d2 From 84b789f760e91bcbcf035cca5d40c40032ad87dd Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:48:13 +0200 Subject: finddeps: Use read builtin to iterate over packages Using parameter substitution might result in unpredictable behaviour when directories contain whitespaces here. The read shell builtin is the proper way to read single lines. Signed-off-by: Lukas Fleischer --- finddeps.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/finddeps.in b/finddeps.in index ec8cde4..3f4515b 100644 --- a/finddeps.in +++ b/finddeps.in @@ -14,7 +14,7 @@ if [[ -z $match ]]; then exit 0 fi -for d in "$(find . -type d)"; do +find . -type d | while read d; do if [[ -f "$d/PKGBUILD" ]]; then unset pkgname depends makedepends . "$d/PKGBUILD" -- cgit v1.2.3-70-g09d2 From dcb80e7b5c57b14bbab2858c6c863d8f224ba43b Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:52:09 +0200 Subject: finddeps: Unset optdepends The optdepends array should be unset before sourcing the PKGBUILD to avoid dangling optional depends. Signed-off-by: Lukas Fleischer --- finddeps.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/finddeps.in b/finddeps.in index 3f4515b..4651fd9 100644 --- a/finddeps.in +++ b/finddeps.in @@ -16,7 +16,7 @@ fi find . -type d | while read d; do if [[ -f "$d/PKGBUILD" ]]; then - unset pkgname depends makedepends + unset pkgname depends makedepends optdepends . "$d/PKGBUILD" for dep in "${depends[@]}"; do # lose the version comparator, if any -- cgit v1.2.3-70-g09d2 From a0c6bf4556e211037b9d9d6de3fd17f798a3c1fb Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 13 Oct 2011 11:03:35 +0200 Subject: Honor TMPDIR environment variable Replace all mktemp(1) invocations that hardcode "/tmp" with `mktemp --tmpdir` and change templates accordingly. Note that "--tmpdir" is GNU-ish which is okay given that we currently support Arch Linux only anyway. Signed-off-by: Lukas Fleischer --- checkpkg.in | 2 +- lddd.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/checkpkg.in b/checkpkg.in index 94a7529..cde3dc2 100644 --- a/checkpkg.in +++ b/checkpkg.in @@ -24,7 +24,7 @@ if [[ $arch == 'any' ]]; then fi STARTDIR=$(pwd) -TEMPDIR=$(mktemp -d /tmp/checkpkg-script.XXXX) +TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) cd "$TEMPDIR" for _pkgname in "${pkgname[@]}"; do diff --git a/lddd.in b/lddd.in index 9695c9b..c011674 100644 --- a/lddd.in +++ b/lddd.in @@ -9,7 +9,7 @@ IFS="${IFS}:" libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" extras= -TEMPDIR=$(mktemp -d /tmp/lddd-script.XXXX) +TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX) echo 'Go out and drink some tea, this will take a while :) ...' # Check ELF binaries in the PATH and specified dir trees. -- cgit v1.2.3-70-g09d2