Compare commits

...

20 Commits

Author SHA1 Message Date
Pierre Schmitz
6da47a8f6a prepare release 2011-08-25 21:39:49 +02:00
Lukas Fleischer
6350ec0461 Add ZSH completion
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 19:26:12 +02:00
Lukas Fleischer
3da3a5486f checkpkg: Use a pipe to sort package lists
No need to do this after we already wrote the package list to a file.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:22:13 +02:00
Lukas Fleischer
7020d2351b checkpkg: Use read builtin to get new ".so" files
The read shell builtin is the proper way to read single lines. Also,
simplify grep(1) and awk(1) invocations and use a single awk(1)
expression, that supports extracting file names with spaces, instead.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:21:24 +02:00
Lukas Fleischer
7952d6fbfc checkpkg: Avoid unnecessary use of grep(1)/basename(1)
Use parameter expansion instead of invoking external binaries here.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:20:41 +02:00
Lukas Fleischer
3c175e98bd checkpkg: Avoid unnecessary use of sed(1) and cut(1)
We already use `pacman -Sddp` here which should always only return a
single package URL for regular packages. No need to extract the first
field of the last line. Also, specify "--print-format '%l'" explicitly
to make this consistent even if pacman(8)'s default value changes some
day.

Use bash parameter expansion instead of sed(1) to extract the file name
from the URL.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:20:08 +02:00
Lukas Fleischer
ddb08cb9a1 checkpkg: Proper quoting, use double brackets
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:18:36 +02:00
Lukas Fleischer
88a929cfc0 archrelease: Fix behaviour with non-standard trunk name
Do not hardcode the name of the package trunk directory and accept
varying directory names, such as "gnome-unstable". Regression introduced
in 8384ad849d.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:17:19 +02:00
Lukas Fleischer
c24209028a archrelease: Copy new files from trunk
Currently, files that have just been added to trunk are not copied to
the repositories when invoking archrelease, as `svn ls` does not list
them if we don't `svn update` explicitly before. Use `svn ls -r HEAD` to
include everything from current HEAD. Fixes FS#25680.

Reported-by: Eric Bélanger <snowmaniscool@gmail.com>
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:16:26 +02:00
Lukas Fleischer
61010062ff commitpkg: Release to all repositories at once
Make use of archrelease's multi-tag capability invoke it once instead of
re-launching it for for each individual tag.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:14:33 +02:00
Lukas Fleischer
6ef4d5f30b archrelease: Accept multiple tags
This allows for releasing to multiple repositories with a single commit:

----
$ archrelease community-{i686,x86_64}
copying trunk to community-i686...done
copying trunk to community-x86_64...done
releasing package...done
----

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:13:45 +02:00
Lukas Fleischer
40ddf4d44f archrelease: Check for subdirectories early
Ensure we do not mess with version control if there are any
subdirectories in the package trunk.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:10:30 +02:00
Lukas Fleischer
b445920d55 archrelease: Remove redundant directory check
Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 11:09:01 +02:00
Lukas Fleischer
7887d9bb47 archco: Fix usage message
Point out that we allow passing more than two packages here.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-25 10:59:00 +02:00
Dave Reisner
35573fe147 archrelease: declare known_files as an array
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
5688152f41 archrelease: use bashier syntax
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
e1312ec493 archrelease: call svn rm only once
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
e652dc8085 commitpkg: use getopts to parse options
Signed-off-by: Dave Reisner <d@falconindy.com>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Dave Reisner
ba4f28cc43 commitpkg: declare rsyncopts as an array
Signed-off-by: Dave Reisner <d@falconindy.com>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-18 10:11:27 +02:00
Lukas Fleischer
dc7b96e917 commitpkg: Fix leading whitespace in commit messages
Commit c51cc8d365 erroneously introduced a
tab character that is prepended to the body of each commit message. Fix
this by using C-style newline escape sequences which will avoid further
whitespace issues caused by re-indentation of code at this point.

