summaryrefslogtreecommitdiffstats
path: root/bin/bbrelease
blob: c59e2e5fcf45018836aa97c56c4253afd1ffdb3e (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
#!/bin/sh
#
# Copyright by The HDF Group.
# 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://www.hdfgroup.org/licenses.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
#

# Make a release of hdf5.
#
#   NOTE:
#   This script differs from bin/release in that this has an added
#   --revision option to create private releases with the code revision
#   hash in the version strings.
#
#   This script can probably be merged into the original release script in
#   the future.

# Function definitions
#
# Print Usage page
USAGE()
{
cat << EOF
Usage: $0 -d <dir> [-h] [--private] [--revision [--branch BRANCHNAME]] <methods> ...
   -d DIR       The name of the directory where the release(s) should be
                placed.
   --branch BRANCHNAME  This is to get the correct version of the branch name from the
                        repository.  BRANCHNAME for v1.8 should be hdf5_1_8.
   -h           print the help page.
   --private    Make a private release with today's date in version information.
   --revision   Make a private release with the code revision number in version information.
                This allows --branch to be used for the file name.
   --branch BRANCHNAME  This is to get the correct version of the branch name from the
                        repository.  BRANCHNAME for v1.8 should be hdf5_1_8.

This must be run at the top level of the source directory.
The other command-line options are the names of the programs to use
for compressing the resulting tar archive (if none are given then
"tar" is assumed):

    tar         -- use tar and don't do any compressing.
    gzip        -- use gzip with "-9" and append ".gz" to the output name.
    bzip2       -- use bzip2 with "-9" and append ".bz2" to the output name.
    zip         -- convert all text files to DOS style and form a zip file for Windows use.

An md5 checksum is produced for each archive created and stored in the md5 file.

Examples:

    $ bin/release -d /tmp
    /tmp/hdf5-1.8.13-RELEASE.txt
    /tmp/hdf5-1.8.13.md5
    /tmp/hdf5-1.8.13.tar

    $ bin/release -d /tmp gzip
    /tmp/hdf5-1.8.13-RELEASE.txt
    /tmp/hdf5-1.8.13.md5
    /tmp/hdf5-1.8.13.tar.gz

    $ bin/release -d /tmp tar gzip zip
    /tmp/hdf5-1.8.13-RELEASE.txt
    /tmp/hdf5-1.8.13.md5
    /tmp/hdf5-1.8.13.tar
    /tmp/hdf5-1.8.13.tar.gz
    /tmp/hdf5-1.8.13.tar.zip

EOF

}

# Function name: tar2zip
# Convert the release tarball to a Windows zipball.
#
# Steps:
# 1. untar the tarball in a temporary directory;
#    Note: do this in a temporary directory to avoid changing
#    the original source directory which may be around.
# 2. convert all its text files to DOS (LF-CR) style;
# 3. form a zip file which is usable by Windows users.
#
# Parameters:
# $1 version
# $2 release tarball
# $3 output zipball file name
#
# Returns 0 if successful; 1 otherwise
#
tar2zip()
{
    if [ $# -ne 3 ]; then
        echo "usage: tar2zip <tarfilename> <zipfilename>"
        return 1
    fi
    ztmpdir=/tmp/tmpdir$$
    mkdir -p $ztmpdir
    version=$1
    tarfile=$2
    zipfile=$3

    # step 1: untar tarball in ztmpdir
    (cd $ztmpdir; tar xf -) < $tarfile
    # sanity check
    if [ ! -d $ztmpdir/$version ]; then
        echo "untar did not create $ztmpdir/$version source dir"
        # cleanup
        rm -rf $ztmpdir
        return 1
    fi
    # step 2: convert text files
    # There maybe a simpler way to do this.
    # options used in unix2dos:
    # -k   Keep the date stamp
    # -q   quiet mode
    # grep redirect output to /dev/null because -q or -s are not portable.
    find $ztmpdir/$version | \
        while read inf; do \
            if file $inf | grep "$inf\: .*text" > /dev/null 2>&1 ; then \
                unix2dos -q -k $inf; \
            fi\
        done
    # step 3: make zipball
    # -9 maximum compression
    # -y Store symbolic links as such in the zip archive
    # -r recursive
    # -q quiet
    (cd $ztmpdir; zip -9 -y -r -q $version.zip $version)
    mv $ztmpdir/$version.zip $zipfile

    # cleanup
    rm -rf $ztmpdir
}

# This command must be run at the top level of the hdf5 source directory.
# Verify this requirement.
if [ ! \( -f configure.ac -a -f bin/bbrelease \) ]; then
    echo "$0 must be run at the top level of the hdf5 source directory"
    exit 1
fi

# Defaults
DEST=releases
VERS=`perl bin/h5vers`
VERS_OLD=
test "$VERS" || exit 1
verbose=yes
release_date=`date +%F`
today=`date +%Y%m%d`
pmode='no'
revmode='no'
tmpdir="../#release_tmp.$$"     # tmp work directory
CPPLUS_RM_NAME=cpplus_RM

# Restore previous Version information
RESTORE_VERSION()
{
    if [ X-${VERS_OLD} != X- ]; then
        echo restoring version information back to $VERS_OLD
        rm -f config/lt_vers.am
        cp $tmpdir/lt_vers.am config/lt_vers.am
        bin/h5vers -s $VERS_OLD
        VERS_OLD=
    fi
}


# Command-line arguments
while [ -n "$1" ]; do
    arg=$1
    shift
    case "$arg" in
        -d)
            DEST=$1
            shift
            ;;
        -h)
            USAGE
            exit 0
            ;;
        --private)
            pmode=yes
            ;;
        --revision)
            revmode=yes
            ;;
        --branch)
            BRANCHNAME=$1
            shift
            ;;
        -*)
            echo "Unknown switch: $arg" 1>&2
            USAGE
            exit 1
            ;;
        *)
            methods="$methods $arg"
            ;;
    esac
