OpenSDE Framework (without history before r20070)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

225 lines
5.1 KiB

#!/bin/sh
# --- SDE-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# Filename: bin/sde-reschedule-package
# Copyright (C) 2008 - 2013 The OpenSDE Project
#
# More information can be found in the files COPYING and README.
#
# 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. A copy of the
# GNU General Public License can be found in the file COPYING.
# --- SDE-COPYRIGHT-NOTE-END ---
#Description: Reschedule packages from the builds
#Alias: pkg
[ -n "$SDEROOT" ] ||
export SDEROOT=$( cd "${0%/*}/.."; pwd -P )
. "$SDEROOT/lib/libsde.in"
reschedule_usage() {
local progname="$(echo ${0##*/} | tr '-' ' ')"
cat <<EOT
Usage: $progname [<options>] <package_1> ...
Supported Options:
--all|-a every package
--new|-N every package updated since it was built
--deps|-D every package depending on the others
--cfg|-c <config> process a given config (multiple supported)
--any|-A process any available config
--dry-run|-n don't really reschedule
--soft|-s don't remove the packages when rescheduling
--force|-f try to remove them even if we can't validate the package
EOT
}
shortopts='aNDc:Ansf'
longopts='help,all,new,deps,cfg:,any,soft,dry-run,force'
options=$( getopt -o "$shortopts" -l "$longopts" -- "$@" )
if [ $? -ne 0 ]; then
reschedule_usage
exit -1
fi
# load new arguments list
eval set -- "$options"
reschedule_all=
reschedule_new=
reschedule_dependers=
reschedule_any=
reschedule_soft=
reschedule_dry=
reschedule_force=
reschedule_configs=
while [ $# -gt 0 ]; do
case "$1" in
--help)
reschedule_usage
exit 0 ;;
--all|-a) reschedule_all=yes ;;
--new|-N) reschedule_new=yes ;;
--deps|-D) reschedule_dependers=yes ;;
--any|-A) reschedule_any=yes ;;
--soft|-s) reschedule_soft=yes ;;
--dry-run|-n) reschedule_dry=yes ;;
--force|-f) reschedule_force=yes ;;
--cfg|-c) reschedule_configs="$reschedule_configs $2"
shift ;;
--) shift; break ;;
*) echo_abort 1 "$1: Unknown argument, aborting."
esac
shift
done
. "$SDEROOT/lib/sde-config.in"
. "$SDEROOT/lib/sde-package.in"
remove_package() {
local root="$1" pkg="$2"
local flist="$root/var/adm/flists/$pkg"
local tag= f=
if [ ! -s "$flist" ]; then
echo_warning "$pkg: $flist not found."
return
fi
sort -r "$flist" | while read tag f; do
if [ "$tag" != "$pkg:" ]; then
echo_warning "$pkg: invalid tag '$tag' in $flist"
elif [ -z "$f" ]; then
echo_warning "$pkg: missing filename in $flist"
else
f="$root/$f"
if [ ! -L "$f" -a -d "$f" ]; then
rmdir --ignore-fail-on-non-empty -- "$f"
else
rm -f -- "$f"
fi
fi
done
}
reschedule_package()
{
local config="$1" pkg= sandbox=
local logs= log=
shift
[ $# -gt 0 ] || return
sandbox="$SDEROOT/build/$( config_id "$config" )"
for pkg; do
logs=$(ls -1 "$sandbox/var/adm/logs"/?-$pkg.{err,out,log} \
2> /dev/null)
[ -n "$logs" -o -s "$sandbox/var/adm/packages/$pkg" ] || continue
echo "$config: Removing $pkg..."
if [ "$reschedule_dry" != "yes" ]; then
[ "$reschedule_soft" = "yes" ] || remove_package "$sandbox" "$pkg"
# in the case $SDEROOT includes spaces
echo "$logs" | while read log; do
rm -f "$log"
done
fi
done
}
# which configs?
#
if [ "$reschedule_any" = "yes" ]; then
reschedule_configs=$( config_list )
[ -n "$reschedule_configs" ] || echo_abort 1 "No config found."
elif [ -z "$reschedule_configs" ]; then
# try default
y="$( config_id default )"
if [ -z "$y" ]; then
echo_abort 1 "No config found."
elif [ -d "$SDEROOT/build/$y/" ]; then
reschedule_configs=default
else
exit 0
fi
else
z="$reschedule_configs"
reschedule_configs=
for x in $z; do
y=$( config_id "$x" )
if [ -z "$y" ]; then
echo_warning "$x: Invalid config."
elif [ -d "$SDEROOT/build/$y/" ]; then
reschedule_configs="$reschedule_configs $x"
fi
done
fi
# any config ?
[ -n "$reschedule_configs" ] || exit 0
if [ "$reschedule_all" = "yes" ]; then
# every single package
#
for x in $reschedule_configs; do
y="$SDEROOT/build/$( config_id $x )/var/adm/logs"
reschedule_package "$x" $( ls -1d "$y"/* 2> /dev/null |
sed -e 's|.*/.-\(.*\)\..*|\1|' )
done
exit $?
elif [ -n "$reschedule_new" ]; then
# every modified package
#
$SDEROOT/bin/sde-reschedule-new \
${reschedule_dry:+--dry-run} \
${reschedule_dependers:+--deps} \
${reschedule_soft:+--soft} \
$reschedule_configs
fi
reschedule_packages=
for x; do
if package_exists "$x"; then
# in db
reschedule_packages="$reschedule_packages $x"
elif [ "$reschedule_force" = yes ]; then
echo_warning "$x: Unknown package, but forcing..."
reschedule_packages="$reschedule_packages $x"
else
echo_warning "$x: Invalid package"
fi
done
[ -n "$UID" ] || UID=$(id -u)
[ "$UID" = 0 -o "$reschedule_dry" = "yes" ] ||
echo_abort 1 "You have to be superuser to proceed, sorry."
set -- $reschedule_packages
for x in $reschedule_configs; do
reschedule_package "$x" "$@"
if [ "$reschedule_dependers" = "yes" ]; then
$SDEROOT/bin/sde-reschedule-dependers \
${reschedule_dry:+--dry-run} \
${reschedule_soft:+--soft} \
-c "$x" "$@"
fi
done