scripts/src/deforaos-update.sh

180 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env sh
#$Id$
#Copyright (c) 2008-2013 Pierre Pronchery <khorben@defora.org>
#This file is part of DeforaOS Devel scripts
#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 3 of the License.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program. If not, see <http://www.gnu.org/licenses/>.
#environment
umask 022
#variables
DATE=$(date '+%Y%m%d')
DESTDIR="/var/www"
DEVNULL="/dev/null"
EMAIL="devel@lists.defora.org"
HOMEPAGE="http://www.defora.org"
ROOT=
SRC=
#CVS
CVSMODULE="DeforaOS"
SRC="$HOME/$CVSMODULE"
[ -z "$CVSROOT" ] && CVSROOT=":pserver:anonymous@anoncvs.defora.org:/home/cvs"
#Git
[ -z "$GITROOT" ] && GITROOT="http://git.defora.org/git/DeforaOS.git"
#executables
CONFIGURE="configure"
CVS="cvs -q"
FIND="find"
GIT="git"
LN="ln -f"
MAIL="mail"
MAKE="make"
MKDIR="mkdir -m 0755 -p"
MKTEMP="mktemp"
RM="rm -f"
RMDIR="rmdir"
TAR="tar"
TOUCH="touch"
XARGS="xargs"
#functions
#deforaos_update_cvs
_deforaos_update_cvs()
{
[ -n "$SRC" ] || SRC="$ROOT/$CVSMODULE"
#configure cvs if necessary
$MKDIR "$HOME" || exit 2
if [ ! -f "$HOME/.cvspass" ]; then
$TOUCH "$HOME/.cvspass" || exit 2
fi
#checkout tree if necessary
if [ ! -d "$SRC" ]; then
echo ""
echo "Checking out CVS module $CVSMODULE:"
(cd "$HOME" && $CVS "-d$CVSROOT" co "$CVSMODULE") \
|| exit 2
fi
#update tree
echo ""
echo "Updating CVS module $CVSMODULE:"
(cd "$SRC" && $CVS update -dPA) || exit 2
#make archive
echo ""
echo "Archiving CVS module $CVSMODULE:"
for i in *; do
echo "DeforaOS-$DATE/$i"
done | ($LN -s . "DeforaOS-$DATE" \
&& $XARGS $TAR -czf "$DESTDIR/htdocs/download/snapshots/DeforaOS-daily.tar.gz")
$RM "DeforaOS-$DATE"
echo "$HOMEPAGE/download/snapshots/DeforaOS-daily.tar.gz"
}
#deforaos_update_git
_deforaos_update_git()
{
SRC="DeforaOS.git"
#checkout tree if necessary
if [ ! -d "$SRC" ]; then
echo ""
echo "Checking out Git repository $SRC:"
$GIT clone "$GITROOT" "$SRC" > "$DEVNULL" || exit 2
fi
#update tree
echo ""
echo "Updating Git repository $SRC:"
(cd "$SRC" && $GIT checkout -f && $GIT pull > "$DEVNULL") \
|| exit 2
#re-generate the makefiles
echo ""
echo "Re-generating the Makefiles:"
$CONFIGURE "$SRC/System/src" "$SRC/Apps" "$SRC/Library" || exit 2
#update the sub-repositories
echo ""
echo "Updating the sub-repositories:"
$FIND "$SRC" -name script.sh | while read script; do
parent="${script%%/script.sh}"
#XXX read project.conf instead
for i in "$parent/"*; do
[ -d "$i" ] || continue
(cd "$i" && $MAKE download) > "$DEVNULL"
done
done
#make archive
echo ""
echo "Archiving DeforaOS from Git repository $GITROOT:"
for i in "$SRC/.git" "$SRC/"*; do
i=${i##$SRC/}
echo "DeforaOS-$DATE/$i"
done | ($LN -s "$SRC" "DeforaOS-$DATE" \
&& $XARGS $TAR -czf "$DESTDIR/htdocs/download/snapshots/DeforaOS-daily.tar.gz")
$RM "DeforaOS-$DATE"
echo "$HOMEPAGE/download/snapshots/DeforaOS-daily.tar.gz"
}
#usage
_usage()
{
echo "Usage: deforaos-update.sh [-O name=value...]" 1>&2
return 1
}
#main
#parse options
update=_deforaos_update_cvs
scm=
while getopts "CgO:" name; do
case "$name" in
C)
scm="CVS"
update=_deforaos_update_cvs
;;
g)
scm="Git"
update=_deforaos_update_git
;;
O)
export "${OPTARG%%=*}"="${OPTARG#*=}"
;;
*)
_usage
exit $?
;;
esac
done
shift $((OPTIND - 1))
if [ $# -ne 0 ]; then
_usage
exit $?
fi
[ -n "$ROOT" ] || ROOT=$($MKTEMP -d -p "$HOME" "temp.XXXXXX")
[ -n "$ROOT" ] || exit 2
$update 2>&1 | $MAIL -s "Daily $scm update: $DATE" "$EMAIL"
$RMDIR "$ROOT"