summaryrefslogtreecommitdiff
path: root/packaging/nightly-rsync
blob: 23451ca7506aee36e663d4367dc8ded884d370fe (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
#!/usr/bin/perl
use strict;

# This script expects the directory ~/samba-rsync-ftp to exist and to be a
# copy of the /home/ftp/pub/rsync dir on samba.org.  It also requires a
# git checkout of rsync (feel free to use your normal rsync build dir as
# long as it doesn't have any uncommitted changes).
#
# If this is run with -ctu, it will make an updated "nightly" tar file in
# the nightly dir.  It will also remove any old tar files, regenerate the
# HTML man pages in the nightly dir, and then rsync the changes to the
# samba.org server.

use Getopt::Long;
use Date::Format;

# Where the local copy of /home/ftp/pub/rsync/dev/nightly should be updated.
our $dest = $ENV{HOME} . '/samba-rsync-ftp/dev/nightly';
our $samba_host = $ENV{SAMBA_HOST} || 'samba.org';
our $nightly_symlink = "$dest/rsync-HEAD.tar.gz";

our($make_tar, $upload, $help_opt);
&Getopt::Long::Configure('bundling');
&usage if !&GetOptions(
    'make-tar|t' => \$make_tar,
    'upload|u' => \$upload,
    'help|h' => \$help_opt,
) || $help_opt;

our $name = time2str('rsync-HEAD-%Y%m%d-%H%M%Z', time, 'GMT');
our $ztoday = time2str('%d %b %Y', time);
our $today = $ztoday;
our $gen_target = $upload ? 'gensend' : 'gen';

die "$dest does not exist\n" unless -d $dest;
die "There is no .git dir in the current directory.\n" unless -d '.git';
die "There is no rsync checkout in the current directory.\n" unless -f 'rsyncd.conf.yo';

if ($make_tar) {
    open(IN, '-|', 'git status') or die $!;
    my $status = join('', <IN>);
    close IN;
    die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit.+working directory clean/;
    die "The checkout is not on the master branch.\n" unless $status =~ /^(?:# )?On branch master\n/;
    system "make $gen_target" and die "make $gen_target failed!\n";

    my @extra_files;
    open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n";
    while (<IN>) {
	if (s/^GENFILES=//) {
	    while (s/\\$//) {
		$_ .= <IN>;
	    }
	    @extra_files = split(' ', $_);
	    last;
	}
    }
    close IN;

    my $confversion;
    open(IN, '<', 'configure.ac') or die "Unable to open configure.ac: $!\n";
    while (<IN>) {
	if (/^AC_INIT\(\[rsync\],\s*\[(\d.+?)\]/) {
	    $confversion = $1;
	    last;
	}
    }
    close IN;
    die "Unable to find AC_INIT with version in configure.ac\n" unless defined $confversion;

    open(IN, '<', 'OLDNEWS') or die "Unable to open OLDNEWS: $!\n";
    $_ = <IN>;
    my($lastversion) = /(\d+\.\d+\.\d+)/;
    my $last_protocol_version;
    while (<IN>) {
	if (my($ver,$pdate,$pver) = /^\s+\S\S\s\S\S\S\s\d\d\d\d\s+(\d+\.\d+\.\d+)\s+(\d\d \w\w\w \d\d\d\d\s+)?(\d+)$/) {
	    $last_protocol_version = $pver if $ver eq $lastversion;
	}
    }
    close IN;
    die "Unable to determine protocol_version for $lastversion.\n" unless defined $last_protocol_version;

    my($protocol_version,$subprotocol_version);
    open(IN, '<', 'rsync.h') or die "Unable to open rsync.h: $!\n";
    while (<IN>) {
	if (/^#define\s+PROTOCOL_VERSION\s+(\d+)/) {
	    $protocol_version = $1;
	} elsif (/^#define\s+SUBPROTOCOL_VERSION\s+(\d+)/) {
	    $subprotocol_version = $1;
	}
    }
    close IN;
    die "Unable to determine the current PROTOCOL_VERSION.\n" unless defined $protocol_version;
    die "Unable to determine the current SUBPROTOCOL_VERSION.\n" unless defined $subprotocol_version;

    if ($confversion =~ /dev|pre/) {
	if ($last_protocol_version ne $protocol_version) {
	    if ($subprotocol_version == 0) {
		die "SUBPROTOCOL_VERSION must not be 0 for a non-final release with a changed PROTOCOL_VERSION.\n";
	    }
	} else {
	    if ($subprotocol_version != 0) {
		die "SUBPROTOCOL_VERSION must be 0 when the PROTOCOL_VERSION hasn't changed from the last release.\n";
	    }
	}
    } else {
	if ($subprotocol_version != 0) {
	    die "SUBPROTOCOL_VERSION must be 0 for a final release.\n";
	}
    }

    print "Creating $name.tar.gz\n";
    system "rsync -a @extra_files $name/";
    system "git archive --format=tar --prefix=$name/ HEAD | tar xf -";
    system "support/git-set-file-times --prefix=$name/";
    system "fakeroot tar czf $dest/$name.tar.gz $name; rm -rf $name";

    unlink($nightly_symlink);
    symlink("$name.tar.gz", $nightly_symlink);
}

foreach my $fn (qw( rsync.yo rsyncd.conf.yo )) {
    my $yo_tmp = "$dest/$fn";
    (my $html_fn = "$dest/$fn") =~ s/\.yo/.html/;

    open(IN, '<', $fn) or die $!;
    undef $/; $_ = <IN>; $/ = "\n";
    close IN;

    s/^(manpage\([^)]+\)\(\d+\)\()[^)]+(\).*)/$1$today$2/m;
    #s/^(This man ?page is current for version) \S+ (of rsync)/$1 $version $2/m;

    open(OUT, '>', $yo_tmp) or die $!;
    print OUT $_;
    close OUT;

    system 'yodl2html', '-o', $html_fn, $yo_tmp;

    unlink($yo_tmp);
}

chdir($dest) or die $!;

my $cnt = 0;
open(PIPE, '-|', 'ls -1t rsync-HEAD-*') or die $!;
while (<PIPE>) {
    chomp;
    next if $cnt++ < 10;
    unlink($_);
}
close PIPE;

system 'ls -ltr';

if ($upload) {
    my $opt = '';
    if (defined $ENV{RSYNC_PARTIAL_DIR}) {
	$opt = " -f 'R $ENV{RSYNC_PARTIAL_DIR}'";
    }
    system "rsync$opt -aviHP --delete-after . $samba_host\:/home/ftp/pub/rsync/dev/nightly";
}

exit;

sub usage
{
    die <<EOT;
Usage: nightly-rsync [OPTIONS]

 -t, --make-tar    create a new tar file in $dest
 -u, --upload      upload the revised nightly dir to samba.org
 -h, --help        display this help
EOT
}