diff --git a/pungi b/pungi index c73f43f1..8fa35438 100755 --- a/pungi +++ b/pungi @@ -71,17 +71,31 @@ def main(): print >> sys.stderr, "Error: Cannot create cache dir %s" % cachedir sys.exit(1) - mygather = pypungi.gather.Gather(config, pkglist) - mygather.getPackageObjects() - mygather.downloadPackages() + # Actually do work. + if not config.get('default', 'arch') == 'source': + mygather = pypungi.gather.Gather(config, pkglist) + mygather.getPackageObjects() + mygather.downloadPackages() + if config.getboolean('default', 'getsource'): + mygather.getSRPMList() + mygather.downloadSRPMs() - mypungi = pypungi.pungi.Pungi(config) - mypungi.doBuildinstall() - mypungi.doPackageorder() - mypungi.doSplittree() - mypungi.doCreateSplitrepo() - mypungi.doCreateIsos() + mypungi = pypungi.pungi.Pungi(config) + mypungi.doBuildinstall() + mypungi.doPackageorder() + mypungi.doSplittree() + mypungi.doCreateSplitrepo() + mypungi.doCreateIsos() + # Do things slightly different for src. + if config.get('default', 'arch') == 'source': + # we already have all the content gathered + mypungi = pypungi.pungi.Pungi(config) + mypungi.topdir = os.path.join(config.get('default', 'destdir'), + config.get('default', 'version'), + 'source', 'SRPM') + mypungi.doSplitSRPMs() + mypungi.doCreateIsos() if __name__ == '__main__': from optparse import OptionParser diff --git a/pypungi/gather.py b/pypungi/gather.py index 1aa6b8f5..585aaa39 100755 --- a/pypungi/gather.py +++ b/pypungi/gather.py @@ -15,6 +15,7 @@ import yum import os import shutil +import sys class Gather(yum.YumBase): def __init__(self, config, pkglist): @@ -33,6 +34,7 @@ class Gather(yum.YumBase): self.config = config self.pkglist = pkglist self.polist = [] + self.srpmlist = [] def getPackageDeps(self, po): """Return the dependencies for a given package, as well @@ -97,6 +99,18 @@ class Gather(yum.YumBase): self.polist = final_pkgobjs.keys() + def getSRPMList(self): + """Cycle through the list of package objects and + find the sourcerpm for them. Requires yum still + configured and a list of package objects""" + + + for po in self.polist: + srpm = po.returnSimple('sourcerpm').rsplit('-', 2)[0] + if not srpm in self.srpmlist: + self.srpmlist.append(srpm) + + def downloadPackages(self): """Cycle through the list of package objects and download them from their respective repos.""" @@ -144,6 +158,73 @@ class Gather(yum.YumBase): os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + def downloadSRPMs(self): + """Cycle through the list of srpms and + find the package objects for them, Then download them.""" + + + srpmpolist = [] + + # Work around for yum bug + for sack in self.pkgSack.sacks.values(): + sack.excludes = {} + + self.pkgSack.excludes = {} + + # We need to reset the yum object + self.pkgSack = None + + # Setup the sack with just src arch + self.doSackSetup(archlist=['src']) + + for srpm in self.srpmlist: + try: + matches = self.pkgSack.searchNevra(name=srpm) + mysack = yum.packageSack.ListPackageSack(matches) + srpmpo = mysack.returnNewestByNameArch()[0] + if not srpmpo in srpmpolist: + srpmpolist.append(srpmpo) + except IndexError: + print >> sys.stderr, "Error: Cannot find a source rpm for %s" % srpm + sys.exit(1) + + # do the downloads + pkgdir = os.path.join(self.config.get('default', 'destdir'), self.config.get('default', 'version'), + 'source', 'SRPMS') + + if not os.path.exists(pkgdir): + os.makedirs(pkgdir) + + for pkg in srpmpolist: + repo = self.repos.getRepo(pkg.repoid) + remote = pkg.returnSimple('relativepath') + local = os.path.basename(remote) + local = os.path.join(self.config.get('default', 'cachedir'), local) + if os.path.exists(local) and str(os.path.getsize(local)) == pkg.returnSimple('packagesize'): + + if not self.config.has_option('default', 'quiet'): + self.logger.info("%s already exists and appears to be complete" % local) + if os.path.exists(os.path.join(pkgdir, os.path.basename(remote))) and str(os.path.getsize(os.path.join(pkgdir, os.path.basename(remote)))) == pkg.returnSimple('packagesize'): + if not self.config.has_option('default', 'quiet'): + self.logger.info("%s already exists in tree and appears to be complete" % local) + else: + os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + continue + + # Disable cache otherwise things won't download + repo.cache = 0 + if not self.config.has_option('default', 'quiet'): + self.logger.info('Downloading %s' % os.path.basename(remote)) + pkg.localpath = local # Hack: to set the localpath to what we want. + + # do a little dance for file:// repos... + path = repo.getPackage(pkg) + if not os.path.exists(local) or not os.path.samefile(path, local): + shutil.copy2(path, local) + + os.link(local, os.path.join(pkgdir, os.path.basename(remote))) + + def main(): # This is used for testing the module (opts, args) = get_arguments() diff --git a/pypungi/pungi.py b/pypungi/pungi.py index a48c08b2..03a63b68 100755 --- a/pypungi/pungi.py +++ b/pypungi/pungi.py @@ -59,6 +59,34 @@ class Pungi: for line in output: print line + def doSplitSRPMs(self): + timber = splittree.Timber() + timber.arch = self.config.get('default', 'arch') + #timber.total_discs = self.config.getint('default', 'discs') + #timber.bin_discs = self.config.getint('default', 'discs') + timber.src_discs = self.config.getint('default', 'discs') + #timber.release_str = '%s %s' % (self.config.get('default', 'product_name'), self.config.get('default', 'version')) + #timber.package_order_file = os.path.join(self.config.get('default', 'destdir'), 'pkgorder-%s' % self.config.get('default', 'arch')) + timber.dist_dir = os.path.join(self.config.get('default', 'destdir'), + self.config.get('default', 'version'), + 'source', 'SRPM') + timber.src_dir = os.path.join(self.config.get('default', 'destdir'), self.config.get('default', 'version'), 'source', 'SRPMS') + #timber.product_path = self.config.get('default', 'product_path') + #timber.reserve_size = + # Set this ourselves, for creating our dirs ourselves + timber.src_list = range(1, timber.src_discs + 1) + + # this is stolen from splittree.py in anaconda-runtime. Blame them if its ugly (: + for i in range(timber.src_list[0], timber.src_list[-1] + 1): + os.makedirs("%s-disc%d/SRPMS" % (timber.dist_dir, i)) + timber.linkFiles(timber.dist_dir, + "%s-disc%d" %(timber.dist_dir, i), + timber.common_files) + + timber.splitSRPMS() + for line in timber.logfile: + print line + def doCreateSplitrepo(self): discinfo = open('%s-disc1/.discinfo' % self.topdir, 'r').readlines() mediaid = discinfo[0].rstrip('\n') @@ -98,9 +126,12 @@ class Pungi: isoname, os.path.join('%s-disc%s' % (self.topdir, disc)))) os.system('cd %s; sha1sum %s >> SHA1SUM' % (isodir, isoname)) - os.system('/usr/lib/anaconda-runtime/implantisomd5 %s' % os.path.join(isodir, isoname)) + # implant md5 for mediacheck on all but source arches + if not self.config.get('default', 'arch') == 'source': + os.system('/usr/lib/anaconda-runtime/implantisomd5 %s' % os.path.join(isodir, isoname)) - if self.config.getint('default', 'discs') > 1: # We've asked for more than one disc, make a DVD image + # We've asked for more than one disc, and we're not srpms, so make a DVD image + if self.config.getint('default', 'discs') > 1 and not self.config.get('default', 'arch') == 'source': # backup the main .discinfo to use a split one. This is an ugly hack :/ content = open(discinfofile, 'r').readlines() shutil.move(discinfofile, os.path.join(self.config.get('default', 'destdir'), @@ -120,10 +151,12 @@ class Pungi: self.config.get('default', 'arch')) if self.config.get('default', 'arch') == 'i386' or self.config.get('default', 'arch') == 'x86_64': bootargs = x86bootargs - if self.config.get('default', 'arch') == 'ia64': + elif self.config.get('default', 'arch') == 'ia64': bootargs = ia64bootargs elif self.config.get('default', 'arch') == 'ppc': bootargs = ppcbootargs + else: + bootargs = '' # clear out any existing bootargs os.system('mkisofs %s %s %s -o %s/%s %s' % (mkisofsargs, volname,