Whamcloud - gitweb
b=20339
[fs/lustre-release.git] / lustrecvs
index 3253b89..86eb3cb 100755 (executable)
--- a/lustrecvs
+++ b/lustrecvs
@@ -1,5 +1,6 @@
-#!/bin/sh
+#!/bin/bash
 
+LC_COLLATE="C"
 progname="${0##*/}"
 
 warn ()
@@ -18,13 +19,38 @@ fatal ()
 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
 }
 
+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
+
+[ "$1" = "-r" ] && shift
+
 buildtag="HEAD"
 lustretag="$1"
+shift
+pindate=$1
+shift
+
+if [ "$*" ] ; then
+    usage >&2
+    exit 1
+fi
 
 case "$lustretag" in
     '')
@@ -40,34 +66,190 @@ case "$lustretag" in
     # this is the branch table
     # keep this list sorted alphabetically!
 
+    # 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
-       cotag="-r $tag"
-       uptag="-r $tag"
+        # 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
+        datecmd=""
     fi
 
     if [ -d "$dir" ] ; then
-       echo "$progname: Updating $dir to $tag"
-       ( cd "$dir" && cvs up -dP $uptag )
+        echo "$progname: Updating $dir to $tag"
+        ( cd "$dir" && cvs up $datecmd -dAP $uptag )
     else
-       echo "$progname: Checking out $dir from $tag"
-       cvs co $cotag -d "$dir" "$module"
+        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
+        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
 }
 
@@ -78,3 +260,7 @@ if [ -f build/buildcvs ] ; then
 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