checking in more of the rpm build system (is that it?)
[freeside.git] / rpm / build / native / ovid2flute
1 #!/usr/bin/perl -w
2 #
3 # Convert the output from ovid --deps into a list of modules to run through cpanflute2 to get
4 # better .spec files, and generate SRPMs from these.
5
6 use strict;
7 use Getopt::Long;
8
9 # Need to fix up modules where Ovid parses the name incorrectly
10 my %badparse=(
11         'Crypt-PasswdMD-5' => 'Crypt-PasswdMD5',
12         'IPC-Run-3' => 'IPC-Run3',
13         'Digest-SHA-1' => 'Digest-SHA1',
14         'Digest-MD-4' => 'Digest-MD4',
15 );
16
17 my %extra_buildreqs=(
18         'File-Rsync' => [ qw/rsync/ ],
19         'MIMETools' => [ qw/perl(Mail::Header) perl(Mail::Internet) perl(Mail::Field) perl(IO::Stringy) perl(File::Temp)/ ],
20         'HTML::Scrubber' => [ qw/perl(HTML::Parser) perl(HTML::Tagset)/ ],
21 #       'Time::Duration' => [ qw/perl(Test::Pod) perl(Test::Pod::Coverage)/ ],
22 );
23
24 my %extra_reqs=(
25         'File-Rsync' => [ qw/rsync/ ],
26 );
27
28 my %opts;
29
30 GetOptions(\%opts, 'packager=s', 'release=s');
31
32 $opts{packager} = 'Richard Siddall <richard.siddall@elirion.net>' if !defined($opts{packager});
33
34 # Need to process modules that cause Ovid to crash
35 #my @extramods= qw/Text::CSV_XS Pod::Simple Crypt::SSLeay/;
36 #my @extramods= qw/Crypt::SSLeay/;
37 my @extramods= qw/IPC::ShareLite/;
38
39 my $specfiledir="/home/rsiddall/work/redhat/SPECS";
40 $specfiledir = "/home/rsiddall/redhat/SPECS" if ! -d $specfiledir;
41 my $srpmdir="/home/rsiddall/work/redhat/SRPMS";
42 $srpmdir = "/home/rsiddall/redhat/SRPMS" if ! -d $srpmdir;
43
44 foreach (reverse <STDIN>) {
45         next if !defined($_);
46         #print $_;
47         last if $_ !~ /^([-\w:]+) perl-([-\w\.]+)(-\d+[\w\.]+?)$/;
48         #print "$1 = $2\n"
49         my ($name, $rpm, $ver) = ($1, $2, $3);
50         print "# $name ($rpm - $ver)\n";
51         foreach my $cand (keys %badparse) {
52                 if ($rpm =~ /^$cand/) {
53                         $rpm =~ s/^$cand/$badparse{$cand}/;
54                         print "# Fixed up $rpm\n";
55                         last;
56                 }
57         }
58         printcmds($name, "$rpm$ver");
59         #print "cpanspec -v --packager 'Unknown <nobody\@example.com>' $name\n";
60         #print "echo $rpm\n";
61         #print "repoquery perl-$rpm\n";
62         #touchsrpms($name, "$rpm$ver");
63 }
64
65 exit;
66
67 foreach my $name (@extramods) {
68         my $rpm = $name;
69         $rpm =~ s/::/-/g;
70         my $tarball = `find ~/.cpan/sources -name '$rpm-*' -print | tail -1`;
71         #print "$name (Extra!)\n"
72         if ($tarball =~ /\/($rpm-.*?)(\.tar\.gz|\.tgz)\s*$/) {
73                 $rpm = $1;
74                 printcmds($name, $rpm);
75         } else {
76                 die "Can't find full rpm name for $name in \"$tarball\"\n";
77         }
78 }
79
80 sub touchsrpms {
81         my ($name, $rpm) = @_;
82         my $repofolder ="/var/www/html/repo/sles/10/freeside-1.9/stable/x86_64";
83         my $srpmfolder ="/home/rsiddall/work/redhat/SRPMS";
84         my @files = glob "$repofolder/perl-$rpm-*.rpm";
85         if (! scalar(@files)) {
86                 print "Can't find $rpm in $repofolder\n";
87                 @files = glob "$srpmfolder/perl-$rpm-*.src.rpm\n";
88                 if (scalar(@files)) {
89                         my $file = pop @files;
90                         print "touch $file\n";
91                 } else {
92                         print STDERR "No corresponding SRPM: $srpmfolder/perl-$rpm-*.src.rpm\n";
93                         printcmds($name, $rpm);
94                 }
95         }
96 }
97
98 sub printcmds {
99         my ($name, $rpm) = @_;
100
101         my $tarball = `find ~/.cpan -name '$rpm.tar.gz' -print`;
102         $tarball = `find ~/.cpan -name '$rpm.tgz' -print` if ! $tarball;
103         chomp($tarball);
104 #       my $specfile = "$specfiledir/$name.spec";
105         my $rpmname = $rpm;
106         $rpmname = $1 if $rpm =~ /^(?:.*\/)?(.*)-(?:v\.?)?([^-]+)$/;
107         my $specfile = "$specfiledir/perl-$rpmname.spec";
108         $specfile =~ s/::/-/g;
109         # Work out which version of the SRPM we're going to generate.
110         my $rel;
111         if (!defined($opts{release})) {
112                 for ($rel = 1; ; $rel++) {
113                         my $srpm = "$srpmdir/perl-$rpm-$rel.src.rpm";
114                         last if ! -e $srpm;
115                         print "# File exists: $srpm\n";
116                 }
117         } else {
118                 $rel = $opts{release};
119         }
120         my $fluteopts = "";
121         foreach my $cand (keys %extra_buildreqs) {
122                 if ($rpm =~ /^$cand/) {
123                         $fluteopts .= join "", map { "--buildrequires $_ " } @{$extra_buildreqs{$cand}};
124                         last;
125                 }
126         }
127         foreach my $cand (keys %extra_reqs) {
128                 if ($rpm =~ /^$cand/) {
129                         $fluteopts .= join "", map { "--requires $_ " } @{$extra_reqs{$cand}};
130                         last;
131                 }
132         }
133         print "cpanflute2 --just-spec --noperlreqs --email='$opts{packager}' --release=$rel $fluteopts $tarball > $specfile;\n";
134         # Should fix up the .spec file
135         print "perl -pi -e 's/perl\\(perl\\)/perl/g' $specfile;\n";
136         my $tarballdir = `dirname $tarball` or die "Can't find tarball for $name: $tarball\n";
137         chomp($tarballdir);
138         print "rpmbuild -bs --nodeps --define '_sourcedir $tarballdir' --define '_srcrpmdir $srpmdir' $specfile\n";
139         print "# Generates: $srpmdir/perl-$rpm-$rel.src.rpm\n";
140 }
141