summaryrefslogtreecommitdiffstats
path: root/release-helpers/cut_release
blob: eff78017ffcf5cbce4c78bde8243a73fe9e11b98 (plain) (blame)
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
#! /bin/bash
#
#  Cut a snapshot of a module in CVS
#
#  Example Invocations:
#
#  TBD
#

usage()
{
  echo "$0 [options]"
  echo "  options:"
  echo "    -c release      -- current release         (required)"
  echo "    -p release      -- previous release        (NA == none)"
  echo "    -m module       -- CVS module name         (required)"
  echo "    -r release_name -- base of release image name"
  echo "    -d directory    -- release directory       (required)"
  echo "    -z              -- use gzip not bzip2 for archives"
  echo "    -V              -- generate file Version report"
  echo "    -v              -- be verbose"
  echo
  echo "Must be run from top level directory of checked out source."
  echo
  exit 1
}

fatal()
{
  echo $*
  usage
}

previous=NA
current=NOT_SET
reldir_base=NOT_SET
module_name=NOT_SET
release_name=NOT_SET
verbose=no
zipper=bzip2
unzipper=bunzip2
zext=bz2
do_version_report=no

while test $# -ge 1; do
  case $1 in
    -c) shift ; current=$1 ;;
    -p) shift ; previous=$1 ;;
    -m) shift ; module_name=$1 ;;
    -r) shift ; release_name=$1 ;;
    -d) shift ; reldir_base=$1 ;;
    -z) zipper=gzip ; unzipper=gunzip ; zext=gz ;;
    -V) do_version_report=yes ;;
    -v) verbose=yes ;;
    *)
      fatal "invalid option $1"
      ;;
  esac
  shift
done

if test ${module_name} = NOT_SET ; then
  grep "/" CVS/Repository >/dev/null
  if test $? -eq 0 ; then
    fatal "Module name not specified."
  fi
  module_name=`cat CVS/Repository`
fi

if test ${reldir_base} = NOT_SET ; then
  reldir_base=/home/releases/${module_name}
  if test ! -d ${reldir_base} ; then
    fatal "Release directory not specified and ${reldir_base} does not exist."
  fi
  module_name=`cat CVS/Repository`
else
  if test ! -d ${reldir_base} ; then
    fatal "Release directory (${reldir_base}) does not exist."
  fi
fi

if test ${verbose} = yes ; then
  echo "==========================================="
  echo "Current Release         :" ${current}
  echo "Previous Release        :" ${previous}
  echo "Module Name             :" ${module_name}
  echo "Release Base Name       :" ${release_name}
  echo "Release Directory       :" ${reldir_base}
  echo "Compression             :" ${zipper} ${unzipper} ${zext}
  echo "Generate Version Report :" ${do_version_report}
  echo "==========================================="
  exit 0
fi

# Now check the arguments

if test ${current} = NOT_SET ; then
  fatal "Current release not specified."
fi

if test ${release_name} = NOT_SET ; then
  echo "Using module_name (${module_name}) as release name.".
  release_name=${module_name}
fi

##### setup some directory assumptions
reldir_prev=${reldir_base}/${previous}
reldir_curr=${reldir_base}/${current}
export_dir=${reldir_base}/export
base=`pwd`
cvs_root=`cat ${base}/CVS/Root`
cvs_repository=`cat ${base}/CVS/Repository`
cvs_module=`basename ${cvs_repository}`

# Make sure we are at the top of a checked out tree
if [ "${cvs_module}"X != "${module_name}"X ] ; then
   echo You do not appear to be in the top level of a checked out ${module_name} tree
   exit 1
fi

#  Test if we generate diffs and the old release is there.
if [ ${previous} != "NA" ] ; then
  if [ ! -d ${reldir_prev} ] ; then
    echo Previous release ${previous} not found
    exit 1
  fi
fi

# Check that the export directory exists
test -d ${export_dir} || mkdir ${export_dir}

#  turn the version string into a valid cvs tag
mk_version_tag()
{
  echo ${release_name}-${1} | tr "." "-"
}

current_tag=`mk_version_tag ${current}`
previous_tag=`mk_version_tag ${previous}`

if [ ${previous} != "NA" ] ; then
  echo Using $previous_tag as the tag for the previous version
else
  echo No previous version
fi
echo Using $current_tag as the tag for the current version

# Changing the version string

cd ${base}
Pname=${module}
if test -x ${base}/release_support ; then
  Pname=`${base}/release_support name`
  test $? -ne 0 && (echo "release support (name) script failed." ; exit 1)
fi

# make sure certain special files are there prior to a release
if [ ! -r VERSION -o ! -r SUPPORT ] ; then
  echo Error unable to find VERSION or SUPPORT in the working tree.
  exit 1
fi

# We often need to know who is cutting the release
if test "X${LOGNAME}" = "X" ; then
  echo "LOGNAME not set"
  usage
fi

user_name=`grep ^$LOGNAME /etc/passwd | cut -d':' -f5 | cut -d',' -f1`
# If you don't have user information, then we won't commit anything.
if test "X${user_name}" = "X" ; then
  echo "User information not set"
  usage
fi

# before we tag anything make sure it hasn't previously been exported
if [ -d ${export_dir}/${release_name}-${current} ] ; then
  echo You must have run this before.
  echo Removing ${release_name}-${current}
  rm -rf ${export_dir}/${release_name}-${current}
fi

# This is where the module has the opportunity to do actions before we tag.
if test -x ${base}/release_support ; then
  ${base}/release_support pretag ${release_name} ${current}
  test $? -ne 0 && (echo "release support (pretag) script failed." ; exit 1)
fi

