| 1 | #!/usr/bin/perl |
| 2 | use 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 | # git checkout of rsync (feel free to use your normal rsync build dir as |
| 7 | # long as it doesn't have any uncommitted 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 | |
| 14 | use Getopt::Long; |
| 15 | use Date::Format; |
| 16 | |
| 17 | # Where the local copy of /home/ftp/pub/rsync/dev/nightly should be updated. |
| 18 | our $dest = $ENV{HOME} . '/samba-rsync-ftp/dev/nightly'; |
| 19 | our $nightly_symlink = "$dest/rsync-HEAD.tar.gz"; |
| 20 | |
| 21 | our($make_tar, $upload, $help_opt); |
| 22 | &Getopt::Long::Configure('bundling'); |
| 23 | &usage if !&GetOptions( |
| 24 | 'make-tar|t' => \$make_tar, |
| 25 | 'upload|u' => \$upload, |
| 26 | 'help|h' => \$help_opt, |
| 27 | ) || $help_opt; |
| 28 | |
| 29 | our $name = time2str('rsync-HEAD-%Y%m%d-%H%M%Z', time, 'GMT'); |
| 30 | our $ztoday = time2str('%d %b %Y', time); |
| 31 | our $today = $ztoday; |
| 32 | our $gen_target = $upload ? 'gensend' : 'gen'; |
| 33 | |
| 34 | die "$dest does not exist\n" unless -d $dest; |
| 35 | die "There is no .git dir in the current directory.\n" unless -d '.git'; |
| 36 | die "There is no rsync checkout in the current directory.\n" unless -f 'rsyncd.conf.yo'; |
| 37 | |
| 38 | if ($make_tar) { |
| 39 | open(IN, '-|', 'git status') or die $!; |
| 40 | my $status = join('', <IN>); |
| 41 | close IN; |
| 42 | die "The checkout is not clean:\n", $status unless $status =~ /\nnothing to commit \(working directory clean\)/; |
| 43 | die "The checkout is not on the master branch.\n" unless $status =~ /^# On branch master\n/; |
| 44 | system "make $gen_target" and die "make $gen_target failed!\n"; |
| 45 | |
| 46 | my @extra_files; |
| 47 | open(IN, '<', 'Makefile.in') or die "Couldn't open Makefile.in: $!\n"; |
| 48 | while (<IN>) { |
| 49 | if (s/^GENFILES=//) { |
| 50 | while (s/\\$//) { |
| 51 | $_ .= <IN>; |
| 52 | } |
| 53 | @extra_files = split(' ', $_); |
| 54 | last; |
| 55 | } |
| 56 | } |
| 57 | close IN; |
| 58 | |
| 59 | my $confversion; |
| 60 | open(IN, '<', 'configure.ac') or die "Unable to open configure.ac: $!\n"; |
| 61 | while (<IN>) { |
| 62 | if (/^RSYNC_VERSION=(.*)/) { |
| 63 | $confversion = $1; |
| 64 | last; |
| 65 | } |
| 66 | } |
| 67 | close IN; |
| 68 | die "Unable to find RSYNC_VERSION in configure.ac\n" unless defined $confversion; |
| 69 | |
| 70 | open(IN, '<', 'OLDNEWS') or die "Unable to open OLDNEWS: $!\n"; |
| 71 | $_ = <IN>; |
| 72 | my($lastversion) = /(\d+\.\d+\.\d+)/; |
| 73 | my $last_protocol_version; |
| 74 | while (<IN>) { |
| 75 | 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+)$/) { |
| 76 | $last_protocol_version = $pver if $ver eq $lastversion; |
| 77 | } |
| 78 | } |
| 79 | close IN; |
| 80 | die "Unable to determine protocol_version for $lastversion.\n" unless defined $last_protocol_version; |
| 81 | |
| 82 | my($protocol_version,$subprotocol_version); |
| 83 | open(IN, '<', 'rsync.h') or die "Unable to open rsync.h: $!\n"; |
| 84 | while (<IN>) { |
| 85 | if (/^#define\s+PROTOCOL_VERSION\s+(\d+)/) { |
| 86 | $protocol_version = $1; |
| 87 | } elsif (/^#define\s+SUBPROTOCOL_VERSION\s+(\d+)/) { |
| 88 | $subprotocol_version = $1; |
| 89 | } |
| 90 | } |
| 91 | close IN; |
| 92 | die "Unable to determine the current PROTOCOL_VERSION.\n" unless defined $protocol_version; |
| 93 | die "Unable to determine the current SUBPROTOCOL_VERSION.\n" unless defined $subprotocol_version; |
| 94 | |
| 95 | if ($confversion =~ /dev|pre/) { |
| 96 | if ($last_protocol_version ne $protocol_version) { |
| 97 | if ($subprotocol_version == 0) { |
| 98 | die "SUBPROTOCOL_VERSION must not be 0 for a non-final release with a changed PROTOCOL_VERSION.\n"; |
| 99 | } |
| 100 | } else { |
| 101 | if ($subprotocol_version != 0) { |
| 102 | die "SUBPROTOCOL_VERSION must be 0 when the PROTOCOL_VERSION hasn't changed from the last release.\n"; |
| 103 | } |
| 104 | } |
| 105 | } else { |
| 106 | if ($subprotocol_version != 0) { |
| 107 | die "SUBPROTOCOL_VERSION must be 0 for a final release.\n"; |
| 108 | } |
| 109 | } |
| 110 | |
| 111 | print "Creating $name.tar.gz\n"; |
| 112 | system "rsync -a @extra_files $name/"; |
| 113 | system "git archive --format=tar --prefix=$name/ HEAD | tar xf -"; |
| 114 | system "support/git-set-file-times --prefix=$name/"; |
| 115 | system "fakeroot tar czf $dest/$name.tar.gz $name; rm -rf $name"; |
| 116 | |
| 117 | unlink($nightly_symlink); |
| 118 | symlink("$name.tar.gz", $nightly_symlink); |
| 119 | } |
| 120 | |
| 121 | foreach my $fn (qw( rsync.yo rsyncd.conf.yo )) { |
| 122 | my $yo_tmp = "$dest/$fn"; |
| 123 | (my $html_fn = "$dest/$fn") =~ s/\.yo/.html/; |
| 124 | |
| 125 | open(IN, '<', $fn) or die $!; |
| 126 | undef $/; $_ = <IN>; $/ = "\n"; |
| 127 | close IN; |
| 128 | |
| 129 | s/^(manpage\([^)]+\)\(\d+\)\()[^)]+(\).*)/$1$today$2/m; |
| 130 | #s/^(This man ?page is current for version) \S+ (of rsync)/$1 $version $2/m; |
| 131 | |
| 132 | open(OUT, '>', $yo_tmp) or die $!; |
| 133 | print OUT $_; |
| 134 | close OUT; |
| 135 | |
| 136 | system 'yodl2html', '-o', $html_fn, $yo_tmp; |
| 137 | |
| 138 | unlink($yo_tmp); |
| 139 | } |
| 140 | |
| 141 | chdir($dest) or die $!; |
| 142 | |
| 143 | my $cnt = 0; |
| 144 | open(PIPE, '-|', 'ls -1t rsync-HEAD-*') or die $!; |
| 145 | while (<PIPE>) { |
| 146 | chomp; |
| 147 | next if $cnt++ < 10; |
| 148 | unlink($_); |
| 149 | } |
| 150 | close PIPE; |
| 151 | |
| 152 | system 'ls -ltr'; |
| 153 | |
| 154 | if ($upload) { |
| 155 | my $opt = ''; |
| 156 | if (defined $ENV{RSYNC_PARTIAL_DIR}) { |
| 157 | $opt = " -f 'R $ENV{RSYNC_PARTIAL_DIR}'"; |
| 158 | } |
| 159 | system "rsync$opt -aviHP --delete-after . samba.org:/home/ftp/pub/rsync/dev/nightly"; |
| 160 | } |
| 161 | |
| 162 | exit; |
| 163 | |
| 164 | sub usage |
| 165 | { |
| 166 | die <<EOT; |
| 167 | Usage: nightly-rsync [OPTIONS] |
| 168 | |
| 169 | -t, --make-tar create a new tar file in $dest |
| 170 | -u, --upload upload the revised nightly dir to samba.org |
| 171 | -h, --help display this help |
| 172 | EOT |
| 173 | } |