summaryrefslogtreecommitdiffstats
path: root/bin/snapshot
blob: 5c78fc8689e0706b955502f3c3a9162de12014f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
#!/bin/sh
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5.  The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the COPYING file, which can be found at the root of the source code
# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.

# This script should be run nightly from cron.  It checks out the source 
# from the source repository and compares it against the previous
# snapshot.  If anything significant changed then a new snapshot is
# created, the minor version number is incremented, and the change is
# checked back into the source repository.
#


# function definitions
TIMESTAMP()
{
    echo "=====" "$1": "`date`" "====="
}

EXIT_BANNER()
{
    TIMESTAMP "Exit $PROGNAME with status=$?"
}

# Show current total disk usage.
DISKUSAGE()
{
    du -ks | \
    ( read x y; echo "Disk Usage=$x KB" )
}

# function provided for testing software downloaded as tar files.  A version of
# this function that properly extracts the downloaded files can be provided in 
# the snapshots-${sw}-overrides file.
EXTRACT()
{
   echo "Error:  ${SWVERSION} is in source repository - does not need extraction."
}

# Standard procedure for checking out or updating source code from an hdfgroup
# git repository.  Override the function for other repositories or procedures.
SOURCE_CHECKOUT()
{
   if test -n $GIT_URL; then
      if [ -n "$AUTOGEN" ]; then
         echo "Creating fresh clone of $GIT_URL in $BASEDIR/current_src"
         # Check out the current version from source repository.
         (cd $BASEDIR; rm -rf current_src
          if test -z $GIT_BRANCH; then
             echo "Testing empty branch $GIT_BRANCH." 
             git clone $GIT_URL current_src
          else
             echo "Testing branch $GIT_BRANCH." 
             git clone $GIT_URL -b $GIT_BRANCH current_src
          fi
          ) || exit 1
      else
         echo "Creating fresh clone of $GIT_URL in $BASEDIR/current"
         # Check out the current version from source repository.
         (cd $BASEDIR; rm -rf current
          if test -n $GIT_BRANCH; then
             git clone $GIT_URL -b $GIT_BRANCH current
          else
             git clone $GIT_URL current
          fi ) || exit 1
      fi
   else
      echo "Warning!  Source directory ("current") is not checked out from git."
   fi
}

