通过ftp将svn状态输出到远程服务器?

时间:2014-03-29 23:21:57

标签: svn ftp

这是问题的定义; 我的工作副本中有一些本地更改。我可以通过 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客户端中逐个查找和上传这些文件来做到这一点。但有时它非常耗时,特别是当更改文件更多时。

所以我希望这个动作由脚本或工具自动完成。有什么建议吗?或者我应该为这个问题写一个小应用程序?

1 个答案:

答案 0 :(得分:0)

这是中写的可行的内容。如果你不喜欢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";