File: //bin/rpmargs
#!/bin/sh -ef
export LC_ALL=C
rpmargs_all=
rpmargs_cmd=
rpmargs_pkg=
while getopts ac:ph rpmargs_opt; do
case "$rpmargs_opt" in
a) rpmargs_all=1 ;;
c) rpmargs_cmd="${OPTARG:?}"
readonly rpmargs_cmd ;;
p) rpmargs_pkg=1 ;;
h) pod2usage --exit=0 "$0"; exit 0 ;;
*) pod2usage --exit=2 "$0"; exit 2 ;;
esac
done
shift "$((OPTIND-1))"; OPTIND=1
if [ -z "$rpmargs_cmd" ]; then
echo "${0##*/}: command not specified" >&2
pod2usage --exit=2 "$0"; exit 2
fi
if [ -n "$*" -a -n "$rpmargs_all" ]; then
echo "${0##*/}: too may arguments" >&2
pod2usage --exit=2 "$0"; exit 2
fi
if [ -n "$rpmargs_all" ]; then
: ${sisyphus:=/ALT/Sisyphus}
set -- "$sisyphus"/files/{{i586,noarch}/RPMS,SRPMS}
fi
if [ -z "$*" ]; then
echo "${0##*/}: not enough arguments" >&2
pod2usage --exit=2 "$0"; exit 2
fi
rpmargs_files()
{
ls -1 "$1" |grep -x '[^.].*[.]rpm' >rpmargs_files
sort -o rpmargs_files -u rpmargs_files
local f
while read -r f; do
$rpmargs_cmd "$1/$f" >rpmargs.out
[ -s rpmargs.out ] || continue
awk -v f="$f" '{print f"\t"$0}' rpmargs.out
done <rpmargs_files
}
rpmargs_packages()
{
packages "$1" >rpmargs_packages
sort -t$'\t' -o rpmargs_packages -u -k1,1 rpmargs_packages
local p v f
while IFS=$'\t' read -r p v f _; do
$rpmargs_cmd "$1/$f" >rpmargs.out
[ -s rpmargs.out ] || continue
awk -v p="$p" '{print p"\t"$0}' rpmargs.out
done <rpmargs_packages
}
# rpmdevtools change: tmpdir.sh location
. /usr/share/rpmdevtools/tmpdir.sh
rpmargs_tmpdir=$TMPDIR
for rpmarg; do
rpmarg="$(readlink -ev "${rpmarg:?}")"
cd "$rpmargs_tmpdir"
if [ -d "$rpmarg" -a -n "$rpmargs_pkg" ]; then
rpmargs_packages "$rpmarg"
elif [ -d "$rpmarg" -a -z "$rpmargs_pkg" ]; then
rpmargs_files "$rpmarg"
else
$rpmargs_cmd "$rpmarg"
fi
cd - >/dev/null
done
: <<'__EOF__'
=head1 NAME
rpmargs - process RPM packages
=head1 SYNOPSIS
B<rpmargs>
[B<-h>]
B<-c> I<command>
[B<-a>] [B<-p>]
[I<FILE>...] [I<DIR>...]
=head1 DESCRIPTION
B<rpmargs> executes a I<command> against each RPM package given on the
command line. Extra word splitting is performed on the I<command>.
Each I<FILE> is treated as RPM package. Each I<DIR> is processed with C<*.rpm>
pattern, and RPM file basename is prepended to the I<command> output.
=head1 OPTIONS
=over
=item B<-a>
Process all Sisyphus packages.
=item B<-p>
When processing a directory, list package names, not file names;
furthermore, enable special treatment of packages with the same name;
that is, process only the one with the latest version.
=item B<-h>
Display this help and exit.
=back
=head1 AUTHOR
Written by Alexey Tourbin <at@altlinux.org>.
=head1 COPYING
Copyright (c) 2005 Alexey Tourbin, ALT Linux Team.
This is free software; you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
=cut
__EOF__