Commit | Line | Data |
---|---|---|
6d12a859 WD |
1 | #!/usr/bin/perl |
2 | use strict; | |
3 | ||
4 | # This script expects the directory ~/samba-rsync-ftp to exist and to | |
5 | # be a copy of the /home/ftp/pub/rsync dir on samba.org. If it is run | |
6 | # in test mode, it instead expects a dir named ~/tmp/samba-rsync-ftp | |
7 | # (e.g. copy ~/samba-rsync-ftp into ~/tmp and you can do a trial-run of | |
8 | # a release without affecting the files in the ~/samba-rsync-ftp dir). | |
9 | # | |
10 | # Run this as "release-rsync live" to affect ~/samba-rsync-ftp instead | |
11 | # of ~/tmp/samba-rsync-ftp. | |
12 | ||
13 | use Date::Format; | |
14 | ||
15 | my $dest = $ENV{HOME} . '/samba-rsync-ftp'; | |
16 | my $releasedir = $ENV{HOME} . '/release'; | |
17 | my $cvsroot = $ENV{CVSROOT} = 'samba.org:/data/cvs'; | |
18 | ||
19 | my $ztoday = time2str('%d %b %Y', time); | |
20 | my $today = $ztoday; | |
21 | $today =~ s/^0//; | |
22 | ||
5fa38cd6 WD |
23 | my $break = <<EOT; |
24 | ========================================================================== | |
6d12a859 WD |
25 | EOT |
26 | my $note = <<EOT; | |
5fa38cd6 | 27 | == Note: type "-a u,n" if you want to auto-accept the U,N suggestions. == |
6d12a859 WD |
28 | EOT |
29 | ||
30 | my $live = shift; | |
4d8639eb | 31 | my $skipping = ''; |
6d12a859 | 32 | |
5fa38cd6 | 33 | print $break; |
6d12a859 | 34 | if ($live) { |
5fa38cd6 WD |
35 | print <<EOT; |
36 | == This will release a new version of rsync onto an unsuspecting world. == | |
37 | EOT | |
6d12a859 | 38 | } else { |
5fa38cd6 WD |
39 | print <<EOT; |
40 | == **** TESTMODE **** (Add "live" arg to avoid this.) == | |
41 | EOT | |
6d12a859 | 42 | $dest =~ s#([^/]+$)#tmp/$1#; |
4d8639eb | 43 | $skipping = ' ** SKIPPING **'; |
6d12a859 WD |
44 | } |
45 | die "$dest does not exist\n" unless -d $dest; | |
46 | ||
5fa38cd6 | 47 | print $break, "\nChecking out the latest rsync into $releasedir ...\n"; |
519c8de1 WD |
48 | |
49 | mkdir($releasedir, 0755) or die $! unless -d $releasedir; | |
50 | chdir($releasedir) or die $!; | |
51 | ||
5fa38cd6 WD |
52 | system 'rm -rf rsync'; |
53 | ||
54 | my(%dirs, @files); | |
55 | open(CVS, '-|', 'cvs checkout -P rsync') or die $!; | |
56 | while (<CVS>) { | |
57 | print $_; | |
58 | next if /\.(cvs)?ignore$/; | |
59 | if (m#^[UP] rsync/(.*)#) { | |
60 | my $fn = $1; | |
61 | my($dir) = $fn =~ m#^(.+)/#; | |
62 | push(@files, $dir) if defined($dir) && !$dirs{$1}++; | |
63 | push(@files, $fn); | |
64 | } | |
65 | } | |
519c8de1 WD |
66 | |
67 | chdir('rsync') or die $!; | |
68 | ||
69 | my($version, $lastversion); | |
70 | open(IN, 'configure.in') or die $!; | |
71 | while (<IN>) { | |
72 | if (/^RSYNC_VERSION=(.*)/) { | |
73 | $version = $lastversion = $1; | |
74 | last; | |
75 | } | |
76 | } | |
77 | close IN; | |
78 | ||
79 | $lastversion =~ s/(\d+)cvs$/ $1 - 1 /e; | |
80 | $version =~ s/cvs/pre1/ || $version =~ s/pre(\d+)/ 'pre' . ($1 + 1) /e; | |
81 | ||
5fa38cd6 | 82 | print $break, "\nPlease enter the version number of this release: [$version] "; |
519c8de1 WD |
83 | chomp($_ = <STDIN>); |
84 | if ($_ eq '.') { | |
85 | $version =~ s/pre\d+//; | |
86 | } elsif ($_ ne '') { | |
87 | $version = $_; | |
88 | } | |
6d12a859 WD |
89 | $version =~ s/[-.]*pre[-.]*/pre/; |
90 | ||
519c8de1 WD |
91 | $lastversion =~ s/(\d+)pre\d+$/ $1 - 1 /e unless $version =~ /pre/; |
92 | ||
6d12a859 WD |
93 | my $cvstag = "release-$version"; |
94 | $cvstag =~ s/[.]/-/g; | |
95 | $cvstag =~ s/pre/-pre/; | |
96 | ||
519c8de1 WD |
97 | print "Enter the previous version to produce a patch against: [$lastversion] "; |
98 | chomp($_ = <STDIN>); | |
99 | $lastversion = $_ if $_ ne ''; | |
6d12a859 WD |
100 | $lastversion =~ s/[-.]*pre[-.]*/pre/; |
101 | ||
519c8de1 WD |
102 | my $release = 1; |
103 | print "Please enter the RPM release number of this release: [$release] "; | |
104 | chomp($_ = <STDIN>); | |
105 | $release = $_ if $_ ne ''; | |
6d12a859 WD |
106 | |
107 | my $diffdir; | |
5fa38cd6 | 108 | my $skipping2; |
6d12a859 WD |
109 | if ($lastversion =~ /pre/) { |
110 | if ($version !~ /pre/) { | |
111 | die "You should not diff a release version against a pre-release version.\n"; | |
112 | } | |
113 | $diffdir = "$dest/old-previews"; | |
5fa38cd6 | 114 | $skipping2 = ' ** SKIPPING **'; |
6d12a859 WD |
115 | } elsif ($version =~ /pre/) { |
116 | $diffdir = $dest; | |
5fa38cd6 | 117 | $skipping2 = ' ** SKIPPING **'; |
6d12a859 WD |
118 | } else { |
119 | $diffdir = "$dest/old-versions"; | |
5fa38cd6 | 120 | $skipping2 = ''; |
6d12a859 WD |
121 | } |
122 | ||
5fa38cd6 | 123 | print "\n", $break, <<EOT; |
6d12a859 WD |
124 | \$version is "$version" |
125 | \$lastversion is "$lastversion" | |
126 | \$cvstag is "$cvstag" | |
127 | \$dest is "$dest" | |
128 | \$releasedir is "$releasedir" | |
129 | \$diffdir is "$diffdir" | |
130 | \$release is "$release" | |
131 | ||
132 | About to: | |
5fa38cd6 | 133 | - make sure that configure, config.h.in, and proto.h are updated |
6d12a859 | 134 | - tweak the version in configure.in, configure, and the spec files |
5fa38cd6 | 135 | - tweak NEWS and OLDNEWS to update the release date$skipping2 |
6d12a859 WD |
136 | - tweak the date in the *.yo files and re-generate the man pages |
137 | - make sure that the patches dir has been updated | |
138 | - page through the "cvs diff" output | |
139 | ||
140 | EOT | |
141 | print "<Press Enter to continue> "; | |
142 | $_ = <STDIN>; | |
c2b2bd6a | 143 | my $f_opt = /f/ ? ' -f' : ''; |
6d12a859 | 144 | |
5fa38cd6 | 145 | print $break; |
6d12a859 WD |
146 | system "./prepare-source && touch proto.h"; |
147 | ||
148 | my @tweak_files = ( glob('packaging/*.spec'), glob('packaging/*/*.spec'), | |
149 | glob('*.yo'), qw( configure.in configure ) ); | |
150 | if ($version !~ /pre/) { | |
151 | push(@tweak_files, qw( NEWS OLDNEWS )); | |
152 | } | |
153 | foreach my $fn (@tweak_files) { | |
154 | open(IN, '<', $fn) or die $!; | |
155 | undef $/; $_ = <IN>; $/ = "\n"; | |
156 | close IN; | |
157 | if ($fn =~ /configure/) { | |
158 | s/^RSYNC_VERSION.*/RSYNC_VERSION=$version/m; | |
159 | } elsif ($fn =~ /\.spec/) { | |
160 | s/^(Version:) .*/$1 $version/m; | |
161 | s/^(Release:) .*/$1 $release/m; | |
162 | } elsif ($fn =~ /\.yo/) { | |
163 | s/^(manpage\([^)]+\)\(\d+\)\()[^)]+(\).*)/$1$today$2/m; | |
164 | s/^(This man ?page is current for version) \S+ (of rsync)/$1 $version $2/m; | |
165 | } else { | |
1b1628b9 | 166 | s/^(NEWS for rsync \Q$version\E) \(UNRELEASED\)\s*\n/$1 ($today)\n/m; |
6d12a859 WD |
167 | s/^\t\S\S\s\S\S\S\s\d\d\d\d(\t\Q$version\E)/\t$ztoday$1/m; |
168 | } | |
169 | open(OUT, '>', $fn) or die $!; | |
170 | print OUT $_; | |
171 | close OUT; | |
172 | } | |
173 | ||
174 | system "yodl2man -o rsync.1 rsync.yo"; | |
175 | system "yodl2man -o rsyncd.conf.5 rsyncd.conf.yo"; | |
176 | #system "perl -pi -e \"s/\\\\\\'/\\\\&'/g\" rsync.1 rsyncd.conf.5"; | |
177 | ||
178 | mkdir('patches/tmp') or die $!; | |
179 | system "rsync -a --exclude=patches/ --exclude-from=.cvsignore . patches/tmp/cvsdir/"; | |
180 | ||
5fa38cd6 | 181 | print "\n", $break, $note, $break; |
c2b2bd6a | 182 | system "patches/verify-patches -n -an$f_opt"; |
6d12a859 | 183 | |
5fa38cd6 | 184 | print $break; |
6d12a859 WD |
185 | system "cvs -q diff | egrep -v '^(===============|RCS file: |retrieving revision |Index: )' | less -p '^diff .*'"; |
186 | ||
5fa38cd6 | 187 | print $break, <<EOT; |
6d12a859 WD |
188 | |
189 | About to: | |
4d8639eb WD |
190 | - "cvs commit" all changes$skipping |
191 | - "cvs tag" this release as $cvstag$skipping | |
5fa38cd6 | 192 | - change the diffs in the patches dir to include generated files |
6d12a859 WD |
193 | |
194 | EOT | |
5fa38cd6 WD |
195 | print "<Press Enter to continue> "; |
196 | $_ = <STDIN>; | |
6d12a859 | 197 | |
5fa38cd6 | 198 | if ($live) { |
6d12a859 WD |
199 | system "cvs commit -m 'Preparing for release of $version'"; |
200 | system "cvs tag -F $cvstag ."; | |
6d12a859 WD |
201 | } |
202 | ||
5fa38cd6 WD |
203 | if (!/skip/i) { |
204 | print "\n", $break, $note, $break; | |
205 | system "patches/verify-patches -pun -an"; | |
206 | } | |
207 | ||
e60bba3f WD |
208 | my $tar_name = "rsync-$version.tar.gz"; |
209 | my $diff_name = "rsync-$lastversion-$version.diffs.gz"; | |
210 | my $tar_file = "$dest/$tar_name"; | |
211 | my $diff_file = "$dest/$diff_name"; | |
5fa38cd6 WD |
212 | |
213 | print $break, <<EOT; | |
6d12a859 WD |
214 | |
215 | About to do the following in the samba-rsync-ftp dir: | |
4d8639eb | 216 | - move the old tar/diff files into the appropriate old-* dirs |
e60bba3f WD |
217 | - copy the moved tar/diff files on samba.org$skipping |
218 | - create release tar, "$tar_name" | |
219 | - create release diffs, "$diff_name" | |
6d12a859 WD |
220 | - update README, *NEWS, TODO, and cvs.log |
221 | - update rsync*.html man pages | |
e60bba3f | 222 | - gpg-sign the release files$skipping |
6d12a859 WD |
223 | |
224 | EOT | |
225 | print "<Press Enter to continue> "; | |
226 | $_ = <STDIN>; | |
227 | ||
6d12a859 WD |
228 | chdir($releasedir) or die $!; |
229 | ||
5fa38cd6 WD |
230 | print $break; |
231 | system "rm -rf rsync-$version"; | |
232 | rename('rsync', "rsync-$version") or die $!; | |
6d12a859 WD |
233 | |
234 | # When creating a pre-release after a normal release, there's nothing to move. | |
235 | if ($diffdir ne $dest) { | |
236 | chdir($dest) or die $!; | |
237 | ||
5fa38cd6 WD |
238 | print "Shuffling old files ...\n"; |
239 | ||
519c8de1 WD |
240 | # We need to run this regardless of $lastversion's "pre"ness. |
241 | my @moved_files; | |
6d12a859 | 242 | foreach my $fn (glob('rsync*pre*.tar.gz*'), glob('rsync*pre*-NEWS')) { |
c2b2bd6a WD |
243 | my $new_fn = "old-previews/$fn"; |
244 | rename($fn, $new_fn) or die $!; | |
245 | push(@moved_files, $new_fn); | |
6d12a859 | 246 | } |
6d12a859 WD |
247 | |
248 | if ($version !~ /pre/) { | |
249 | foreach my $fn (glob('rsync*.tar.gz*'), glob('rsync*-NEWS')) { | |
4d8639eb | 250 | next if $fn =~ /^rsync.*pre/; |
c2b2bd6a WD |
251 | my $new_fn = "old-versions/$fn"; |
252 | rename($fn, $new_fn) or die $!; | |
253 | push(@moved_files, $new_fn); | |
6d12a859 WD |
254 | } |
255 | ||
256 | foreach my $fn (glob('rsync*.diffs.gz*')) { | |
4d8639eb | 257 | next if $fn =~ /^rsync.*pre/; |
c2b2bd6a WD |
258 | my $new_fn = "old-patches/$fn"; |
259 | rename($fn, $new_fn) or die $!; | |
260 | push(@moved_files, $new_fn); | |
6d12a859 WD |
261 | } |
262 | } | |
263 | ||
519c8de1 | 264 | # Optimize our future upload (in the absence of --detect-renamed) by |
1b1628b9 | 265 | # copying the above moved files on the remote server. |
519c8de1 | 266 | if ($live) { |
c2b2bd6a WD |
267 | my $remote_cmd = ''; |
268 | foreach (@moved_files) { | |
269 | my($path, $fn) = m#(.*)/([^/]+)$#; | |
1b1628b9 | 270 | $remote_cmd .= "cp -p /home/ftp/pub/rsync/{$fn,$path};"; |
c2b2bd6a WD |
271 | } |
272 | system "ssh samba.org '$remote_cmd'"; | |
519c8de1 | 273 | } |
c2b2bd6a | 274 | foreach (glob("rsync*pre*.diffs.gz*")) { |
519c8de1 WD |
275 | unlink($_); |
276 | } | |
277 | ||
6d12a859 WD |
278 | chdir($releasedir) or die $!; |
279 | } | |
6d12a859 | 280 | |
5fa38cd6 WD |
281 | print "Creating $tar_file ...\n"; |
282 | system "fakeroot tar czf $tar_file rsync-$version"; | |
651dc65e | 283 | open(TAR, '|-', "fakeroot tar --files-from=- --no-recursion --mode=g+w -czf $tar_file rsync-$version") or die $!; |
5fa38cd6 WD |
284 | foreach (@files) { |
285 | print TAR "rsync-$version/$_\n"; | |
286 | } | |
287 | close TAR; | |
288 | ||
289 | print "Creating $diff_file ...\n"; | |
290 | system "rm -rf rsync-$version rsync-$lastversion"; | |
291 | system "tar xzf $tar_file; tar xzf $diffdir/rsync-$lastversion.tar.gz"; | |
6d12a859 WD |
292 | ## TWEAK THE VERSIONS AS DESIRED HERE ## |
293 | #mkdir("rsync-$lastversion/support", 0755) or die $!; | |
294 | #rename("rsync-$lastversion/rsyncstats", "rsync-$lastversion/support/rsyncstats"); | |
5fa38cd6 | 295 | unlink("rsync-$lastversion/.ignore"); |
6d12a859 | 296 | ## END ## |
5fa38cd6 | 297 | system "diff -urN --exclude=patches rsync-$lastversion rsync-$version| gzip -9 >$diff_file"; |
6d12a859 | 298 | |
5fa38cd6 WD |
299 | print "Updating the other files in $dest ...\n"; |
300 | system "rsync -a rsync-$version/{README,NEWS,OLDNEWS,TODO} $dest"; | |
6d12a859 WD |
301 | unlink("$dest/rsync-$version-NEWS"); |
302 | link("$dest/NEWS", "$dest/rsync-$version-NEWS"); | |
303 | system "rsync -a $cvsroot/CVSROOT/rsync.updates $dest/cvs.log"; | |
304 | ||
5fa38cd6 WD |
305 | system "yodl2html -o $dest/rsync.html rsync-$version/rsync.yo"; |
306 | system "yodl2html -o $dest/rsyncd.conf.html rsync-$version/rsyncd.conf.yo"; | |
6d12a859 | 307 | |
5fa38cd6 | 308 | system "rm -rf rsync-*"; |
6d12a859 WD |
309 | |
310 | if ($live) { | |
311 | chdir($dest) or die $!; | |
e60bba3f | 312 | system "gpg -ba $tar_name; gpg -ba $diff_name"; |
6d12a859 WD |
313 | } |
314 | ||
5fa38cd6 | 315 | print $break, <<EOT; |
6d12a859 WD |
316 | |
317 | All done. Remember to announce the release on *BOTH* | |
318 | rsync-announce\@lists.samba.org and rsync\@lists.samba.org! | |
319 | EOT |