redhat: mockbuild updates for repoquery
[openafs.git] / src / packaging / RedHat / mockbuild.pl
index 99f4d57..c2050d0 100755 (executable)
@@ -10,6 +10,7 @@ use warnings;
 use Getopt::Long;
 use File::Path;
 use IO::Dir;
+use File::Temp qw/ tempfile tempdir /;
 
 my $suser="nsu";
 my $rootbase="/var/lib/mock/";
@@ -21,161 +22,123 @@ my $buildall = 0;
 my $ignorerelease = 1;
 my @newrpms;
 
-# Words cannot describe how gross this is. Yum no longer provides usable
-# output, so we need to call the python interface. At some point this
-# probably means this script should be entirely rewritten in python,
-# but this is not that point.
-
-sub findKernelModules {
-  my ($root, $uname, @modules) = @_;
-
-  my $modlist = join(",",map { "'".$_."'" } @modules);
-  my $python = <<EOS;
-import yum;
-import sys;
-base = yum.YumBase();
-base.doConfigSetup('$root/etc/yum.conf', '$root');
-base.doRepoSetup();
-base.doSackSetup();
-EOS
+sub findKernels {
+  my ($root, $platform, $uname, @modules) = @_;
 
+  my ($fh, $tmpconf) = tempfile( "yum.confXXXX", DIR => "/tmp");
+  open(OLDCONF, "$root/etc/yum.conf");
+  while(<OLDCONF>) {
+      $_ =~ s#/var/cache/yum#/var/cache/mock/${platform}/yum_cache#;
+      print $fh $_;
+  }
+  close(OLDCONF);
+  my $archv = "";
+  open(PLATCONF, "/etc/mock/${platform}.cfg");
+  while (<PLATCONF>) {
+      if ($_ =~ "legal_host_arches") {
+         $_ =~ s/ //g;
+         $_ =~ /\(([\S]*)\)/;
+         $_ = $1;
+         if ($platform =~ "i386") {
+             $_ =~ s/\'x86_64\'//;
+             $_ =~ s/\,\,/\,/;
+             $_ =~ s/\,\$//;
+         }
+         if ($_ ne "") {
+             $archv="--archlist=$_";
+         }
+      }
+  }
+  close(PLATCONF);
+  my $modlist = join(" ", @modules);
+  my @kernels;
   if ($uname) {
-    $python.= <<EOS;
-
-for pkg, values in base.searchPackageProvides(['kernel-devel-uname-r']).items():
-  if values[0].find('kernel-devel-uname-r = ') != -1:
-    print '%s.%s %s' % (pkg.name, pkg.arch, values[0].replace('kernel-devel-uname-r = ',''));
-
-EOS
+    @kernels = `repoquery $archv --whatprovides kernel-devel-uname-r --qf "%{name}.%{arch} %{version}-%{release}" -c $tmpconf`;
   } else {
-    $python.= <<EOS;
-
-print '\\n'.join(['%s.%s %s' % (x.name, x.arch, x.printVer()) for x in base.searchPackageProvides([$modlist]).keys()]);
-
-EOS
+    @kernels = `repoquery $archv --show-duplicates --whatprovides $modlist --qf "%{name}.%{arch} %{version}-%{release}" -c $tmpconf`;
   }
+  unlink $tmpconf;
 
-#  my $output = `$suser -c "python -c \\\"$python\\\"" `;
-  my $output = `python -c "$python"`;
-
-  die "Python script to figure out available kernels failed : $output" 
-    if $?;
-
-  return $output;
+  return @kernels;
 }
 
 
-my %platconf = ( "fedora-5-i386" => { osver => "fc5",
-                                     kmod => '1',
-                                     basearch => 'i386',
-                                     updaterepo => 'updates-released',
-                                     results => 'fedora-5/i386' },
-                "fedora-5-x86_64" => { osver => "fc5",
+my %platconf = ( "centos-4-i386" => { osver => "el4",
+                                    kmod => '1',
+                                    basearch => 'i386',
+                                    updaterepo => 'update',
+                                    results => 'rhel4/i386' },
+                "centos-4-x86_64" => { osver => "el4",
                                       kmod => '1',
                                       basearch => 'x86_64',
-                                      updaterepo => 'updates-released',
-                                      results => 'fedora-5/x86_64' },
-                "fedora-6-i386" => { osver => "fc6", 
-                                     kmod => '1', 
-                                     basearch => 'i386',
-                                     updaterepo => 'updates-released',
-                                     results => "fedora-6/i386" },
-                "fedora-6-x86_64" => { osver => "fc6",
-                                       kmod => '1',
-                                       basearch => 'x86_64',
-                                       updaterepo => 'updates-released',
-                                       results => "fedora-6/x86_64" },
-                "fedora-7-i386" => { osver => "fc7", 
+                                      updaterepo => 'update',
+                                      results => "rhel4/x86_64" },
+                "centos-5-i386" => { osver => "el5", 
                                      kmod => '1', 
                                      basearch => 'i386',
-                                     updaterepo => 'updates-released',
-                                     results => "fedora-7/i386" },
-                "fedora-7-x86_64" => { osver => "fc7",
+                                     updaterepo => 'update',
+                                     results => "rhel5/i386" },
+                "centos-5-x86_64" => { osver => "el5",
                                        kmod => '1',
-                                       basearch => 'x86_64',
-                                       updaterepo => 'updates-released',
-                                       results => "fedora-7/x86_64" },
-                "fedora-8-i386" => { osver => "fc8", 
+                                       basearch => 'x86_64',
+                                       updaterepo => 'update',
+                                       results => "rhel5/x86_64" },
+                "centos-6-i386" => { osver => "el6", 
                                      kmod => '1', 
-                                     basearch => 'i386',
-                                     updaterepo => 'updates-released',
-                                     results => "fedora-8/i386" },
-                "fedora-8-x86_64" => { osver => "fc8",
+                                     basearch => 'i686',
+                                     updaterepo => 'update',
+                                     results => "rhel6/i686" },
+                "centos-6-x86_64" => { osver => "el6",
                                        kmod => '1',
-                                       basearch => 'x86_64',
-                                       updaterepo => 'updates-released',
-                                       results => "fedora-8/x86_64" },
-                "centos-4-i386" => { osver => "el4",
+                                       basearch => 'x86_64',
+                                       updaterepo => 'update',
+                                       results => "rhel6/x86_64" },
+                "epel-4-i386" => { osver => "el4",
                                     kmod => '1',
                                     basearch => 'i386',
                                     updaterepo => 'update',
                                     results => 'rhel4/i386' },
-                "centos-4-x86_64" => { osver => "el4",
+                "epel-4-x86_64" => { osver => "el4",
                                       kmod => '1',
                                       basearch => 'x86_64',
                                       updaterepo => 'update',
                                       results => "rhel4/x86_64" },
-                "centos-5-i386" => { osver => "el5", 
+                "epel-5-i386" => { osver => "el5", 
                                      kmod => '1', 
                                      basearch => 'i386',
                                      updaterepo => 'update',
                                      results => "rhel5/i386" },
-                "centos-5-x86_64" => { osver => "el5",
+                "epel-5-x86_64" => { osver => "el5",
                                        kmod => '1',
                                        basearch => 'x86_64',
                                        updaterepo => 'update',
                                        results => "rhel5/x86_64" },
-                "fedora-9-i386" => { osver => "fc9",
-                                     kmod => '1',
-                                     basearch => 'i386',
-                                     updaterepo => "updates-released",
-                                     results => 'fedora-9/i386' },
-                "fedora-9-x86_64" => { osver => "fc9",
-                                       kmod => "1",
-                                       basearch => "x86_64",
-                                       updaterepo => "updates-released",
-                                       results => "fedora-9/x86_64" },
-                "fedora-10-i386" => { osver => "fc10",
-                                     kmod => '1',
-                                     basearch => 'i386',
-                                     updaterepo => "updates-released",
-                                     results => 'fedora-10/i386' },
-                "fedora-10-x86_64" => { osver => "fc10",
-                                       kmod => "1",
-                                       basearch => "x86_64",
-                                       updaterepo => "updates-released",
-                                       results => "fedora-10/x86_64" },
-                "fedora-11-i386" => { osver => "fc11",
-                                     kmod => '1',
-                                     basearch => 'i386',
-#                                    updaterepo => "updates-released",
-                                     results => 'fedora-11/i386' },
-                "fedora-11-x86_64" => { osver => "fc11",
-                                       kmod => "1",
-                                       basearch => "x86_64",
-#                                      updaterepo => "updates-released",
-                                       results => "fedora-11/x86_64" },
-                "fedora-12-i386" => { osver => "fc12",
-                                     kmod => '1',
-                                     basearch => 'i386',
-#                                    updaterepo => "updates-released",
-                                     results => 'fedora-12/i386' },
-                "fedora-12-x86_64" => { osver => "fc12",
-                                       kmod => "1",
-                                       basearch => "x86_64",
-#                                      updaterepo => "updates-released",
-                                       results => "fedora-12/x86_64" },
-                 "fedora-13-i386" => { osver => "fc13",
+                "epel-6-i386" => { osver => "el6", 
+                                     kmod => '1', 
+                                     basearch => 'i686',
+                                     updaterepo => 'update',
+                                     results => "rhel6/i686" },
+                "epel-6-x86_64" => { osver => "el6",
+                                       kmod => '1',
+                                       basearch => 'x86_64',
+                                       updaterepo => 'update',
+                                       results => "rhel6/x86_64" },
+                 "fedora-14-i386" => { osver => "fc14",
                                         kmod => "1",
-                                        basearch => "i386",
-#                                       updaterepo => "updates-released",
-                                        results => "fedora-13/i386" },
-                 "fedora-13-x86_64" => { osver => "fc13",
+                                        basearch => "i686",
+                                        results => "fedora-14/i686" },
+                 "fedora-14-x86_64" => { osver => "fc14",
                                         kmod => "1",
                                         basearch => "x86_64",
-#                                       updaterepo => "updates-released",
-                                        results => "fedora-13/x86_64" },
-
+                                        results => "fedora-14/x86_64" },
+                 "fedora-15-i386" => { osver => "fc15",
+                                        kmod => "1",
+                                        basearch => "i686",
+                                        results => "fedora-15/i686" },
+                 "fedora-15-x86_64" => { osver => "fc15",
+                                        kmod => "1",
+                                        basearch => "x86_64",
+                                        results => "fedora-15/x86_64" },
                 "fedora-development-i386" => { osver => "fcd",
                                          kmod => '1',
                                          basearch => 'i386',
@@ -213,10 +176,22 @@ if (!$ok || $help || !$srpm || $#platforms==-1) {
 
 my $oafsversion = `rpm -q --queryformat=%{VERSION} -p $srpm` or die $!;
 chomp $oafsversion;
+$oafsversion=~/([0-9]+)\.([0-9]+)\.([0-9]+)/;
+my $major = $1;
+my $minor = $2;
+my $pathlevel = $3;
+
+# OpenAFS SRPMs newer than 1.6.0 use the dist, rather than osvers variable
+
+my $usedist = ($minor >= 6);
+
 my $oafsrelease = `rpm -q --queryformat=%{RELEASE} -p $srpm` or die $!;
 chomp $oafsrelease;
-$oafsrelease=~s/^[^\.]*\.(.*)$/$1/;
 
+# Before we used the dist tag, the release variable of the srpm was 1.<release>
+if (!$usedist) {
+       $oafsrelease=~s/^[^\.]*\.(.*)$/$1/;
+}
 print "Release is $oafsrelease\n";
 
 if ($platforms[0] eq "all" and $#platforms == 0) {
@@ -253,19 +228,19 @@ foreach my $platform (@platforms) {
 
   my $arbitraryversion = "";
 
-  my $modules;
+  my @kernels;
   if ($platform=~/fedora-development/) {
-    $modules = findKernelModules($root, 0, "kernel-devel");
+    @kernels = findKernels($root, $platform, 0, "kernel-devel");
   } elsif ($platform=~/centos-4/) {
-    $modules = findKernelModules($root, 0, "kernel-devel", "kernel-smp-devel", 
+    @kernels = findKernels($root, $platform, 0, "kernel-devel", "kernel-smp-devel", 
                                 "kernel-hugemem-devel", "kernel-xenU-devel");
   } else {
-    $modules = findKernelModules($root, 0, 'kernel-devel');
+    @kernels = findKernels($root, $platform, 0, 'kernel-devel');
   }
 
-  foreach my $module (split(/\n/, $modules)) {
-      chomp $module;
-      my ($package, $version, $repo)=split(/\s+/, $module);
+  foreach my $kernel (@kernels) {
+      chomp $kernel;
+      my ($package, $version)=split(/\s+/, $kernel);
       my ($arch) = ($package=~/\.(.*)$/);
       my ($variant) = ($package=~/kernel-(.*)-devel/);
       $variant = "" if !defined($variant);
@@ -273,13 +248,9 @@ foreach my $platform (@platforms) {
       next if ($arch eq "noarch");
       next 
          if (exists($badkernels{$version}) && ($badkernels{$version}{$variant}));
-      if ($platform=~/fedora-5/) {
-         next if ($variant eq "xen0"); # Fedora 5 has some bad xen0 kernel-devels
-         next if ($variant eq "smp");
-      }
-      if ($platform=~/fedora-8/ || $platform=~/fedora-9/ || $platform=~/fedora-10/ || $platform=~/fedora-development/) {
-         next if ($variant =~/debug$/); # Fedora 8 debug kernels are bad
-      }
+      next if ($variant =~/debug$/); # Fedora debug kernels are bad
+      next if ($kernel !~ /$osver/ ); # fc15 kernel in fc14 repo?
+
       print "$arch : $variant : $version\n";
       $modulelist{$arch} ={} if !$modulelist{$arch};
       $modulelist{$arch}{$version} = {} if !$modulelist{$arch}{$version};
@@ -302,12 +273,18 @@ foreach my $platform (@platforms) {
 
   my $missing = 0;
   foreach my $rpm (@rpms) {
-    if (! -f $resultdir."/".$rpm."-".$oafsversion."-".$osver.".".
-            $oafsrelease.".".$basearch.".rpm") {
+    my $rpmname;
+    if ($usedist) {
+       $rpmname = $rpm."-".$oafsversion."-".$oafsrelease.".".$osver.".".
+                  $basearch.".rpm";
+    } else {
+       $rpmname = $rpm."-".$oafsversion."-".$osver.".".$oafsrelease.".".
+                  $basearch.".rpm";
+    }
+    if (! -f $resultdir."/".$rpmname) {
       $missing++;
-      print $resultdir."/".$rpm."-".$oafsversion."-".$osver.".".
-           $oafsrelease.".".$basearch.".rpm is missing!\n";
-      push @missingrpms, $rpm;
+      print "$resultdir/$rpmname is missing!\n";
+      push @missingrpms, $rpmname;
     }
   }
   if ($missing) {
@@ -315,27 +292,25 @@ foreach my $platform (@platforms) {
                        ' --define "fedorakmod 1" '.
                        ' --define "kernvers '.$arbitraryversion.'" '.
                        ' --define "osvers '.$osver.'" '.
+                       ' --define "dist .'.$osver.'" '.
                        ' --define "build_modules 0" '.
                        ' --define "build_userspace 1" '.
                        ' --define "build_authlibs 1" '.
                        $srpm) == 0
       or die "build failed with : $!\n";
-    foreach my $rpm (@missingrpms) {
-      system("cp ".$mockresults."/".$rpm."-".$oafsversion."-".
-                  $osver.".".$oafsrelease.".".$basearch.".rpm ".
-                  $resultdir) == 0
+    foreach my $rpmname (@missingrpms) {
+      system("cp ".$mockresults."/".$rpmname." ".$resultdir) == 0
           or die "Copy failed with : $!\n";
-      push @newrpms, $resultdir."/".$rpm."-".$oafsversion."-".
-                    $osver.".".$oafsrelease.".".$basearch.".rpm";
+      push @newrpms, $resultdir."/".$rpmname;
     }
   } else {
     print "All userland RPMs present for $platform. Skipping build\n";
   }
 
-   print "-------------------------------------------------------------------\n";
+  print "-------------------------------------------------------------------\n";
   print "Building kernel modules\n";
 
- foreach my $arch (keys(%modulelist)) {
+  foreach my $arch (keys(%modulelist)) {
     foreach my $version (keys(%{$modulelist{$arch}})) {
       my $kversion = $version;
       $kversion=~s/-/_/g;
@@ -373,6 +348,7 @@ foreach my $platform (@platforms) {
                             " --arch ".$arch.
                             ' --define "fedorakmod 1" '.
                             ' --define "osvers '.$osver.'" '.
+                            ' --define "dist .'.$osver.'" '.
                             ' --define "kernvers '.$version.'" '.
                             ' --define "kvariants '.$variants.'" '.
                             ' --define "build_modules 1" '.