-#!/bin/sh
+#!/bin/bash
+LC_COLLATE="C"
progname="${0##*/}"
warn ()
usage ()
{
cat <<EOF
-Usage: $progname lustretag
- where lustretag is a tag of the lustre-core module
+Usage: $progname <lustretag> <pindate>
+ where <lustretag> is a tag of the lustre-core module
+ and <pindate> is an optional quoted timestamp suitable for cvs -D
EOF
}
+[ "$1" = "-r" ] && shift
+
+if [ -z "$LUSTRECVS_UPDATED" ] ; then
+ echo "$progname: updating lustrecvs"
+
+ # If checking out a specific tag, make sure all of the files here are also
+ # checked out with the same tag to avoid later changes breaking things.
+ case "$1" in
+ v*|b_release_*) TAG="-r $1" ;;
+ esac
+
+ cvs update -l $TAG
+ export LUSTRECVS_UPDATED=yes
+ exec "$0" "$@"
+fi
+
buildtag="HEAD"
lustretag="$1"
+shift
+pindate=$1
+shift
+
+if [ "$*" ] ; then
+ usage >&2
+ exit 1
+fi
case "$lustretag" in
'')
# this is the branch table
# keep this list sorted alphabetically!
- b1_2)
- portalstag="b1_2"
- ;;
+
+ # These use special build directories
+
+ # Maintenance mode -- isolate build system changes
+ b1_4*) buildtag="b1_4" ;;
+
+ # Maintenance mode -- isolate build system changes
+ b1_6*) buildtag="b1_6" ;;
+
+ b_release_1_4_6-patchless) buildtag="b1_4" ;;
+ b_release_1_4_7-test) buildtag="b_release_1_4_7" ;;
+
+ b_release*) buildtag=$lustretag ;;
+
+ b_uoss) buildtag=$lustretag ;;
+
+ # These releases did not get build tagged for them because they
+ # this build system didn't exist when they were tagged
+ v1_2_8|v1_4_0)
+ buildtag="b1_4"
+ ;;
+
+ v*) buildtag=$lustretag ;;
+
+ # this is the branch table
+ # keep this list sorted alphabetically!
+
+ *_gate) buildtag="b_build_gate" ;;
*)
buildtag="HEAD"
;;
-
esac
+error_modules=
cvs_cmd ()
{
- local dir="$1"
- local module="$2"
- local tag="$3"
- local cotag=""
- local update=""
+ dir="$1"
+ module="$2"
+ tag="$3"
+ cotag=""
+ update=""
if [ "$tag" = "HEAD" ] ; then
- cotag=""
- uptag="-A"
+ cotag=""
+ uptag="-A"
+ elif [ "$tag" ] ; then
+ cotag="-r $tag"
+ uptag="-r $tag"
+ else
+ # silently skip if no tag was specified
+ return
+ fi
+
+ # create a cvs date format that will survive shell expansion
+ if [ -n "$pindate" ]; then
+ datecmd=$(date -u +%s -d "$pindate")
+ datecmd="-D @$datecmd"
else
- cotag="-r $tag"
- uptag="-r $tag"
+ datecmd=""
fi
if [ -d "$dir" ] ; then
- echo "$progname: Updating $dir to $tag"
- ( cd "$dir" && cvs up $uptag )
+ echo "$progname: Updating $dir to $tag"
+ ( cd "$dir" && cvs up $datecmd -dAP $uptag )
+ else
+ echo "$progname: Checking out $dir from $tag"
+ cvs co $datecmd -P $cotag -d "$dir" "$module"
+ fi
+ if [ $? != 0 ] ; then
+ error_modules="$dir $error_modules"
+ fi
+}
+
+hg_cmd ()
+{
+ dir="$1"
+ base_url="$2"
+ repository="$3"
+
+ if [ ! "$repository" ]; then
+ return
+ fi
+
+ if ! which hg &> /dev/null; then
+ cat <<EOF
+
+Error: Mercurial is missing, try 'yum install mercurial', 'apt-get install
+mercurial' or try http://rpmfind.net/linux/rpm2html/search.php?query=mercurial
+EOF
+ error_modules="$dir $error_modules"
+ return
+ fi
+
+ url="$base_url/$repository"
+
+ # create a cvs date format that will survive shell expansion
+ if [ -n "$pindate" ]; then
+ datecmd=$(date -u +%s -d "$pindate")
+ datecmd="-d \"$datecmd 0\""
else
- echo "$progname: Checking out $dir from $tag"
- cvs co $cotag -d "$dir" "$module"
+ datecmd=""
+ fi
+
+ if [ -d "$dir" ]; then
+ echo "$progname: Updating $dir"
+ if [ -f "$dir/update.sh" ]; then
+ ( cd "$dir" && ./update.sh $datecmd )
+ else
+ ( cd "$dir" && hg pull && hg update $datecmd )
+ fi
+ else
+ echo "$progname: Checking out $dir"
+ hg clone $url $dir
+ if [ -f "$dir/setup.sh" ]; then
+ ( cd "$dir" && ./setup.sh $datecmd )
+ else
+ ( cd "$dir" && hg update $datecmd )
+ fi
+ fi
+
+ if [ $? != 0 ] ; then
+ error_modules="$dir $error_modules"
+ fi
+}
+
+git_cmd ()
+{
+ dir="$1"
+ repository="$2"
+ branch="$3"
+ base_url="$4"
+
+ if [ ! "$branch" ]; then
+ return
+ fi
+
+ if ! which git &> /dev/null; then
+ cat <<EOF
+
+Error: git is missing, try 'yum install git', 'apt-get install
+git' or try http://rpmfind.net/linux/rpm2html/search.php?query=git
+EOF
+ error_modules="$dir $error_modules"
+ return
+ fi
+
+ url=`printf "$base_url" "$repository"`
+
+ if [ -n "$pindate" ]; then
+ echo "\nSorry, pindate is not supported with git."
+ error_modules="$dir $error_modules"
+ return
+ fi
+
+ if [ -d "$dir" ]; then
+ echo "$progname: Updating $dir"
+
+ pushd "$dir" > /dev/null
+
+ # Fetch new objects
+ git fetch "$url" "$branch"
+
+ # Create branch if it doesn't exist already (e.g. we switched branches)
+ [ $? -eq 0 ] && $($(git branch -b $branch origin/$branch &> /dev/null) || true)
+
+ # Rebase local commits
+ [ $? -eq 0 ] && git rebase origin/$branch $branch
+
+ rc=$?
+
+ popd > /dev/null
+ else
+ echo "$progname: Checking out $dir"
+ git clone "$url" "$dir"
+ rc=$?
+
+ if [ $rc -eq 0 -a "$branch" != "master" ]; then
+ ( cd "$dir" && git checkout -b $branch origin/$branch )
+ rc=$?
+ fi
+ fi
+
+ if [ $rc -ne 0 ] ; then
+ error_modules="$dir $error_modules"
fi
}
else
fatal 1 "build/buildcvs does not exist; not updating other modules."
fi
+
+if [ "$error_modules" ] ; then
+ fatal 1 "There were errors checking out the following directories: $error_modules"
+fi