这里有一些用perl 写的东西可以工作。如果您不喜欢 perl,它至少可以让您了解在自己的脚本中应该做什么。我试着把它写成可读的。
用这个调用svn status | perl scriptname.pl启动脚本。
脚本逐行读取 svn status 的输出。它检查这些行是否描述了添加、修改/替换或删除的元素,并将元素的路径添加到相应的列表中。然后它会尝试连接到 FTP 服务器并更改那里的元素。
FTP 部分完全未经测试。
当你添加一个包含子元素的文件夹时,我还没有测试过 SVN 会做什么。也许您必须自己将所有子元素添加到@filesAdded。
#!/usr/bin/perl
use Net::FTP;
use strict;
use warnings;
my $username = "username";
my $password = "password";
my $host = "example.com";
my $port = 20;
my $path = "/some/path/";
my @filesAdded;
my @filesModified;
my @filesDeleted;
while(<STDIN>) {
chomp;
if (/[A]...... (.+)/) {
push @filesAdded, $1;
} elsif(/[MR]...... (.+)/) {
push @filesModified, $1;
} elsif (/[D]...... (.+)/) {
push @filesDeleted, $1;
}
}
print "========================[ CHANGES ]========================\n";
print "filesAdded[".(scalar @filesModified)."]=".(join ", ", @filesModified)."\n";
print "filesModified[".(scalar @filesModified)."]=".(join ", ", @filesModified)."\n";
print "filesDeleted[".(scalar @filesDeleted)."]=".(join ", ", @filesDeleted)."\n";
print "==========================[ FTP ]==========================\n";
{
my $ftp = Net::FTP->new(Host => $host, Port => $port) or die "Cannot connect to $host: $@";
$ftp->login($username, $password) or die "Cannot login ", $ftp->message;
$ftp->cwd($path) or die "Cannot change working directory ", $ftp->message;
for my $fileAdded (@filesAdded) {
if(-f $fileAdded) {
$ftp->put($fileAdded);
} elsif(-d $fileAdded) {
$ftp->mkdir($fileAdded, 1);
}
}
for my $fileModified (@filesModified) {
$ftp->put($fileModified, $fileModified);
}
for my $fileDeleted (@filesDeleted) {
if(-f $fileDeleted) {
$ftp->delete($fileDeleted);
} elsif(-d $fileDeleted) {
$ftp->rmdir($fileDeleted, 1);
}
}
$ftp->quit;
}
print "========================[ SUCCESS ]========================\n";