[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`;
}