1#!/usr/bin/perl
2use strict;
3
4# This script expects the directory ~/samba-rsync-ftp to exist and to be a
5# copy of the /home/ftp/pub/rsync dir on samba.org.  It also requires a
6# pristine CVS checkout of rsync (don't use your normal rsync build dir
7# unless you're 100% sure that there are not unchecked-in changes).
8#
9# If this is run with -ctu, it will make an updated "nightly" tar file in
10# the nightly dir.  It will also remove any old tar files, regenerate the
11# HTML man pages in the nightly dir, and then rsync the changes to the
12# samba.org server.
13
14use Getopt::Long;
15use Date::Format;
16
17# Choose any dir where a pristine rsync has been checked out of CVS.
18our $unpacked = $ENV{HOME} . '/release/nightly';
19# Where the local copy of /home/ftp/pub/rsync/nightly should be updated.
20our $nightly = $ENV{HOME} . '/samba-rsync-ftp/nightly';
21our $nightly_symlink = "$nightly/rsync-HEAD.tar.gz";
22
23our($cvs_update, $make_tar, $upload, $help_opt);
24&Getopt::Long::Configure('bundling');
25&usage if !&GetOptions(
26    'cvs-update|c' => \$cvs_update,
27    'make-tar|t' => \$make_tar,
28    'upload|u' => \$upload,
29    'help|h' => \$help_opt,
30) || $help_opt;
31
32our $name = time2str('rsync-HEAD-%Y%m%d-%H%M%Z', time, 'GMT');
33our $ztoday = time2str('%d %b %Y', time);
34our $today = $ztoday;
35
36chdir($unpacked) or die $!;
37
38if ($cvs_update) {
39    print "Updating from cvs...\n";
40    system 'cvs -q up' and die $!;
41}
42
43if ($make_tar) {
44    print "Generating list of active CVS files...\n";
45    my($dir, @files);
46    open(CVS, '-|', 'cvs status 2>&1') or die $!;
47    while (<CVS>) {
48	if (/^cvs status: Examining (.*)/) {
49	    if ($1 eq '.') {
50		$dir = '';
51	    } else {
52		push(@files, $1);
53		$dir = $1 . '/';
54	    }
55	} elsif (/^File: (.*?)\s+Status: (.*)/ && $1 ne '.cvsignore') {
56	    push(@files, $dir . $1);
57	    if ($2 ne 'Up-to-date') {
58		print "*** Not up-to-date: $dir$1\n";
59	    }
60	}
61    }
62    close CVS;
63
64    print "Creating $unpacked/$name.tar.gz\n";
65    chdir('..') or die $!;
66    rename($unpacked, $name) or die $!;
67    open(TAR, '|-', "fakeroot tar --files-from=- --no-recursion --mode=g-w -czf $nightly/$name.tar.gz $name") or die $!;
68    foreach (@files) {
69	print TAR "$name/$_\n";
70    }
71    close TAR;
72    rename($name, $unpacked) or die $!;
73    unlink($nightly_symlink);
74    symlink("$name.tar.gz", $nightly_symlink);
75}
76
77chdir($nightly) or die $!;
78
79foreach my $fn (qw( rsync.yo rsyncd.conf.yo )) {
80    my $html_fn = $fn;
81    $html_fn =~ s/\.yo/.html/;
82
83    open(IN, '<', "$unpacked/$fn") or die $!;
84    undef $/; $_ = <IN>; $/ = "\n";
85    close IN;
86
87    s/^(manpage\([^)]+\)\(\d+\)\()[^)]+(\).*)/$1$today$2/m;
88    #s/^(This man ?page is current for version) \S+ (of rsync)/$1 $version $2/m;
89
90    open(OUT, '>', $fn) or die $!;
91    print OUT $_;
92    close OUT;
93
94    system "yodl2html -o $html_fn $fn";
95
96    unlink($fn);
97}
98
99system "find . -name 'rsync-HEAD-*' -daystart -mtime +14 | xargs rm -f";
100system 'ls -ltr';
101
102if ($upload) {
103    my $opt = '';
104    if (defined $ENV{RSYNC_PARTIAL_DIR}) {
105	$opt = " -f 'R $ENV{RSYNC_PARTIAL_DIR}'";
106    }
107    system "rsync$opt -aviHP --delete-after . samba.org:/home/ftp/pub/rsync/nightly";
108}
109
110exit;
111
112sub usage
113{
114    die <<EOT;
115Usage: nightly-rsync [OPTIONS]
116
117 -c, --cvs-update  update $unpacked via CVS.
118 -t, --make-tar    create a new tar file in $nightly
119 -u, --upload      upload the revised nightly dir to samba.org
120 -h, --help        display this help
121EOT
122}
123