11 use File
::Basename
qw(dirname);
12 use File
::Path
qw(mkpath);
14 use Getopt
::Long
qw(GetOptions);
15 use List
::Util
qw(min);
16 use Time
::HiRes
qw(sleep);
18 use lib
"/home/k/sources/rersyncrecent/lib/";
19 require File
::Rsync
::Mirror
::Recentfile
;
30 my $print_leading_newline = 0;
33 last if $Opt{loops
} && $loop++ >= $Opt{loops
};
34 my $iteration_start = time;
36 for my $rmodule (qw(authors modules)) {
37 my $rf = File
::Rsync
::Mirror
::Recentfile
->new
39 canonize
=> "naive_path_normalize",
40 filenameroot
=> "RECENT",
41 ignore_link_stat_errors
=> 1,
43 localroot
=> "/home/ftp/pub/PAUSE/$rmodule",
44 remote_dir
=> $rmodule,
46 remote_module
=> "PAUSE",
48 # intenionally not using archive=>1 because it contains "r"
50 'rsync-path' => '/usr/bin/rsync',
53 'omit-dir-times' => 1,
56 verbose
=> $Opt{verbose
},
59 my $trecentfile = eval {$rf->get_remote_recentfile_as_tempfile();};
61 warn sprintf "Warning: %s", $@
; # XXX need a logging mechanism
65 my($recent_data) = $rf->recent_events_from_tempfile();
68 my $total = @
$recent_data;
69 UPLOADITEM
: for my $recent_event (reverse @
$recent_data) {
71 if ($recent_event->{type
} eq "new"){
73 $max_epoch_ever{$rmodule} ||= 0;
74 if ($Opt{use_interval
} && $recent_event->{epoch
}+$Opt{use_interval
} < time) {
76 } elsif ($recent_event->{epoch
} <= $max_epoch_ever{$rmodule}) {
82 my $dst = $rf->local_path($recent_event->{path
});
83 my $doing = -e
$dst ?
"Syncing" : "Getting";
87 $print_leading_newline ?
"\n" : "",
91 $recent_event->{path
},
93 $print_leading_newline = 0;
95 eval { $rf->mirror_path($recent_event->{path
}) };
102 } elsif ($recent_event->{type
} eq "delete") {
105 warn "Warning: invalid upload type '$recent_event->{type}'"; # XXX logging
107 $max_epoch_ever{$rmodule} = $recent_event->{epoch
} if $recent_event->{epoch
} > $max_epoch_ever{$rmodule};
110 # XXX this seems a bit too drastic
112 my @disperrors = splice @error, 0, min
(10, scalar @error);
113 my $disperrors = @disperrors;
114 warn "Warning: Ran into $errors errors, $disperrors follow:
118 $max_epoch_ever{$rmodule} = 0;
120 rename $trecentfile, $rf->rfile;
123 my $minimum_time_per_loop = 60;
124 { local $| = 1; print "."; $print_leading_newline = 1; }
125 if (time - $iteration_start < $minimum_time_per_loop) {
126 sleep $iteration_start + $minimum_time_per_loop - time;
128 { local $| = 1; print "~"; $print_leading_newline = 1; }
137 # cperl-indent-level: 2