#
#  Whether or not there were special considerations, there might be a
#  version file.
#
version_file=VERSION
if [ -r ${version_file} ] ; then
    if test "X${user_name}" = "X" ; then
      echo "ERROR: User information not set in password file"
      usage
    fi
    ( echo "#" ;
      echo "#  This file is automatically generated -- DO NOT EDIT!!!" ;
      echo "#" ;
      echo "#  \$Id\$" ;
      echo "#" ;
      echo ;
      echo ${Pname} "Version ${current}" ) >$version_file
      ( echo `date +"%Y-%m-%d"`"	${user_name}" ;
        echo ;
        echo "	* ${version_file}: Updated to ${release_name}-${current}." ;
        echo ) >YYY
      if [ -r ChangeLog ] ; then
        cat YYY ChangeLog >XXX
        mv XXX ChangeLog
        cvs -d ${cvs_root} commit -F YYY ChangeLog ${version_file}
        rm -f YYY
      else
        cvs -d ${cvs_root} commit -m \
               "changed version to ${current}" ${version_file}
      fi
fi

# tag the current source
cd ${base}
cvs -d ${cvs_root} tag ${current_tag} `grep -v "^D$" CVS/Entries | cut -d'/' -f2`
if test $? -ne 0 ;  then
  echo Unable to tag source
  exit 1
fi

# export the current source
cd ${export_dir}
cvs -d ${cvs_root} export -r ${current_tag} -d ${release_name}-${current} ${module_name}
if test $? -ne 0 ;  then
  echo Unable to export source
  exit 1
fi

# Now start dealing with the exported source
cd ${release_name}-${current}
#if [ ! -r VERSION -o ! -r SUPPORT ] ; then
#  echo Error unable to find VERSION or SUPPORT in the exported tree.
#  exit 1
#fi

# This is where the module has the opportunity to do actions after we export.
if test -x ${base}/release_support ; then
  ${base}/release_support postexport
  test $? -ne 0 && (echo "release support (postexport) script failed." ; exit 1)
fi

# cut the release files
test -d ${reldir_curr} || mkdir ${reldir_curr}

# Generate tar and compress it.
cd ..
tar cf ${reldir_curr}/${release_name}-${current}.tar ${release_name}-${current}
${zipper} ${reldir_curr}/${release_name}-${current}.tar


# generate diffs if requested
if [ ${previous} != "NA" ] ; then
  if [ -r ${reldir_prev}/${release_name}-${previous}.tgz ] ; then
    tar xzf ${reldir_prev}/${release_name}-${previous}.tgz
  fi
  if [ -r ${reldir_prev}/${release_name}-${previous}.tar.gz ] ; then
    tar xzf ${reldir_prev}/${release_name}-${previous}.tar.gz
  fi
  if [ -r ${reldir_prev}/${release_name}-${previous}.tar.bz2 ] ; then
    bzcat ${reldir_prev}/${release_name}-${previous}.tar.bz2 | tar xf -
  fi

  diff -N -P -r -u ${release_name}-${previous} ${release_name}-${current} \
     >${reldir_curr}/${release_name}-${previous}-${current}.diff

  ls -l ${reldir_curr}/${release_name}-${previous}-${current}.diff

  ${zipper} ${reldir_curr}/${release_name}-${previous}-${current}.diff

  ls -l ${reldir_curr}/${release_name}-${previous}-${current}.diff.${zext}

fi

# This is where the module has the opportunity to do actions after
# the tarball is made.  This can be used to capture host information,
# sign the tarball, etc.
#
#  NOTE: The contents are virgin before this is executed and it is OK
#        if the script generates files in the tree.  This is commonly
#        where documentation might be automatically generated.
cd ${release_name}-${current}
if test -x ${base}/release_support ; then
  ${base}/release_support after_tar ${current} ${reldir_curr}
fi

# generate a ChangeLog difference
#
# NOTE:  Removes ALL files not named ChangeLog.  Export directory is
#        useless past this point.
cd ..
if [ ${previous} != "NA" ] ; then
  if [ -r ${release_name}-${current}/ChangeLog ] ; then
    find ${release_name}-${previous} ${release_name}-${current} -type f | \
      grep -v ChangeLog | xargs -e rm -rf

    diff -N -P -r -c ${release_name}-${previous} ${release_name}-${current} \
       >${reldir_curr}/${release_name}-ChangeLog-${previous}-${current}.diff
  fi
fi

# generate the version report
cd ${base}
if [ ${do_version_report} = yes ] ; then
  # trace output from here down is EXTREMEMLY noisy
  set +x
  find . -type d -name "CVS" | while read d
  do
    D=`dirname $d`
    cat $d/Entries | grep -v ^D | while read entry
    do
      # echo $entry
      file=`echo $entry |  cut -d'/' -f2`
      ffile=`echo $D/$file | sed -e 's/^\.\///'`
      version=`echo $entry |  cut -d'/' -f3`
      modified=`echo $entry |  cut -d'/' -f4`
      # printf "%s\t%s\t%s\n" $D/$file $version "$modified"
      printf "%s\t%s\t%s\n" $version "$modified" $ffile
    done
  done >${reldir_curr}/${release_name}-${current}-FILES
fi

# generate md5 checksums
cd ${reldir_curr}
find `pwd` -type d | while read d
do
  cd $d
  rm -f md5sum.txt
  files=`find . -maxdepth 1 -type f | wc -l`
  if [ ${files} -eq 0 ] ; then
    echo $d is empty so no checksum generated
  else
    echo Checksum generated for $d
    md5sum `find . -maxdepth 1 -type f` >md5sum.txt
  fi
done

# remove the exported source to save space
rm -rf ${export_dir}

echo ${reldir_curr}/${release_name}-${current}.tar*

exit 0