Signed-off-by: Lukas Fleischer <archlinux@cryptocrack.de>
Signed-off-by: Pierre Schmitz <pierre@archlinux.de>
2011-08-15 17:01:31 +02:00
6 changed files with 168 additions and 78 deletions

View File

@@ -1,4 +1,4 @@
V=0.9.26
V=0.9.27
PREFIX = /usr/local
@@ -59,6 +59,7 @@ install:
for l in ${COMMITPKG_LINKS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do ln -sf archbuild $(DESTDIR)$(PREFIX)/bin/$$l; done
install -Dm0644 bash_completion $(DESTDIR)/etc/bash_completion.d/devtools
install -Dm0644 zsh_completion $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
ln -sf archco $(DESTDIR)$(PREFIX)/bin/communityco
uninstall:
@@ -68,6 +69,7 @@ uninstall:
for l in ${COMMITPKG_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in ${ARCHBUILD_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
rm $(DESTDIR)/etc/bash_completion.d/devtools
rm $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_devtools
rm -f $(DESTDIR)$(PREFIX)/bin/communityco
dist:

2
archco
View File

@@ -3,7 +3,7 @@
scriptname=${0##*/}
if [ "$1" = '' ]; then
echo 'Usage: '$scriptname' <package name> [<package name>]'
echo 'Usage: '$scriptname' <package name>...'
exit 1
fi

View File

@@ -5,52 +5,63 @@ abort() {
exit 1
}
if [ "$1" = '' ]; then
abort 'Usage: archrelease <repo>'
if [[ -z $1 ]]; then
abort 'Usage: archrelease <repo>...'
fi
# TODO: validate repo is really repo-arch
if [ ! -f PKGBUILD ]; then
if [[ ! -f PKGBUILD ]]; then
abort 'archrelease: PKGBUILD not found'
fi
trunk=$(basename $(pwd))
trunk=${PWD##*/}
# Normally this should be trunk, but it may be something
# such as 'gnome-unstable'
if [ "$(basename $(dirname $(pwd)))" == "repos" ]; then
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 [ ! -z "$(svn status -q)" ]; then
if [[ $(svn status -q) ]]; then
abort 'archrelease: You have not committed your changes yet!'
fi
echo -n "releasing package to ${1}..."
pushd .. >/dev/null
if [ -d "repos/${1}" ]; then
for file in $(svn ls "repos/${1}"); do
svn rm -q "repos/${1}/$file"
done
fi
if [ ! -d repos ]; then
mkdir repos
svn add -q repos
fi
if [ ! -d "repos/${1}" ]; then
mkdir "repos/${1}"
svn add -q "repos/${1}"
fi
known_files=$(svn ls "trunk")
for file in $known_files; do
if [ "$file" != "${file%/}" ]; then
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 file in $known_files; do
svn copy -q -r HEAD "trunk/$file" "repos/${1}/"
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
svn commit -q -m "archrelease: copy trunk to ${1}" || abort
popd >/dev/null
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

View File

@@ -1,7 +1,7 @@
#!/bin/bash
# Source makepkg.conf; fail if it is not found
if [ -r '/etc/makepkg.conf' ]; then
if [[ -r '/etc/makepkg.conf' ]]; then
source '/etc/makepkg.conf'
else
echo '/etc/makepkg.conf not found!'
@@ -9,86 +9,77 @@ else
fi
# Source user-specific makepkg.conf overrides
if [ -r ~/.makepkg.conf ]; then
if [[ -r ~/.makepkg.conf ]]; then
source ~/.makepkg.conf
fi
strip_url() {
echo $1 | sed 's|^.*://.*/||g'
}
if [ ! -f PKGBUILD ]; then
if [[ ! -f PKGBUILD ]]; then
echo 'This must be run in the directory of a built package.'
exit 1
fi
. PKGBUILD
if [ "$arch" == 'any' ]; then
if [[ $arch == 'any' ]]; then
CARCH='any'
fi
STARTDIR=$(pwd)
TEMPDIR=$(mktemp -d /tmp/checkpkg-script.XXXX)
cd $TEMPDIR
cd "$TEMPDIR"
for _pkgname in ${pkgname[@]}; do
if [ -z ${epoch} ] ; then
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
if [[ -f "$STARTDIR/$pkgfile" ]]; then
ln -s "$STARTDIR/$pkgfile" "$pkgfile"
elif [ -f "$PKGDEST/$pkgfile" ]; then
elif [[ -f "$PKGDEST/$pkgfile" ]]; then
ln -s "$PKGDEST/$pkgfile" "$pkgfile"
else
echo "File \"$pkgfile\" doesn't exist"
exit 1
fi
tmp=$(pacman -Spdd --noconfirm $_pkgname)
pkgurl=$(pacman -Spdd --print-format '%l' --noconfirm "$_pkgname")
if [ $? -ne 0 ]; then
if [[ $? -ne 0 ]]; then
echo "Couldn't download previous package for $_pkgname."
exit 1
fi
pkgurl=$(echo $tmp | rev | cut -d ' ' -f 1 | rev)
oldpkg=${pkgurl##*://*/}
oldpkg=$(strip_url $pkgurl)
if [ "$(basename $oldpkg)" = "$(basename $pkgfile)" ]; then
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 echo $pkgurl | grep '^file:///' > /dev/null 2>&1; then
ln -s "${pkgurl#file://}" $(basename "${pkgurl#file://}")
elif [ -f "$PKGDEST/$oldpkg" ]; then
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
elif [[ -f "$STARTDIR/$oldpkg" ]]; then
ln -s "$STARTDIR/$oldpkg" "$oldpkg"
else
wget --quiet $pkgurl
wget --quiet "$pkgurl"
fi
fi
bsdtar tf $oldpkg > filelist-$_pkgname-old
bsdtar tf "$pkgfile" > filelist-$_pkgname
bsdtar tf "$oldpkg" | sort > "filelist-$_pkgname-old"
bsdtar tf "$pkgfile" | sort > "filelist-$_pkgname"
sort -o filelist-$_pkgname filelist-$_pkgname
sort -o filelist-$_pkgname-old filelist-$_pkgname-old
sdiff -s "filelist-$_pkgname-old" "filelist-$_pkgname"
sdiff -s filelist-$_pkgname-old filelist-$_pkgname
if diff filelist-$_pkgname-old filelist-$_pkgname | grep '\.so' > /dev/null 2>&1; then
if diff "filelist-$_pkgname-old" "filelist-$_pkgname" | grep '\.so' > /dev/null 2>&1; then
mkdir -p pkg
cd pkg
bsdtar xf ../"$pkgfile" > /dev/null
for i in $(diff ../filelist-$_pkgname-old ../filelist-$_pkgname | grep \> | grep '\.so' | awk '{print $2}'); do
echo "${i}: " "$(objdump -p $i | grep SONAME)"
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

View File

@@ -97,22 +97,22 @@ for i in 'changelog' 'install'; do
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'
if [ "$1" = '-l' ]; then
rsyncopts="$rsyncopts --bwlimit=$2"
shift 2
fi
if [ "$1" = "-a" ]; then
commit_arch=$2
shift 2
fi
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)
"
msgtemplate="upgpkg: $pkgbase $(get_full_version ${epoch:-0} $pkgver $pkgrel)"$'\n\n'
if [ -n "$1" ]; then
svn commit -q -m "${msgtemplate}${1}" || abort
else
@@ -172,12 +172,17 @@ for _arch in ${arch[@]}; do
abort "Signature ${pkgfile}.sig was not found"
fi
done
archrelease $repo-${_arch} || abort
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
rsync "${rsyncopts[@]}" "${uploads[@]}" "$server:staging/$repo/" || abort
fi
if [ "${arch[*]}" == 'any' ]; then

81
zsh_completion Normal file
View File

@@ -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_installed_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_installed_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