summaryrefslogtreecommitdiff
path: root/tools/announce-text
blob: 9341d9ba337894e86f76c0439f6df8a163006d12 (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
#!/bin/sh

# This announce-text script should be run before publishing an announce
# of a new GNU MPFR release or release candidate. It does some checking,
# then it outputs the announce text to stdout. Information messages are
# written to stderr.
#
# Warning! The release name in the announce text may contain accented
# letters. Make sure they are preserved if your locales are not UTF-8
# based. Moreover, you may need to modify the text.
#
# Specific dependencies:
#   GNU Coreutils (sha1sum, sha256sum, date), svn, gpg, unzip, wget.
#
# Usage: announce-text [ <variable_settings> ]
# where arguments can be, for instance:
#   root=<repository_root>
#   vers=<mpfr_version>
#   nopgpsig=1  to disable checking of the PGP signatures.
#   nowebsrv=1  to disable checking of the mpfr.org web server.
#   nogforge=1  to disable checking of the tarballs on InriaForge.
#   nognuftp=1  to disable checking of the tarballs on the GNU FTP.
#
# When it is run from a working copy, setting $root is not necessary.

set -e

tmpdir=$(mktemp -d /tmp/announce-text-XXXXXXXX)
trap 'rm -rf $tmpdir' 0 1 2 15
echo "Temporary directory: $tmpdir" >&2

alias wget="wget --no-config -q"

for i in $@
do
  eval "$i"
done

[ -z "$root" ] && root=$(svn info | sed -n 's/^Repository Root: //p')
echo "Repository root: $root" >&2

cd $tmpdir

#vers=$(svn ls --xml "$root/tags" | xmlstarlet sel -T -t -v \
#  "//entry[not(commit/@revision < //entry/commit/@revision)]/name" -)
[ -z "$vers" ] && vers=$(svn ls -v "$root/tags" | perl -ne \
  'm,^\s*(\d+)\s.*\s(\d+\.\d+\.\d+)/, && $1 > $r and ($r,$v) = ($1,$2);
   END { print $v }')
base=${vers%-rc*}
echo "MPFR version: $vers" >&2
echo "Base version: $base" >&2

if [ $vers = $base ]; then
  # This is a release (not a release candidate).
  tagversfile="$root/tags/$vers/VERSION"
  tagvers=$(svn cat "$tagversfile")
  if [ $vers != "$tagvers" ]; then
    echo "$tagversfile is incorrect or does not exist:" >&2
    echo "got '$tagvers' instead of '$vers'" >&2
    exit 1
  fi
fi

www="$root/misc/www/mpfr-$base"
echo "MPFR $vers www directory: $www" >&2
svn ls "$www" | sort > ls1
cat <<EOF > ls2
index.html
mpfr-$vers.tar.bz2
mpfr-$vers.tar.bz2.asc
mpfr-$vers.tar.gz
mpfr-$vers.tar.gz.asc
mpfr-$vers.tar.xz
mpfr-$vers.tar.xz.asc
mpfr-$vers.zip
mpfr-$vers.zip.asc
mpfr.dvi.gz
mpfr.html
mpfr.pdf
mpfr.ps.gz
EOF

missing=$(diff ls1 ls2 | sed -n 's/^> //p')
if [ -n "$missing" ]; then
  echo "Missing files in the www directory:" $missing >&2
  [ $vers != $base ]
fi

echo "Getting the files from the www directory..." >&2
for i in tar.bz2 tar.gz tar.xz zip
do
  svn cat "$www/mpfr-$vers.$i" > "mpfr-$vers.$i"
done
sha1sum mpfr-$vers.* > sha1sum.out
sha256sum mpfr-$vers.* > sha256sum.out
unzip -jq mpfr-$vers.zip '*/NEWS'

if [ -z "$nopgpsig" ]; then
  echo "Checking the signatures..." >&2
  for i in mpfr-$vers.*
  do
    svn cat "$www/$i.asc" > "$i.asc"
    gpg --verify "$i.asc" >&2
  done
fi

if [ -z "$nowebsrv" ]; then
  echo "Checking the mpfr.org web server..." >&2
  for i in $(cat ls1)
  do
    echo "  [$i]" >&2
    [ -f "$i" ] || svn cat "$www/$i" > "$i"
    wget -O file "https://www.mpfr.org/mpfr-$base/$i"
    cmp file "$i"
    rm file
  done
fi

rm mpfr*

if [ $vers = $base ] && [ -z "$nogforge" ]; then
  echo "Comparing with InriaForge..." >&2
  gforge="https://gforge.inria.fr"
  wget -O files.html "$gforge/frs/?group_id=136"
  for i in \
    $(sed -n "s/.*href=\"\([^\"]*mpfr-$vers\.[^\"]*[^c]\)\">mpfr-.*/\1/p" \
          files.html)
  do
    wget "$gforge$i"
  done
  for i in sha1sum sha256sum
  do
    $i mpfr-$vers.* > sums-gforge
    diff $i.out sums-gforge >&2
  done
  rm mpfr-* sums-gforge
fi

if [ $vers = $base ] && [ -z "$nognuftp" ]; then
  echo "Comparing with GNU FTP (ftp.gnu.org)..." >&2
  for i in tar.bz2 tar.gz tar.xz zip
  do
    wget https://ftp.gnu.org/gnu/mpfr/mpfr-$vers.$i
  done
  for i in sha1sum sha256sum
  do
    $i mpfr-$vers.* > sums-gnu
    diff $i.out sums-gnu >&2
  done
  rm mpfr-* sums-gnu
fi

# Do not use a pipe in order to check the exit status.
#svn cat "$root/tags/$vers/NEWS" > NEWS

sed -n "/^Changes .* to version ${base}:/,/^\$/p" NEWS > Changes
if [ "$(wc -l < Changes)" -lt 3 ]; then
  echo "The Changes file is too small:" >&2
  cat Changes >&2
  exit 1
fi

rname=$(sed -n "/^Changes .* to version ${base%.*}\.0:/,+1 {
    s/.*The \(\".*\"\) release.*/\1/p
  }" NEWS)

pl=${base##*.}
[ $pl -gt 0 ] && rname="$rname, patch level $pl"

if [ $vers = $base ]; then
  cat <<EOF
Subject: Announce: GNU MPFR $vers is released

GNU MPFR $vers ($rname), a C library for
multiple-precision floating-point computations with correct rounding,
is now available for download from the MPFR web site:

  https://www.mpfr.org/mpfr-$vers/

from InriaForge:

  https://gforge.inria.fr/projects/mpfr/

and from the GNU FTP site:

  https://ftp.gnu.org/gnu/mpfr/

Thanks very much to those who sent us bug reports and/or tested the
release candidate.
EOF
else
  rc=${vers#*-rc}
  [ $rc -gt 1 ] && n=" $rc"
  printf "%s\n\n" "Subject: GNU MPFR $base Release Candidate$n"
  if [ $(echo "$base ($rname)" | wc -m) -gt 30 ]; then
    cat <<EOF
The release of GNU MPFR $base ($rname)
is imminent.  Please help to make this release as good as possible
by downloading and testing this release candidate:
EOF
  else
    cat <<EOF
The release of GNU MPFR $base ($rname) is imminent.
Please help to make this release as good as possible by downloading
and testing this release candidate:
EOF
  fi
  cat <<EOF

https://www.mpfr.org/mpfr-$base/mpfr-$vers.tar.xz
https://www.mpfr.org/mpfr-$base/mpfr-$vers.tar.bz2
https://www.mpfr.org/mpfr-$base/mpfr-$vers.tar.gz
https://www.mpfr.org/mpfr-$base/mpfr-$vers.zip
EOF
fi

cat <<EOF

The SHA1 digests:
EOF
cat sha1sum.out
cat <<EOF

The SHA256 digests:
EOF
cat sha256sum.out
cat <<EOF

The signatures:
https://www.mpfr.org/mpfr-$base/mpfr-$vers.tar.xz.asc
https://www.mpfr.org/mpfr-$base/mpfr-$vers.tar.bz2.asc
https://www.mpfr.org/mpfr-$base/mpfr-$vers.tar.gz.asc
https://www.mpfr.org/mpfr-$base/mpfr-$vers.zip.asc

Each tarball is signed by Vincent Lefèvre. This can be verified using
the DSA key ID 980C197698C3739D; this key can be retrieved with:

  gpg --recv-keys 980C197698C3739D

or by downloading it from <https://www.vinc17.net/pgp.html>.
The key fingerprint is:

  07F3 DBBE CC1A 3960 5078  094D 980C 1976 98C3 739D

The signatures can be verified with: gpg --verify <file.asc>
You should check that the key fingerprint matches.

EOF

cat Changes

if [ $vers = $base ]; then
  cat <<EOF
You can send success and failure reports to <mpfr@inria.fr>, and give
us the canonical system name (by running the "./config.guess" script),
the processor and the compiler version, in order to complete the
"Platforms Known to Support MPFR" section of the MPFR $vers web page.

Regards,
EOF
else
  cat <<EOF
Please send success and failure reports with "./config.guess" output
to <mpfr@inria.fr>.

If no problems are found, GNU MPFR $base should be released
around $(date --iso-8601 --date='7 days').

Regards,
EOF
fi