diff --git a/Changelog b/Changelog index e78edb89..6519eede 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,9 @@ +* Wed Nov 28 2007 Jesse Keating +- Figure out number of isos on the fly, based on tree size +- Add command line option to disable creation of split media +- Remove -S -P options, as splittree and packageorder are now +called from createIsos, if needed. + * Tue Nov 27 2007 Jesse Keating - Enable TMPDIR again so that anconda-runtime working files go to the working dir. diff --git a/doc/pungi.8 b/doc/pungi.8 index 55ad67cf..beb48857 100644 --- a/doc/pungi.8 +++ b/doc/pungi.8 @@ -31,6 +31,8 @@ The URL for your bug reporting system (defaults to http://bugzilla.redhat.com)\& The number of discs you want to create (defaults to 1)\&. .IP "\fB\-\-nosource\fP" Disable gathering of source packages (optional)\&. +.IP "\fB\-\-nosplitmedia\fP" +Disable creation of split media (optional)\&. .IP "\fB\-\-sourceisos\fP" Create the source media images (other arch runs must be done)\&. .IP "\fB\-c ksfile, \-\-config=ksfile\fP" @@ -43,10 +45,6 @@ Enable the Gather stage\&. Enable the Createrepo stage\&. .IP "\fB\-B\fP" Enable the BuildInstall stage\&. -.IP "\fB\-P\fP" -Enable the Package Order stage\&. -.IP "\fB\-S\fP" -Enable the SplitTree stage\&. .IP "\fB\-I\fP" Enable the CreateISO stage\&. diff --git a/pungi b/pungi index 5e025244..3d074f00 100755 --- a/pungi +++ b/pungi @@ -81,14 +81,7 @@ def main(): mypungi.doBuildinstall() mypungi.doGetRelnotes() - if opts.do_all or opts.do_packageorder: - mypungi.doPackageorder() - - if opts.do_all or opts.do_splittree: - mypungi.doSplittree() - if opts.do_all or opts.do_createiso: - mypungi.doCreateSplitrepo() mypungi.doCreateIsos() # Do things slightly different for src. @@ -99,9 +92,6 @@ def main(): config.get('default', 'version'), config.get('default', 'flavor'), 'source', 'SRPM') - if opts.do_all or opts.do_splittree: - mypungi.doSplitSRPMs() - if opts.do_all or opts.do_createiso: mypungi.doCreateIsos() @@ -144,6 +134,8 @@ if __name__ == '__main__': help='the number of discs you want to create (defaults to 1)') parser.add_option("--nosource", action="store_true", dest="nosource", help='disable gathering of source packages (optional)') + parser.add_option("--nosplitmedia", action="store_true", dest="nosplitmedia", + help='disable creation of split media (optional)') parser.add_option("--sourceisos", default=False, action="store_true", dest="sourceisos", help='Create the source isos (other arch runs must be done)') @@ -157,10 +149,6 @@ if __name__ == '__main__': help="Flag to enable processing the Createrepo stage") parser.add_option("-B", action="store_true", default=False, dest="do_buildinstall", help="Flag to enable processing the BuildInstall stage") - parser.add_option("-P", action="store_true", default=False, dest="do_packageorder", - help="Flag to enable processing the Package Order stage") - parser.add_option("-S", action="store_true", default=False, dest="do_splittree", - help="Flag to enable processing the SplitTree stage") parser.add_option("-I", action="store_true", default=False, dest="do_createiso", help="Flag to enable processing the CreateISO stage") @@ -171,7 +159,7 @@ if __name__ == '__main__': parser.print_help() sys.exit(0) - if opts.do_gather or opts.do_createrepo or opts.do_buildinstall or opts.do_packageorder or opts.do_splittree or opts.do_createiso: + if opts.do_gather or opts.do_createrepo or opts.do_buildinstall or opts.do_createiso: opts.do_all = False return (opts, args) diff --git a/pypungi/pungi.py b/pypungi/pungi.py index 3f47f25d..3e68beb1 100755 --- a/pypungi/pungi.py +++ b/pypungi/pungi.py @@ -348,7 +348,7 @@ cost=500 repofile.close() def doCreateIsos(self): - """Create isos from the various split directories.""" + """Create isos of the tree, optionally splitting the tree for split media.""" isolist=[] @@ -378,6 +378,106 @@ cost=500 sparcbootargs = ['-G', '/boot/isofs.b', '-B', '...', '-s', '/boot/silo.conf', '-sparc-label', '"sparc"'] + # Check the size of the tree + # This size checking method may be bunk, accepting patches... + treesize = int(subprocess.Popen(mkisofs + ['-print-size', self.topdir], stdout=subprocess.PIPE).communicate()[0]) + # Size returned is 2KiB clusters or some such. This translates that to MiB. + treesize = treesize * 2048 / 1024 / 1024 + + cdsize = self.config.getfloat('default', 'cdsize') + + # Do some math to figure out how many discs we'd need + if treesize < cdsize or self.config.has_option('default', 'nosplitmedia'): + self.config.set('default', 'discs', '1') + else: + discs = int(treesize / cdsize + 1) + self.config.set('default', 'discs', str(discs)) + if self.config.get('default', 'arch') == 'source': + self.doSplitSRPMS() + else: + self.doPackageorder() + self.doSplittree() + + if not self.config.get('default', 'arch') == 'source': + self.doCreateSplitrepo() + + if treesize > 700: # we're larger than a 700meg CD + isoname = '%s-%s-%s-DVD.iso' % (self.config.get('default', 'iso_basename'), self.config.get('default', 'version'), + self.config.get('default', 'arch')) + else: + isoname = '%s-%s-%s.iso' % (self.config.get('default', 'iso_basename'), self.config.get('default', 'version'), + self.config.get('default', 'arch')) + + isofile = os.path.join(self.isodir, isoname) + + if 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'), + '.discinfo-%s' % self.config.get('default', 'arch'))) + content[content.index('ALL\n')] = ','.join([str(x) for x in range(1, self.config.getint('default', 'discs') + 1)]) + '\n' + open(discinfofile, 'w').writelines(content) + + # move the main repodata out of the way to use the split repodata + shutil.move(os.path.join(self.topdir, 'repodata'), os.path.join(self.config.get('default', 'destdir'), + 'repodata-%s' % self.config.get('default', 'arch'))) + shutil.copytree('%s-disc1/repodata' % self.topdir, os.path.join(self.topdir, 'repodata')) + + # setup the extra mkisofs args + extraargs = [] + + if self.config.get('default', 'arch') == 'i386' or self.config.get('default', 'arch') == 'x86_64': + extraargs.extend(x86bootargs) + elif self.config.get('default', 'arch') == 'ia64': + extraargs.extend(ia64bootargs) + elif self.config.get('default', 'arch') == 'ppc': + extraargs.extend(ppcbootargs) + if self.config.getint('default', 'discs') == 1: + extraargs.append(os.path.join(self.topdir, "ppc/mac")) # this may work for both cases.. test + else: + extraargs.append(os.path.join('%s-disc%s' % (self.topdir, disc), "ppc/mac")) + elif self.config.get('default', 'arch') == 'sparc': + extraargs.extend(sparcbootargs) + + extraargs.append('-V') + if treesize > 700: + extraargs.append('%s %s %s DVD' % (self.config.get('default', 'name'), + self.config.get('default', 'version'), self.config.get('default', 'arch'))) + else: + extraargs.append('%s %s %s' % (self.config.get('default', 'name'), + self.config.get('default', 'version'), self.config.get('default', 'arch'))) + + extraargs.append('-o') + extraargs.append(isofile) + + if not self.config.get('default', 'arch') == 'source': + extraargs.append(self.topdir) + else: + extraargs.append(os.path.join(self.archdir, 'SRPMS')) + + # run the command + pypungi._doRunCommand(mkisofs + extraargs, self.logger) + + # implant md5 for mediacheck on all but source arches + if not self.config.get('default', 'arch') == 'source': + pypungi._doRunCommand(['/usr/lib/anaconda-runtime/implantisomd5', isofile], self.logger) + + # shove the sha1sum into a file + sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a') + pypungi._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file) + sha1file.close() + + # return the .discinfo file + if not self.config.get('default', 'arch') == 'source': + shutil.move(os.path.join(self.config.get('default', 'destdir'), '.discinfo-%s' % self.config.get('default', 'arch')), discinfofile) + + shutil.rmtree(os.path.join(self.topdir, 'repodata')) # remove our copied repodata + shutil.move(os.path.join(self.config.get('default', 'destdir'), + 'repodata-%s' % self.config.get('default', 'arch')), os.path.join(self.topdir, 'repodata')) + + # Write out a line describing the media + self.writeinfo('media: %s' % isofile) + if self.config.getint('default', 'discs') > 1: for disc in range(1, self.config.getint('default', 'discs') + 1): # cycle through the CD isos isoname = '%s-%s-%s-disc%s.iso' % (self.config.get('default', 'iso_basename'), self.config.get('default', 'version'), @@ -422,81 +522,7 @@ cost=500 isolist.append(self.mkrelative(isofile)) # Write out a line describing the CD set - self.writeinfo('cdset: %s' % ' '.join(isolist)) - - isolist=[] - # We've asked for one or more discs, so make a DVD image - if self.config.getint('default', 'discs') >= 1: - isoname = '%s-%s-%s-DVD.iso' % (self.config.get('default', 'iso_basename'), self.config.get('default', 'version'), - self.config.get('default', 'arch')) - isofile = os.path.join(self.isodir, isoname) - - if 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'), - '.discinfo-%s' % self.config.get('default', 'arch'))) - content[content.index('ALL\n')] = ','.join([str(x) for x in range(1, self.config.getint('default', 'discs') + 1)]) + '\n' - open(discinfofile, 'w').writelines(content) - - # move the main repodata out of the way to use the split repodata - shutil.move(os.path.join(self.topdir, 'repodata'), os.path.join(self.config.get('default', 'destdir'), - 'repodata-%s' % self.config.get('default', 'arch'))) - shutil.copytree('%s-disc1/repodata' % self.topdir, os.path.join(self.topdir, 'repodata')) - - # setup the extra mkisofs args - extraargs = [] - - if self.config.get('default', 'arch') == 'i386' or self.config.get('default', 'arch') == 'x86_64': - extraargs.extend(x86bootargs) - elif self.config.get('default', 'arch') == 'ia64': - extraargs.extend(ia64bootargs) - elif self.config.get('default', 'arch') == 'ppc': - extraargs.extend(ppcbootargs) - if self.config.getint('default', 'discs') == 1: - extraargs.append(os.path.join(self.topdir, "ppc/mac")) # this may work for both cases.. test - else: - extraargs.append(os.path.join('%s-disc%s' % (self.topdir, disc), "ppc/mac")) - elif self.config.get('default', 'arch') == 'sparc': - extraargs.extend(sparcbootargs) - - extraargs.append('-V') - extraargs.append('%s %s %s DVD' % (self.config.get('default', 'name'), - self.config.get('default', 'version'), self.config.get('default', 'arch'))) - - extraargs.append('-o') - extraargs.append(isofile) - - if not self.config.get('default', 'arch') == 'source': - extraargs.append(self.topdir) - else: - extraargs.append(os.path.join(self.archdir, 'SRPMS')) - - # run the command - pypungi._doRunCommand(mkisofs + extraargs, self.logger) - - # implant md5 for mediacheck on all but source arches - if not self.config.get('default', 'arch') == 'source': - pypungi._doRunCommand(['/usr/lib/anaconda-runtime/implantisomd5', isofile], self.logger) - - # shove the sha1sum into a file - sha1file = open(os.path.join(self.isodir, 'SHA1SUM'), 'a') - pypungi._doRunCommand(['/usr/bin/sha1sum', isoname], self.logger, rundir=self.isodir, output=sha1file) - sha1file.close() - - # return the .discinfo file - if not self.config.get('default', 'arch') == 'source': - shutil.move(os.path.join(self.config.get('default', 'destdir'), '.discinfo-%s' % self.config.get('default', 'arch')), discinfofile) - - shutil.rmtree(os.path.join(self.topdir, 'repodata')) # remove our copied repodata - shutil.move(os.path.join(self.config.get('default', 'destdir'), - 'repodata-%s' % self.config.get('default', 'arch')), os.path.join(self.topdir, 'repodata')) - - # keep track of the DVD images we've written - isolist.append(self.mkrelative(isofile)) - - # Write out a line describing the DVD set - self.writeinfo('dvdset: %s' % ' '.join(isolist)) + self.writeinfo('mediaset: %s' % ' '.join(isolist)) # Now make rescue images if not self.config.get('default', 'arch') == 'source' and \