integ/tools/spec-tools/speclint.sh
Saul Wold 39968d9909 speclint: Add script for linting RPM specfiles
This script along with the macros file will be used to initially
check the specfiles being added as part of the MultiOS work. It
will be executed via zuul and tox to scan the openSUSE specfiles,
later we can start add the CentOS specfiles also.

The macros.openstack-singlespec is orignally from
openstack/rpm-packaging customized with tis_patch_ver

Change-Id: I22bf778388e6dcc3ca42d5fd6ec16b30200d6b75
Signed-off-by: Saul Wold <sgw@linux.intel.com>
2019-06-18 19:11:54 -07:00

99 lines
2.7 KiB
Bash
Executable File

#!/bin/bash
#
# SPDX-License-Identifier: Apache-2.0
#
# Derived from the openstack/rpm-packaging scripts
set -e
usage() {
echo ""
echo "Usage: "
echo " Provide lint-like info about specfiles:"
echo " speclint.sh <spec files list>"
exit 1
}
if [ -z $@ ]; then
usage
fi
while getopts "h" o; do
case "${o}" in
*)
usage
;;
esac
done
tmpdir=$(mktemp -d)
MAXPROC=4
if [ -d ../stx-integ ]; then
echo "Fetching from stx-integ"
cat ../stx-integ/tools/spec-tools/macros.openstack-singlespec > $tmpdir/.rpmmacros
elif [ -d ../integ ]; then
echo "Fetching from integ"
cat ../integ/tools/spec-tools/macros.openstack-singlespec > $tmpdir/.rpmmacros
else
echo "Fetching from git"
wget -q -O $tmpdir/.rpmmacros https://opendev.org/openstack/rpm-packaging/raw/branch/master/openstack/openstack-macros/macros.openstack-singlespec
echo "%tis_patch_ver 1" >> $tmpdir/.rpmmacros
fi
failed=0
for spec in $@; do
if [ ! -f $spec ]; then
echo "$spec does not exisit, please pass valid RPM specfiles on the cmdline"
failed=1
continue 1
fi
echo "Checking $spec"
specname=$(basename $spec)
egrep -q '^Source:' $spec && {
echo "$spec should not have Source: lines. Please use Source0: instead."
failed=1
}
egrep -q '^%setup' $spec && {
echo "$spec should not use '%setup'. Please use '%autosetup' instead."
failed=1
}
egrep -q '%{__python[23]}' $spec && {
echo "$spec should not use '%{__python[23]}'. Please use 'python2' or 'python3' instead."
failed=1
}
(cd $(dirname $spec); HOME=$tmpdir rpmspec -q --qf "%{VERSION}\n" $specname) >/dev/null || {
echo "$spec does not parse properly. Please check your syntax."
failed=1
}
echo "spec-cleaner checking $specname"
# Make a copy to do some fix-ups required by spec-cleaner
cp $spec $tmpdir/$specname
# NOTE(toabctl):spec-cleaner can not ignore epochs currently
sed -i '/^Epoch:.*/d' $tmpdir/$specname
# NOTE(jpena): spec-cleaner wants python2/python3 instead of
# %{__python2}/%{__python3}
# https://github.com/openSUSE/spec-cleaner/issues/173
sed -i 's/%{__python2}/python2/g' $tmpdir/$specname
sed -i 's/%{__python3}/python3/g' $tmpdir/$specname
spec-cleaner -m -d --no-copyright --diff-prog "diff -uw" \
$tmpdir/$specname > $tmpdir/$specname.cleaner.diff &
let count+=1
[[ count -eq $MAXPROC ]] && wait && count=0
done
# check if some diffs are available
failed=0
for specdiff in $tmpdir/*; do
if [ -s "$specdiff" ]; then
echo "##### `basename ${specdiff}` ##### "
cat $specdiff
failed=1
fi
done
rm -rf $tmpdir
exit $failed