aboutsummaryrefslogtreecommitdiffstats
path: root/MgaRelease/Common.pm
blob: 41dba72f7cec7908c33499e8812cbb0059db306b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package MgaRelease::Common;

use FindBin;
use YAML qw/LoadFile DumpFile/;
use URPM;
use SVN::Core;
use SVN::Ra;

my $c;
my $srpms_list;

sub config {
    $c ? $c : $c = LoadFile($FindBin::Bin. '/config');
}

sub config_path {
    my $file = config()->{$_[0]};
    $file =~ m|^/| ? $file : config()->{datadir} . '/' . $file;
}

sub make_srpms_list_from_synthesis {
    my $urpm = URPM->new;
    $srpms_list = {};
    foreach my $srpms_synthesis (@{config()->{srpms_synthesis}}) {
        $urpm->parse_synthesis($srpms_synthesis) 
            or die "Error reading $srpms_synthesis\n";
    }
    $urpm->traverse(sub { 
            $srpms_list->{$_[0]->name}->{version} = $_[0]->version;
            $srpms_list->{$_[0]->name}->{release} = $_[0]->release;
            $srpms_list->{$_[0]->name}->{epoch} = $_[0]->epoch;
        });
}

sub save_srpms_list {
    DumpFile(config_path('srpms_list_file'), $srpms_list);
}

sub load_srpms_list {
    $srpms_list = LoadFile(config_path('srpms_list_file'), $srpms_list);
}

sub path_rev
{
    my ($ra, $path) = @_;
    if ($ra->check_path($path, $SVN::Core::INVALID_REVNUM)
        == $SVN::Node::none) {
        return undef;
    } else {
        return ($ra->get_dir($path,
                $SVN::Core::INVALID_REVNUM))[2]{'svn:entry:committed-rev'};
    }
}

sub get_srpms_rev {
    my $ra = SVN::Ra->new(config()->{svn_repourl});
    foreach my $pkg (keys %$srpms_list) {
        my ($ver, $rel, $epoch) = @{$srpms_list->{$pkg}}{qw/version release epoch/};
        $svnrev = path_rev($ra, "cauldron/$pkg/releases/$epoch:$ver/$rel");
        $svnrev = path_rev($ra, "cauldron/$pkg/releases/$ver/$rel") unless $svnrev;
        $srpms_list->{$pkg}->{svnrev} = $svnrev if $svnrev;
    }
}

sub get_svn_branch_cmds {
    my $ci_msg = config()->{svn_branch_commit_msg};
    my $repo_url = config()->{svn_repourl};
    my $branch_path = config()->{svn_branch_path};
    open(my $branch, '>', config_path('branch_cmds_file')) 
        or die "Error opening " . config_path('branch_cmds_file') . "\n";
    open(my $nobranch, '>', config_path('nobranch_file'))
        or die "Error opening " . config_path('nobranch_file') . "\n";
    print $branch "#!/bin/sh\n";
    foreach my $pkg (keys %$srpms_list) {
        if ($srpms_list->{$pkg}->{svnrev}) {
            print $branch "svn cp -m '$ci_msg' $repo_url/cauldron/$pkg\@$srpms_list->{$pkg}->{svnrev} $repo_url/$branch_path/$pkg\n";
        } else {
            print $nobranch "$pkg\n";
        }
    }
}

sub get_current_diff {
    my $ra = SVN::Ra->new(config()->{svn_repourl});
    my $ctx = SVN::Client->new();
    my $diffdir = config_path('diffdir');
    my $repo_url = config()->{svn_repourl};
    foreach my $pkg (keys %$srpms_list) {
        next unless $srpms_list->{$pkg}->{svnrev}
                && $srpms_list->{$pkg}->{svnrev} != path_rev($ra, "cauldron/$pkg");

        my $difffile = config_path('diffdir') . '/' . $pkg;
        open(my $diffout, '>', $difffile) or die "Error opening file $difffile\n";
        $ctx->diff([], "$repo_url/cauldron/$pkg/current", $srpms_list->{$pkg}->{svnrev},
            "$repo_url/cauldron/$pkg/current", 'HEAD', 1, 0, 0,
            $diffout, $diffout);
        close $diffout;
    }
}

1;