[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: anoncvs repository
> これはこちらでも成功しました.
> やはり全部持ってこれないだけの話かも知れません.
サーバ側の負荷に関しては分からないのですが、利用者側としてはやはり転送
が途中で失敗するのはうれしくありません。そこで、Rsync のモジュール (と
いうか、 リポジトリのディレクトリ) を適当に分けて rsync を実行する
Perl スクリプトを書いてみました。
./listrep | ./getrep
あるいは
./listrep sharesrc | ./getrep
でいけると思います。
(直前のいわもとさんのご意見を反映させました。)
上林
---
Masao Uebayashi <uebayasi@soum.co.jp>
#! /usr/pkg/bin/perl -w
use strict;
use Net::FTP;
use constant USER => 'anonymous';
use constant PASSWD => 'uebayasi@soum.co.jp';
use constant HOST => 'ftp.jp.netbsd.org';
use constant DISTDIR => '/pub/NetBSD-cvs/main';
use vars qw($ftp);
my $modules = {
# module => depth
'CVSROOT' => 0,
'basesrc' => 2,
'cryptosrc-intl' => 2,
'doc' => 1,
'gnusrc' => 3,
'htdocs' => 1,
'pkgsrc' => 1,
'sharesrc' => 2,
'syssrc' => 2,
'xsrc' => 3,
};
# subroutine
sub gettree {
my ($dir, $depthmax, $depth) = @_;
print STDERR 'DEBUG: dir: ', $dir, "\n";
if ($depthmax <= $depth) {
print $dir, "\n";
} else {
my @dirs = $ftp->dir($dir);
shift(@dirs); # discard the 1st line of 'dir' command
foreach my $d (@dirs) {
if ($d !~ m|^d|) {
# file
print $dir, '/', ( $d =~ m|\s+(\S+)$| )[0], "\n";
} else {
# directory
my $dd = ( $d =~ m|\s+(\S+)$| )[0];
&gettree($dir . '/' . $dd, $depthmax, $depth + 1);
}
}
}
}
# main
my @list = ();
foreach my $m (@ARGV) {
if (@ARGV) {
# arguments given
if (exists($modules->{$m})) {
push @list, $m;
} else {
die "invalid module: $m";
}
}
}
$ftp = Net::FTP->new(HOST, Debug => 0);
$ftp->login(USER, PASSWD);
@list = keys(%{ $modules }) unless (@list);
print STDERR 'DEBUG: modules: ', join(' ', @list), "\n";
foreach my $m (@list) {
&gettree(DISTDIR . '/' . $m, $modules->{$m}, 0);
}
$ftp->quit();
exit(0);
#! /usr/pkg/bin/perl -w
use strict;
my $rsync = 'runsocks rsync -a -v -r -z --delete';
my $root = 'rsync://rsync.jp.netbsd.org/anoncvs';
my $base = '/usr/cvsroot';
LINE: while (my $line = <>) {
chomp($line);
#print STDERR 'DEBUG: ', $line, "\n";
my ($module) = ($line =~ m|(/main/.+?)$|);
my ($dir) = ($module =~ m|^/main(.+?)$|);
#print STDERR 'DEBUG: module: ', $module, "\n";
my $cmd = "$rsync $root$module " . "$base$dir";
print STDERR 'DEBUG: ', $cmd, "\n";
`$cmd`;
}