# Standard procedure for running the configure command in a build (test)
# directory
RUNCONFIGURE()
{
    if [ "${CURRENT}" != "${TESTDIR}" -a "$CPSRC" = "yes" ]; then
        echo "Copying source files to ${TESTDIR}."
        cp -pr ${CURRENT}/* ${TESTDIR}
        cd ${TESTDIR}
        ./${CONFIGURE}
    elif [ -n "${AUTOGEN}" ]; then
        ${CURRENTSRC}/${CONFIGURE}
    else 
        ${CURRENT}/${CONFIGURE} 
    fi
}

# Sometimes "make distclean" doesn't adequately remove files from the previous
# build.  If a build (test) directory was used, its contents can be entirely 
# deleted to provide a clean start.  If the test is building in the source 
# directory, the contents can't be deleted, so run "make distclean".
DISTCLEAN()
{
    if [ "${srcdir}" = "yes" -a -n "${SRCDIRNAME}" -a -d ${BASEDIR}/TestDir/${SRCDIRNAME} ]; then
        echo "Remove contents of $SRCDIRNAME.\n"
        rm -rf ${BASEDIR}/TestDir/${SRCDIRNAME}/*
    else
       echo "$MAKE distclean"
       (cd ${TESTDIR} && ${MAKE} distclean)
    fi
}

# Several of the software packages tested do not support make check-install.
# Those that support it should have a version of this function in their 
# override with the following lines:
#     TIMESTAMP "check-install $1" 
#     ${MAKE} check-install $1
CHECKINSTALL()
{
    echo "check-install is not supported for ${SWVERSION}"
}

# Function for hdf4 and hdf5 to override to check in changes after snapshot.
# Safety measure to avoid unintended checkins to other repositories.
COMMITSNAPSHOT()
{
    echo "original hdf5 script committed code changes back into git."
}

DISPLAYUSAGE()
{
    set -
    cat <<EOF
Usage: $PROGNAME [all] [checkout] [ftp <URL> [diff] [test] [srcdir] [release] [help]
	[clean] [distclean] [echo] [deploy <dir>] [deploydir <dir>]
	[zlib <zlib_path>] [releasedir <dir>] [srcdirname <dir>] [check-vfd]
	[exec <command>] [module-load <module-list>] [op-configure <option>] 
        [--<option>]
    all:      Run all commands (checkout, test & release)
              [Default is all]
    checkout: Run source checkout
    diff:     Run diff on current and previous versions.  Exit 0 if
              no significant differences are found.  Otherwise, non-zero.
    deploy:   deploy binary to directory <dir>
    deploydir: use <dir> as the default directory for deployment
    test:     Run test
    release:  Run release
    clean:    Run make clean
    distclean:Run make distclean
    echo:     Turn on echo mode (set -x)
    setenv <name> <value>:
              Set environment variable <name> to <value>.
    setenvN <N> <name> <value> ...:
	      Set environment variable with <N> values.
	      E.g., setenvN 3 x a b c is same as setenv x="a b c".
    srcdir:   Use srcdir option (does not imply other commands)
              "snapshot srcdir" is equivalent to "snapshot srcdir all"
              "snapshot srcdir checkout" is equivalent to "snapshot checkout"
    srcdirname <dir>:
              Use <dir> as the srcdir testing directory if srcdir is choosen.
              If <dir> starts with '-', it is append to the default name
              E.g., "snapshot srcdir srcdirname -xx" uses hostname-xx
              [Default is hostname]
    help:     Print this message
    echo:     Turn on shell echo
    zlib <zlib_path>:
              Use <zlib_path> as the ZLIB locations
              [Default is $ZLIB_default]
    releasedir <dir>:
              Use <dir> as the release directory
              [Default is $ReleaseDir_default]
    check-vfd:
	      Run make check-vfd instead of just make check.
    exttest <testscript>;
              Run testscript;
    exec <command>:
              Run <command>;
    module-load <module-list>:
              Load modules in comma-separated <module-list>;
    op-configure <option>:
              Pass <option> to the configure command
              E.g., "snapshot op-configure --enable-parallel"
                  configures for parallel mode
    --<option>:
              Pass --<option> to the configure command
              E.g., "snapshot --enable-parallel"
                  configures for parallel mode
EOF
    exit $errcode
}

# MAIN
# SGI /bin/sh replaces $0 as function name if used in a function.
# Set the name here to avoid that ambiguity and better style too.
PROGNAME=$0
SNAPSHOTNAME=
HDFREPOS=
DOCVERSION=""
MODULELIST=""

if [ -f bin/snapshot_params ]; then
   . bin/snapshot_params
   echo "Added snapshot_params."
fi
if [ -z "$SWVER" -a -f bin/snapshot_version ]
then
   . bin/snapshot_version
   echo "Added snapshot_version."
fi
if [ -n ${HDFREPOS} -a -f  bin/snapshot-${HDFREPOS}-overrides ]; then
   . bin/snapshot-${HDFREPOS}-overrides
   echo "Added snapshot-${HDFREPOS}-overrides."
fi 

echo "====================================="
echo "$PROGNAME $*"
echo "====================================="
TIMESTAMP MAIN
uname -a

# setup exit banner message
trap EXIT_BANNER 0 1 2 9 15

# Dump environment variables before option parsing
echo ===Dumping environment variables before option parsing ===
printenv | sort
echo ===Done Dumping environment variables before option parsing ===

# snapshots release directory.  Default relative to $BASEDIR.
ReleaseDir_default=release_dir

# Where is the zlib library?
# At NCSA, half of the machines have it in /usr/lib, the other half at
# /usr/ncsa/lib.  Leave it unset.
ZLIB_default=
ZLIB=$ZLIB_default

# What compression methods to use? (md5 does checksum).  Doc was apparently 
# added as a compression method to create a separate tarfile containing the
# documentation files for v 1.8 and above.
if [ "${SWVERSION}" = "hdf5_1_6" ]; then
    METHODS="gzip bzip2 md5"
else
    METHODS="gzip bzip2 doc"
fi

# Use User's MAKE if set.  Else use generic make.
MAKE=${MAKE:-make}

# Default check action.
CHECKVAL=check

#
# Command options
cmd="all"
test_opt=""
errcode=0
AUTOGEN=""
EXTTEST=""
EXEC_CMD_ARG=""
while [ $# -gt 0 ] ; do
    case "$1" in
	all)	
	    cmd="all"
	    ;;
        checkout-autogen)
            cmdcheckout="checkout"
            AUTOGEN="autogen"
            cmd=""
            ;;
	checkout)
	    cmdcheckout="checkout"
	    cmd=""
	    ;;
        ftp)
            echo "Setting ftp flags in snapshot script"
            cmdcheckout="checkout"
            cmdftp="ftp"
            cmd=""
            shift
	    if [ $# -lt 1 ]; then
		echo "URL missing"
		errcode=1
		cmd="help"
		break
	    fi
            ftp_url="$1"
            echo "ftp_url is $ftp_url"
            ;;
	diff)
	    cmddiff="diff"
	    cmd=""
	    ;;
	deploy)
	    # deploy the built binary.
	    shift
	    if [ $# -lt 1 ]; then
		echo "deploy <dir> missing"
		errcode=1
		cmd="help"
		break
	    fi
	    cmddeploy="deploy"
	    DEPLOYDIRNAME="$1"
	    ;;
	deploydir)
	    # default directory for deployment.
	    shift
	    if [ $# -lt 1 ]; then
		echo "deploydir <dir> missing"
		errcode=1
		cmd="help"
		break
	    fi
	    deploydir="$1"
	    ;;
	test)
	    cmdtest="test"
	    cmd=""
	    ;;
	setenv)
	    # set environment variable
	    shift
	    eval $1="$2"
	    export $1
	    shift
	    ;;
	setenvN)
	    # set environment variable with $1 values
	    # e.g., setenvN 3 x a b c is same as setenv x="a b c".
	    # a kludge now--the extra single quotes are needed
	    # else eval complains.
	    shift
	    envN=$1
	    shift
	    envname=$1
	    envalue=
	    while test $envN -gt 0; do
		shift
		envalue="$envalue $1"
		envN=`expr $envN - 1`
	    done
	    eval $envname="'$envalue'"
	    export $envname
	    ;;
	srcdir)
	    #use srcdir option for test
	    srcdir="yes"
	    ;;
	srcdirname)
	    shift
	    if [ $# -lt 1 ]; then
		echo "srcdirname <dir> missing"
		errcode=1
		cmd="help"
		break
	    fi
	    SRCDIRNAME="$1"
	    ;;
	release)
	    cmdrel="release"
	    cmd=""
	    ;;
        autogen-release)
            cmdrel="autogen-release"
            cmd=""
            ;;
	clean | distclean)
	    cmdclean="$1"
	    cmd=""
	    ;;
	help)
	    cmd="help"
	    break
	    ;;
	echo)
	    set -x
	    break
	    ;;
	zlib)
	    shift
	    if [ $# -lt 1 ]; then
		echo "ZLIB information missing"
		errcode=1
		cmd="help"
		break
	    fi
	    ZLIB="$1"
	    ;;
	releasedir)
	    shift
	    if [ $# -lt 1 ]; then
		echo "Release directory name missing"
		errcode=1
		cmd="help"
		break
	    fi
	    ReleaseDir="$1"
	    ;;
        exttest)
            shift
	    if [ $# -lt 1 ]; then
		echo "exttest script name missing"
		errcode=1
		cmd="help"
		break
	    fi
	    cmd=""
            EXTTEST="$1"
            ;;
        exec)
            shift
	    if [ $# -lt 1 ]; then
		echo "exec command name missing"
		errcode=1
		cmd="help"
		break
	    fi
	    cmd=""
            EXEC_CMD_ARG="$@"
	    # exit the parsing while loop since all arguments have been consummed.
	    break
            ;;
	check-vfd)
	    CHECKVAL=check-vfd
	    ;;
        module-load)
            shift
            if [ $# -lt 1 ]; then
                echo "missing module list to load"
                errcode=1
                cmd="help"
                break
            fi 
            MODULELIST="$1"
            ;;
	--*)
	    OP_CONFIGURE="$OP_CONFIGURE $1"
	    ;;
	op-configure)
	    shift
	    if [ $# -lt 1 ]; then
		echo "op-configure option missing"
		errcode=1
		cmd="help"
		break
	    fi
	    OP_CONFIGURE="$OP_CONFIGURE $1"
	    ;;
	*)
	    echo "Unkown option $1"
	    errcode=1
	    cmd="help"
	    break
	    ;;
    esac
    shift
done

if [ -n "$MODULELIST" ]; then
   . ~/.bashrc
   module use /opt/pkgs/modules/all
   # load module command will take a space separated list of modules.
   # If we have a comma separated list, convert ',' to ' '.
   MODULELIST="$( echo -e "$MODULELIST" | tr  ',' ' '  )"  
   module load $MODULELIST
fi

# Dump environment variables after option parsing
echo ===Dumping environment variables after option parsing ===
printenv | sort
echo ===Done Dumping environment variables after option parsing ===

if [ "$cmd" = help ]; then
   DISPLAYUSAGE
fi

# Setup the proper configure option (--with-zlib) to use zlib library
# provide ZLIB is non-empty.
ZLIB=${ZLIB:+"--with-zlib="$ZLIB}
# Adding --prefix as a configure option will put the path to the deploy 
# directory in the initial libhdf5*.la files
if [ -n "$DEPLOYDIRNAME" ]; then
   OP_CONFIGURE="$OP_CONFIGURE --prefix=${deploydir}/${DEPLOYDIRNAME}"
fi
CONFIGURE="configure $OP_CONFIGURE"
# echo "Configure command is $CONFIGURE"

# Execute the requests
snapshot=yes

BASEDIR=${HOME}/snapshots-${SNAPSHOTNAME}
if [ ! -d ${BASEDIR} ]; then
    echo "BASEDIR ($BASEDIR) does not exist"
    exit 1
fi

CURRENT=${BASEDIR}/current
PREVIOUS=${BASEDIR}/previous
ReleaseDir=${ReleaseDir:=${BASEDIR}/${ReleaseDir_default}}
HOSTNAME=`hostname | cut -f1 -d.`	# no domain part

# Try finding a version of diff that supports the -I option too.
DIFF=diff
for d in `echo $PATH | sed -e 's/:/ /g'` ; do
    test -x $d/diff && $d/diff -I XYZ /dev/null /dev/null > /dev/null 2>&1 &&
	DIFF=$d/diff && break
done

#=============================
# Run source checkout
#=============================
if [ "$cmd" = "all" -o -n "$cmdcheckout" ]; then
    TIMESTAMP "checkout"
    # ${BASEDIR}/bin is now updated from git by EveningMaint or DailyMaint
    # to avoid updating the scripts in ${BASEDIR}/bin while they are running.

    if [ -z "$AUTOGEN" ]; then
        # If there is a Makefile in ${CURRENT}, the last test done in it
        # has not been distclean'ed.  They would interfere with other
        # --srcdir build since make considers the files in ${CURRENT}
        # take precedence over files in its own build-directory.  Run
        # a "make distclean" to clean them all out.  This is not really
        # part of the "checkout" functions but this is the most convenient
        # spot to do the distclean.  We will also continue the checkout process
        # regardless of the return code of distclean.
        ( cd ${CURRENT}; test -f Makefile && ${MAKE} distclean)
    fi
    # echo "cmdftp is $cmdftp;  ftp_url is $ftp_url"
    if [ -n "$cmdftp" ]; then
        echo "Get the NetCDF4 source from their ftp server."
        echo "Command executed is: 2>&1 wget -N $ftp_url" 
        cd ${BASEDIR};
        WGET_OUTPUT="`2>&1 wget -N $ftp_url`"
        errcode=$?
        if [[ $errcode -ne 0 ]]; then
            exit $errcode
        fi

        if [ $? -ne 0 ];then
            echo $0: "$WGET_OUTPUT" Exiting.
            exit 1
        fi

        # echo "Wget output was $WGET_OUTPUT"

        if echo "$WGET_OUTPUT" | fgrep 'not retrieving' &> /dev/null
        then
            echo "Snapshot unchanged"
        else
            echo "New snapshot downloaded"
            EXTRACT
        fi
    else
        SOURCE_CHECKOUT
    fi
fi # Do source checkout


#=============================
# Run Test the HDF5 library
#=============================
if [ "$cmd" = "all" -o -n "$cmdtest" -o -n "$cmddiff" ]; then
    TIMESTAMP "Run Tests"
    # setup if srcdir is used.
    if [ -z "$srcdir" ]; then
	TESTDIR=${CURRENT}
    else
	#create TESTDIR if not exist yet
	case "$SRCDIRNAME" in
	"")
	    SRCDIRNAME=$HOSTNAME
	    ;;
	-*)
	    SRCDIRNAME="$HOSTNAME$SRCDIRNAME"
	    ;;
	esac
	TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
	test -d ${TESTDIR} || mkdir ${TESTDIR}
        # set TESTDIR to use the direct path to the local test directory
        # rather than the path through ${BASEDIR}.
        cd ${TESTDIR}
        TESTDIR=`pwd -P`
        cd ${CURRENT}
    fi
    # Make sure current version exists and is clean
    if [ -d ${TESTDIR} ]; then
        DISTCLEAN    
    else
	errcode=$?
        snapshot=no
        exit $errcode
    fi

    # Compare it with the previous version.  Compare only files listed in
    # the MANIFEST plus the MANIFEST itself.
    if [ -d ${PREVIOUS} ]; then
        if [ -z "${AUTOGEN}" ]; then
            CURRENTSRC=${CURRENT}
        else
            CURRENTSRC=${BASEDIR}/current_src
        fi
	if (${DIFF} -c ${PREVIOUS}/MANIFEST ${CURRENTSRC}/MANIFEST); then
	    snapshot=no
	    for src in `grep '^\.' ${CURRENTSRC}/MANIFEST|expand|cut -f1 -d' '`; do
		if ${DIFF} -I H5_VERS_RELEASE -I " released on " \
		    -I " currently under development" \
		    ${PREVIOUS}/$src ${CURRENTSRC}/$src
		then
		    :	#continue
		else
		    snapshot=yes
		    break
		fi
	    done
	fi
    fi

    # if diff is choosen, exit 0 if no significant differences are found.
    # otherwise, exit 1.  This includes cases of other failures.
    if [ -n "$cmddiff" ]; then
	if [ $snapshot = no ]; then
	    exit 0
	else
	    exit 1
	fi
    fi

    #=============================
    # Execute command if defined
    #=============================
    #echo BEFORE EXEC command
    #echo EXEC_CMD_ARG=${EXEC_CMD_ARG}
    
    if [ -n "$EXEC_CMD_ARG" ]; then
        TIMESTAMP ${EXEC_CMD_ARG}
        TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
        test -d ${TESTDIR} || mkdir ${TESTDIR}
	if cd ${TESTDIR}; then
	    # clean up the directory before executing the command
	    # Do we need to clean first?
	    # rm -rf *
	    #
	    # If EXEC_CMD_ARG starts with a '/', it has an absolute path, else it is
	    # relative to the BASEDIR.
	    case "$EXEC_CMD_ARG" in
	    /*)
                ${EXEC_CMD_ARG}
		;;
	    *)
                ${BASEDIR}/${EXEC_CMD_ARG}
		;;
	    esac
	    errcode=$?
	else
	    echo "${TESTDIR} not accessible"
	    errcode=1
	fi
	# exit snapshot since nothing else to do, for now.
        exit $errcode
    fi

    # Build, run tests and install procedures
    if [ "$snapshot" = "yes" ] && [ "$NOMAKE" != "yes" ]; then
        FAIL_SECTION="" 
        if [ -f ${TESTDIR}/failsection ]; then
            rm ${TESTDIR}/failsection
        fi
	if (cd ${TESTDIR} && \
	    TIMESTAMP "configure" && echo "configure" > ${TESTDIR}/failsection && \
	    RUNCONFIGURE && \
            sleep 2 && \
	    TIMESTAMP "make" && echo "make" > ${TESTDIR}/failsection && \
	    ${MAKE} && DISKUSAGE \
	    TIMESTAMP ${CHECKVAL} && echo "make check" > ${TESTDIR}/failsection &&  \
	    ${MAKE} ${CHECKVAL} && DISKUSAGE \
	    TIMESTAMP "install" && echo "make install" > ${TESTDIR}/failsection && \
	    ${MAKE} install && DISKUSAGE \
            TIMESTAMP "check-install" && echo "make check-install" > ${TESTDIR}/failsection && \
	    CHECKINSTALL && DISKUSAGE \
	    TIMESTAMP "uninstall" && echo "make uninstall" > ${TESTDIR}/failsection && \
	    ${MAKE} uninstall && DISKUSAGE); then
	    :
	else
	    errcode=$?
            FAIL_SECTION=`cat ${TESTDIR}/failsection`
            echo "Failed running ${FAIL_SECTION}"
	    snapshot=no
	    exit $errcode
	fi
    elif [ $CPSRC ]; then
           cp -pr ${CURRENT}/* ${TESTDIR}
    else 
        cmdclean=""
    fi
fi # Test the HDF5 library

# Run external test if configured

#=============================
#=============================
#if [ -d "$CURRENT" ]; then
if [ "$EXTTEST" != "" ]; then
    TIMESTAMP ${EXTTEST}
    TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
    test -d ${TESTDIR} || mkdir ${TESTDIR}
    cd ${TESTDIR}
    sleep 1
    TIMESTAMP $pwd
    ls
    ${BASEDIR}/${EXTTEST}
    errcode=$?
    exit $errcode
fi
 
#=============================
# Run deployment if requested.
#=============================
if [ -n "$DEPLOYDIRNAME" ]; then
    # The daily tests deploy to .../hdf5/... or .../hdf4/... except on cobalt where the
    # deploy directory is in .../HDF5/...  lc will take care of this.  If hdf4 or hdf5
    # either upper or lower case isn't in the path, RELEASE.txt won't be found unless
    # it is in $CURRENT. 
    POS4=`perl -e "print index(lc(\"${deploydir}/${DEPLOYDIRNAME}\"), 'hdf4')"`
    POS5=`perl -e "print index(lc(\"${deploydir}/${DEPLOYDIRNAME}\"), 'hdf5')"`
    if [ "${POS4}" -ge "0" ]; then
        RELEASE_TXT_LOC="release_notes"
    elif [ "${POS5}" -ge "0" ]; then
        RELEASE_TXT_LOC="release_docs"
    else
        RELEASE_TXT_LOC=""
    fi
 
    if [ "$snapshot" = "yes" ]; then
	TIMESTAMP "deploy"
        if (cd ${TESTDIR} &&
            ${BASEDIR}/bin/deploy ${deploydir}/${DEPLOYDIRNAME} && \
            TIMESTAMP "clean" && \
            ${MAKE} clean && \
            TIMESTAMP "check-install prefix=${deploydir}/${DEPLOYDIRNAME}" && \
            CHECKINSTALL prefix=${deploydir}/${DEPLOYDIRNAME}); then
                cd ${CURRENT}  
                cp ${RELEASE_TXT_LOC}/RELEASE.txt ${deploydir}/${DEPLOYDIRNAME} 
                cp COPYING ${deploydir}/${DEPLOYDIRNAME}
	    #:	#continue
	else
	    errcode=$?
	    exit $errcode
	fi
    fi
fi # Deploy


#=============================
# Run Release snapshot, update version, and commit to source repository
#=============================
if [ "$cmd" = "all" -o -n "$cmdrel" ]; then
    if [ "$snapshot" = "yes" ]; then
	TIMESTAMP "release"
        DISTCLEAN
	(
	    # Turn on exit on error in the sub-shell so that it does not
	    # commit source if errors encounter here.
	    set -e
            if [ "$cmdrel" = "autogen-release" ]; then
                cd ${BASEDIR}/current_src
            else
	        cd ${CURRENT}
            fi
            if [ "$HDFREPOS" = "hdf4" ]; then
	        RELEASE_VERSION="`perl bin/h4vers -v`"
	        echo "Making snapshot release ($RELEASE_VERSION) to ${ReleaseDir}..."
	        bin/release -d $ReleaseDir $METHODS
	        perl bin/h4vers -i
            elif [ "$HDFREPOS" = "hdf5" ]; then
	        RELEASE_VERSION="`perl bin/h5vers -v`"
	        echo "Making snapshot release ($RELEASE_VERSION) to ${ReleaseDir}..."
                if [ "${DOCVERSION}" ]; then
	            bin/release -d $ReleaseDir --docver ${DOCVERSION} $METHODS
                else
	            bin/release -d $ReleaseDir $METHODS
                fi
	        perl bin/h5vers -i
            else
                echo "need real release steps.  For now, only move current version to previous"
            fi
            COMMITSNAPSHOT
	)
	errcode=$?
    fi

    # Replace the previous version with the current version.
    # Should check if the errcode of the release process but there
    # are other failures after release was done (e.g. h5vers or git failures)
    # that should allow the replacement to occure.
    rm -rf ${PREVIOUS}
    mv ${CURRENT} ${PREVIOUS}
fi #Release snapshot


#=============================
# Clean the test area.  Default is no clean.
#=============================
if [ -n "$cmdclean" ] && [ "$NOMAKE" != "yes" ]; then
    TIMESTAMP "clean"
    # setup if srcdir is used.
    if [ -z "$srcdir" ]; then
	TESTDIR=${CURRENT}
    else
	case "$SRCDIRNAME" in
	"")
	    SRCDIRNAME=$HOSTNAME
	    ;;
	-*)
	    SRCDIRNAME="$HOSTNAME$SRCDIRNAME"
	    ;;
	esac
	TESTDIR=${BASEDIR}/TestDir/${SRCDIRNAME}
    fi
    # clean it
    if (cd ${TESTDIR} && ${MAKE} $cmdclean ) then
	:
    else
	errcode=$?
        snapshot=no
        exit $errcode
    fi
fi # Clean the Test directory

exit $errcode