ceph/pre_checkin.sh

310 lines
7.5 KiB
Bash

#!/bin/bash
set -f
function packages_files {
local spec_file=$1
local exclude_pkg=$2
local in_files=false
local result=""
while IFS='' read -r line || [[ -n "$line" ]]; do
case $line in
"%files "*)
pkg=`echo "$line" | sed 's/%files.* \(\w\+\)/\1/g'`
if [[ $pkg == $exclude_pkg ]]; then
in_files=false
continue
fi
in_files=true
continue
;;
"%post"* | "%pre"* | "%preun"* | "%postun"*)
in_files=false
continue
;;
esac
result=""
changed=true
while [[ $in_files == true ]] && [[ $changed == true ]]; do
changed=false
case $line in
"%if"* | "" | "%defattr"* | "%endif"* | "%else"* | "#"* | "%docdir"*)
break
;;
"%dir"*)
break # for now we'll ignore %dir entries
;;
*)
result=`echo "$line" | sed -e 's/%config \(.*\)/\1/g' \
-e 's/%config(.*) \(.*\)/\1/g' \
-e 's/%attr(.*) \(.*\)/\1/g' \
-e 's/%exclude \(.*\)/\1/g'`
if [[ ! $line == $result ]]; then
changed=true
line=$result
continue
fi
;;
esac
# process path variables
result=`echo "$result" | sed -e 's!%{_bindir}!/usr/bin!g' \
-e 's!%{_docdir}!/usr/share/doc/packages!g' \
-e 's!%{_sbindir}!/usr/sbin!g' \
-e 's!%{_libdir}!/usr/lib64!g' \
-e 's!%{_mandir}!/usr/share/man!g' \
-e 's!%{_sysconfdir}!/etc!g' \
-e 's!%{_includedir}!/usr/include!g' \
-e 's!%{_unitdir}!/usr/lib/systemd/system!g' \
-e 's!%{python_sitelib}!/usr/lib/python2.7/site-packages!g' \
-e 's!%{_datadir}!/usr/share!g' \
-e 's!%{python_sitearch}!/usr/lib64/python2.7/site-packages!g' \
-e 's!%{_javadir}!/usr/share/java!g' \
-e 's!%{_libexecdir}!/usr/lib!g' \
-e 's!%{_prefix}!/usr!g' \
-e 's!%{_localstatedir}!/var!g' \
-e 's!%{_tmpfilesdir}!/usr/lib/tmpfiles.d!g' \
-e 's!%{_udevrulesdir}!/usr/lib/udev/rules.d!g'`
# sanity check
if [[ "$result" == "%"* ]]; then
echo "ERROR: unparsable file entry: $result"
exit 1
fi
echo "$result"
done
done < $spec_file
}
function get_package_summary {
local spec_file=$1
local pkg_name=$2
local in_package=false
while IFS='' read -r line || [[ -n "$line" ]]; do
case $line in
"%package "*)
pkg=`echo "$line" | sed 's/%package.* \(\w\+\)/\1/g'`
if [[ ! $pkg == $pkg_name ]]; then
in_package=false
else
in_package=true
fi
;;
"%prep"* | "%build"* | "%install"*)
in_package=false
;;
"Summary:"*)
if [[ $in_package == true ]]; then
echo $line
break
fi
;;
esac
done < $spec_file
}
function get_package_requires {
local spec_file=$1
local pkg_name=$2
local in_package=false
while IFS='' read -r line || [[ -n "$line" ]]; do
case $line in
"%package "*)
pkg=`echo "$line" | sed 's/%package.* \(\w\+\)/\1/g'`
if [[ ! $pkg == $pkg_name ]]; then
in_package=false
else
in_package=true
fi
;;
"%prep"* | "%build"* | "%install"*)
in_package=false
;;
"Requires:"*)
if [[ $in_package == true ]]; then
echo $line
fi
;;
esac
done < $spec_file
}
function get_package_description {
local spec_file=$1
local pkg_name=$2
local in_desc=false
while IFS='' read -r line || [[ -n "$line" ]]; do
case $line in
"%description "*)
pkg=`echo "$line" | sed 's/%description.* \(\w\+\)/\1/g'`
if [[ ! $pkg == $pkg_name ]]; then
in_desc=false
else
in_desc=true
fi
continue
;;
"%prep"* | "%build"* | "%install"* | "%package"* | "%if"* | "%endif"*)
in_desc=false
continue
;;
esac
if [[ $in_desc == true ]]; then
echo "$line"
fi
done < $spec_file
}
function transform_spec_file {
local spec_file=$1
local include_pkg=$2
local rm_files=$3
local summary=$4
local description=$5
local requires=$6
local in_package=false
local in_files=false
local in_desc=false
while IFS='' read -r line || [[ -n "$line" ]]; do
case $line in
"%bcond_with ceph_test_package"*)
line="%bcond_without ceph_test_package"
;;
"Name:"*)
line="Name: $include_pkg"
;;
"Summary:"*)
if [[ $in_package == false ]]; then
line="$summary"
fi
;;
"Source0:"*)
line=`echo $line | sed 's/%{name}/ceph/g'`
;;
"%setup -q")
line="$line -n ceph-%version"
;;
"Requires:"*)
if [[ $in_package == false ]]; then
line=""
fi
;;
"Requires(post):"*)
if [[ $in_package == false ]]; then
IFS=''
for r in "$requires"; do
echo "$r"
done
fi
;;
"%description"*)
if [[ $in_package == false ]]; then
in_desc=true
echo "$line"
echo "$description"
echo ""
continue
fi
;;
"%package "*)
#pkg=`echo "$line" | sed 's/%package.* \(\w\+\)/\1/g'`
#if [[ $pkg == $include_pkg ]]; then
# in_package=false
#else
in_package=true
continue
#fi
in_desc=false
;;
"%prep"* | "%build"* | "%install"*)
in_package=false
in_desc=false
;;
"%files "*)
pkg=`echo "$line" | sed 's/%files.* \(\w\+\)/\1/g'`
if [[ $pkg == $include_pkg ]]; then
in_files=false
else
in_files=true
continue
fi
;;
"%changelog"*)
in_files=false
;;
"%clean"*)
in_package=false
IFS=''
for rf in "$rm_files"; do
echo "$rf"
done
echo ""
echo "dirs=\`find %{buildroot} -type d -empty\`"
echo "while [[ -n \$dirs ]]; do"
echo " for d in \$dirs; do"
echo " rm -rf \$d"
echo " done"
echo "dirs=\`find %{buildroot} -type d -empty\`"
echo "done"
echo ""
;;
"#"* | "%"*)
in_desc=false
;;
esac
if [[ $in_package == false ]] && [[ $in_files == false ]] && [[ $in_desc == false ]]; then
echo $line
else
if [[ $line == "%if"* ]] || [[ $line == "%endif"* ]]; then
echo $line
fi
fi
done < $spec_file
}
function generate_rm_exclude_files {
local exclude_list=$1
local buildroot=$2
for f in $exclude_list; do
echo "rm -rf $buildroot$f"
done
}
function copy_changes_file {
local dest_pkg=$1
cp ceph.changes ${dest_pkg}.changes
}
PACKAGE="ceph-test"
SPEC_FILE="ceph.spec"
files=`packages_files $SPEC_FILE $PACKAGE`
if [[ "$?" == "1" ]]; then
echo "ERROR: "
echo $files
exit 0
fi
rm_files=`generate_rm_exclude_files "$files" "%{buildroot}"`
summ=`get_package_summary $SPEC_FILE $PACKAGE`
desc=`get_package_description $SPEC_FILE $PACKAGE`
reqs=`get_package_requires $SPEC_FILE $PACKAGE`
transform_spec_file $SPEC_FILE $PACKAGE "$rm_files" "$summ" "$desc" "$reqs" > $PACKAGE.spec
copy_changes_file $PACKAGE