这是问题的定义; 我的工作副本中有一些本地更改。我可以通过 svn st 命令列出它们。示例输出;
M admin/controller/common/forgotten.php
M admin/controller/sale/contact.php
A + admin/model/tool/mail.php
D catalog/view/theme/default/template/mail/order.tpl
D catalog/view/theme/default/template/mail/recommend.tpl
A + mail_template
我有一个远程服务器,我想通过ftp将这些更改推送到远程服务器进行测试。如果没关系那么我会将它们提交到主干。
现在我通过在ftp客户端中逐个查找和上传这些文件来做到这一点。但有时它非常耗时,特别是当更改文件更多时。
所以我希望这个动作由脚本或工具自动完成。有什么建议吗?或者我应该为这个问题写一个小应用程序?
答案 0 :(得分:0)
这是perl中写的可行的内容。如果你不喜欢perl它至少可以让你知道在你自己的脚本中做什么。我试着把它写成可读。
使用此调用svn status | perl scriptname.pl
启动脚本。
该脚本逐行读取svn状态的输出。它检查行是否描述了添加,修改/替换或删除的元素,并将元素的路径添加到相应的列表中。然后它尝试连接到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";