done

# Default method is tar
if [ "X$methods" = "X" ]; then
    methods="tar"
fi

# Create the temporary work directory.
if mkdir $tmpdir; then
    echo "temporary work directory for release.  "\
         "Can be deleted after release completes." > $tmpdir/README
else
    echo "Failed to mkdir tmpdir($tmpdir)"
    exit 1
fi

# setup restoration in case of abort.
trap RESTORE_VERSION 0

if [ X$pmode = Xyes ]; then
    VERS_OLD=$VERS
    # Copy old version of config/lt_vers.am, since it's hard to
    # "undo" changes to it.
    cp config/lt_vers.am $tmpdir
    # Set version information to m.n.r-of$today.
    # (h5vers does not correctly handle just m.n.r-$today.)
    VERS=`echo $VERS | sed -e s/-.*//`-of$today
    echo Private release of $VERS
    bin/h5vers -s $VERS
fi

if [ X$revmode = Xyes ]; then
    VERS_OLD=$VERS
    echo "Save old version $VERS_OLD for restoration later."
    # Copy old version of config/lt_vers.am, since it's hard to
    # "undo" changes to it.
    cp config/lt_vers.am $tmpdir
    if [ "${BRANCHNAME}" = "" ]; then
        BRANCHNAME=`git symbolic-ref -q --short HEAD`
    fi
    revision=`git rev-parse --short HEAD`
    # Set version information to m.n.r-r$revision.
    # (h5vers does not correctly handle just m.n.r-$today.)
    VERS=`echo $VERS | sed -e s/-.*//`-$revision
    echo Private release of $VERS
    HDF5_VERS=hdf5-$BRANCHNAME-$revision
    echo file base of $HDF5_VERS
    bin/h5vers -s $VERS
    # use a generic directory name for revision releases
    HDF5_IN_VERS=hdfsrc
else
    # Store hdf5-$VERS ("hdf5-1.7.51", e.g.) to a variable to avoid typos
    HDF5_VERS=hdf5-$VERS
    # directory name matches tar file name for non-revision releases
    HDF5_IN_VERS=$HDF5_VERS
fi

test "$verbose" && echo "Releasing $HDF5_VERS to $DEST" 1>&2
if [ ! -d $DEST ]; then
    echo "   Destination directory $DEST does not exist" 1>&2
    exit 1
fi

# Create a symlink to the source so files in the tarball have the prefix
# we want (gnu's --transform isn't portable)
ln -s `pwd` $tmpdir/$HDF5_IN_VERS || exit 1

# Save a backup copy of Makefile if exists.
test -f Makefile && mv Makefile $tmpdir/Makefile.x
cp -p Makefile.dist Makefile

# Update README.md and release_docs/RELEASE.txt with release information in
# line 1.
for f in README.md release_docs/RELEASE.txt; do
    echo "HDF5 version $VERS released on $release_date" >$f.x
    sed -e 1d $f >>$f.x
    mv $f.x $f
    # Make sure new files are of the right access mode
    chmod 644 $f
done

# Create the tar file
test "$verbose" && echo "   Running tar..." 1>&2
(cd "$tmpdir" && exec tar -ch --exclude-vcs -f "$HDF5_VERS.tar" "./$HDF5_IN_VERS" || exit 1 )

# Compress
MD5file=$HDF5_VERS.md5
cp /dev/null $DEST/$MD5file
for comp in $methods; do
    case $comp in
        tar)
            cp -p $tmpdir/$HDF5_VERS.tar $DEST/$HDF5_VERS.tar
            (cd $DEST; md5sum $HDF5_VERS.tar >> $MD5file)
            ;;
        gzip)
            test "$verbose" && echo "   Running gzip..." 1>&2
            gzip -9 <$tmpdir/$HDF5_VERS.tar >$DEST/$HDF5_VERS.tar.gz
            (cd $DEST; md5sum $HDF5_VERS.tar.gz >> $MD5file)
            ;;
        bzip2)
            test "$verbose" && echo "   Running bzip2..." 1>&2
            bzip2 -9 <$tmpdir/$HDF5_VERS.tar >$DEST/$HDF5_VERS.tar.bz2
            (cd $DEST; md5sum $HDF5_VERS.tar.bz2 >> $MD5file)
            ;;
        zip)
            test "$verbose" && echo "   Creating zip ball..." 1>&2
            tar2zip $HDF5_IN_VERS $tmpdir/$HDF5_VERS.tar $DEST/$HDF5_VERS.zip 1>&2
            (cd $DEST; md5sum $HDF5_VERS.zip >> $MD5file)
            ;;
        *)
            echo "***Error*** Unknown method $comp"
            exit 1
            ;;
    esac
done

# Copy the RELEASE.txt to the release area.
cp release_docs/RELEASE.txt $DEST/$HDF5_VERS-RELEASE.txt

# Remove distributed Makefile and restore previous Makefile if existed.
rm -f Makefile
test -f $tmpdir/Makefile.x && mv $tmpdir/Makefile.x Makefile

# Restore OLD version information, then no need for trap.
if [ X$pmode = Xyes ] || [ X$revmode = Xyes ]; then
    echo "Restore the original version $VERS_OLD"
    RESTORE_VERSION
    trap 0
fi

# Remove temporary things
rm -rf $tmpdir

echo "DONE"

exit 0