here's the whole file http://fpaste.org/paste/3872 -- Martin Gracik Software Engineer Email: mgracik@xxxxxxxxxx Tel.: +420 532 294 148 Red Hat Czech s.r.o., Purkyňova 99/71, 612 45, Brno, Czech Republic IC: 27690016 ----- Original Message ----- From: "Joel Granados" <jgranado@xxxxxxxxxx> To: "Discussion of Development and Customization of the Red Hat Linux Installer" <anaconda-devel-list@xxxxxxxxxx> Sent: Tuesday, February 17, 2009 3:39:41 PM GMT +01:00 Amsterdam / Berlin / Bern / Rome / Stockholm / Vienna Subject: Re: [PATCH] Rewrote parts of the pkgorder script (#451083) Martin: Can you send a link to the resulting file. It would make my life lot eaier :) thx. regard On Fri, Feb 13, 2009 at 03:37:23PM +0100, Martin Gracik wrote: > Improved the speed by removing unecessary glob.glob calls. > Removed unneeded imports. > Rewrote the functions to use more object oriented approach. > --- > scripts/pkgorder | 221 +++++++++++++++++++++++++++++------------------------ > 1 files changed, 121 insertions(+), 100 deletions(-) > > diff --git a/scripts/pkgorder b/scripts/pkgorder > index 7722718..6322fb2 100755 > --- a/scripts/pkgorder > +++ b/scripts/pkgorder > @@ -9,13 +9,14 @@ > # You should have received a copy of the GNU Library Public License > # along with this program; if not, write to the Free Software > # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. > -import os.path > -import glob > + > +import os > +import sys > +import shutil > +import fnmatch > + > import rpm > import rpmUtils > -import shutil > -import string > -import sys > import yum > > sys.path.append("/usr/lib/anaconda") > @@ -31,14 +32,44 @@ from optparse import OptionParser > from yum.packageSack import PackageSack > from yum.packages import PackageObject > from yuminstall import YumSorter > -import iutil > > -class PackageOrderer(YumSorter): > +import tempfile > + > + > +class Packages(object): > + def __init__(self, toppath, product): > + self.list = [] > + for dir in ("%s/%s/RPMS" % (toppath, product), > + "%s/%s" % (toppath, product), > + toppath): > + if os.path.isdir(dir): > + self.list = os.listdir(dir) > + break > + self.list.sort() > + > + self.processed = {} > + > + def printMatching(self, fpattern): > + matches = fnmatch.filter(self.list, fpattern) > + > + for match in matches: > + mname = os.path.basename(match) > + if self.processed.has_key(mname): > + continue > + else: > + self.processed[mname] = True > + print mname > + > > - def __init__(self, arch=None): > +class PackageOrderer(YumSorter): > + def __init__(self, pkgs, arch=None): > YumSorter.__init__(self) > self.arch = arch > self._installed = PackageSack() > + > + assert isinstance(pkgs, Packages) == True > + self.pkgs = pkgs > + self.config = None > > def doFileLogSetup(self, uid, logfile): > pass > @@ -47,11 +78,14 @@ class PackageOrderer(YumSorter): > pass > > def setup(self, fn="/etc/yum.conf", root="/", excludes=[]): > - self.doConfigSetup(fn, root, init_plugins = False) > + if self.config: > + fn = self.config > + > + self.doConfigSetup(fn, root, init_plugins=False) > self.conf.cache = 0 > -# if hasattr(self.repos, 'sqlite'): > -# self.repos.sqlite = False > -# self.repos._selectSackType() > +# if hasattr(self.repos, 'sqlite'): > +# self.repos.sqlite = False > +# self.repos._selectSackType() > exclude = self.conf.exclude > exclude.extend(excludes) > self.conf.exclude = exclude > @@ -67,49 +101,31 @@ class PackageOrderer(YumSorter): > > def getDownloadPkgs(self): > pass > - > -#XXX: sigh > -processed = {} > -def processTransaction(ds): > - del ds.ts > - ds.initActionTs() > - ds.populateTs(keepold=0) > - ds.ts.check() > - ds.ts.order() > - > - # Return if there are no packages in the transaction set > - if not ds.ts.ts.getKeys(): > - return > - > - for (hdr, path) in ds.ts.ts.getKeys(): > - fname = os.path.basename(path) > - fpattern = "%s*" % fname.rsplit('.', 2)[0] > - printMatchingPkgs(fpattern) > - > -def printMatchingPkgs(fpattern): > - global processed > - > - if os.path.isdir("%s/%s/RPMS" % (toppath, product)): > - matches = glob.glob("%s/%s/RPMS/%s" % (toppath, product, fpattern)) > - elif os.path.isdir("%s/%s" %(toppath, product)): > - matches = glob.glob("%s/%s/%s" % (toppath, product, fpattern)) > - else: > - matches = glob.glob("%s/%s" % (toppath, fpattern)) > - > - for match in matches: > - mname = os.path.basename(match) > - if processed.has_key(mname): continue > - processed[mname] = True > - print mname > - > -def addGroups(ds, groupLst): > - ds.initActionTs() > - map(ds.selectGroup, filter(lambda x: ds.comps.has_group(x), groupLst)) > - ds.resolveDeps() > - processTransaction(ds) > - > -def createConfig(toppath): > - yumconfstr = """ > + > + def processTransaction(self): > + del self.ts > + self.initActionTs() > + self.populateTs(keepold=0) > + self.ts.check() > + self.ts.order() > + > + # Return if there are no packages in the transaction set > + if not self.ts.ts.getKeys(): > + return > + > + for (hdr, path) in self.ts.ts.getKeys(): > + fname = os.path.basename(path) > + fpattern = "%s*" % fname.rsplit('.', 2)[0] > + self.pkgs.printMatching(fpattern) > + > + def addGroups(self, groupLst): > + self.initActionTs() > + map(self.selectGroup, filter(lambda x: self.comps.has_group(x), groupLst)) > + self.resolveDeps() > + self.processTransaction() > + > + def createConfig(self, toppath): > + yumconfstr = """ > [main] > distroverpkg=redhat-release > gpgcheck=0 > @@ -120,84 +136,89 @@ exclude=*debuginfo* > name=Anaconda > baseurl=file://%s > enabled=1 > -""" % (toppath) > - > - try: > - (fd, path) = tempfile.mkstemp("", "yum-conf-", toppath) > - except (OSError, IOError), e: > - print >> sys.stderr, "Error writing to %s" % (toppath,) > - sys.exit(1) > - os.write(fd, yumconfstr) > - os.close(fd) > - return path > +""" % (toppath,) > + > + try: > + (fd, path) = tempfile.mkstemp("", "yum-conf-", toppath) > + except (OSError, IOError), e: > + print >> sys.stderr, "Error writing to %s" % (toppath,) > + sys.exit(1) > + os.write(fd, yumconfstr) > + os.close(fd) > + self.config = path > + > + def unlinkConfig(self): > + if self.config: > + os.unlink(self.config) > + > > def usage(): > print >> sys.stderr, "pkgorder <toppath> <arch> <productpath>" > print >> sys.stderr, "<arch>: use rpm architecture for tree, eg i686" > > -if __name__ == "__main__": > - import tempfile > + > +if __name__ == "__main__": > parser = OptionParser() > parser.add_option("--debug", action="store_true", dest="debug", default=False) > parser.add_option("--file", action="store", dest="file") > - parser.add_option("--product", action="store", dest="productPath", ) > - parser.add_option("--exclude", action="append", dest="excludeList", > - default=[]) > + parser.add_option("--product", action="store", dest="productPath") > + parser.add_option("--exclude", action="append", dest="excludeList", default=[]) > > (options, args) = parser.parse_args() > - > if len(args) != 3: > - usage() > + usage() > sys.exit(1) > - > (toppath, arch, product) = args > - config = createConfig(toppath) > - > + > # Boo. > if arch == "i386": > arch = "i686" > + > + pkgs = Packages(toppath, product) > > # print out kernel related packages first > - printMatchingPkgs("kernel-*") > + pkgs.printMatching("kernel-*") > > - testpath = "/tmp/pkgorder-%d" %(os.getpid(),) > - os.system("mkdir -p %s/var/lib/rpm" %(testpath,)) > + testpath = "/tmp/pkgorder-%d" % (os.getpid(),) > + os.system("mkdir -p %s/var/lib/rpm" % (testpath,)) > > - ds = PackageOrderer(arch=arch) > - ds.setup(fn=config, excludes=options.excludeList, root = testpath) > + ds = PackageOrderer(pkgs=pkgs, arch=arch) > + ds.createConfig(toppath) > + ds.setup(root=testpath, excludes=options.excludeList) > > - addGroups(ds, ["core", "base", "text-internet"]) > + ds.addGroups(["core", "base", "text-internet"]) > > # hack, hack, hack... make sure iscsi ends up on disc1 (#208832) > - printMatchingPkgs("iscsi-*") > + pkgs.printMatching("iscsi-*") > > - addGroups(ds, ["base-x", "dial-up", > - "graphical-internet", "editors", > - "graphics", "gnome-desktop", "sound-and-video", > - "printing"]) > + ds.addGroups(["base-x", "dial-up", > + "graphical-internet", "editors", > + "graphics", "gnome-desktop", "sound-and-video", > + "printing"]) > > - addGroups(ds, ["office", "engineering-and-scientific", > - "authoring-and-publishing", "games"]) > + ds.addGroups(["office", "engineering-and-scientific", > + "authoring-and-publishing", "games"]) > > - addGroups(ds, ["web-server", "ftp-server", "sql-server", > - "mysql", "server-cfg", "dns-server", > - "smb-server", "admin-tools"]) > + ds.addGroups(["web-server", "ftp-server", "sql-server", > + "mysql", "server-cfg", "dns-server", > + "smb-server", "admin-tools"]) > > - addGroups(ds, ["kde-desktop", "development-tools", "development-libs", > - "gnome-software-development", "eclipse", > - "x-software-development", > - "java-development", "kde-software-development", > - "mail-server", "network-server", "legacy-network-server"]) > + ds.addGroups(["kde-desktop", "development-tools", "development-libs", > + "gnome-software-development", "eclipse", > + "x-software-development", > + "java-development", "kde-software-development", > + "mail-server", "network-server", "legacy-network-server"]) > > - addGroups(ds, ["news-server", "legacy-software-development"]) > + ds.addGroups(["news-server", "legacy-software-development"]) > > - #Everthing else but kernels > + # Everything else but kernels > for po in ds.pkgSack.returnPackages(): > if po.pkgtup not in ds._installed.returnPackages(): > if po.name.find("kernel") == -1: > member = ds.tsInfo.addInstall(po) > > ds.resolveDeps() > - processTransaction(ds) > - os.unlink(config) > + ds.processTransaction() > + ds.unlinkConfig() > shutil.rmtree(testpath) > + > -- > 1.6.0.6 > > _______________________________________________ > Anaconda-devel-list mailing list > Anaconda-devel-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/anaconda-devel-list -- Joel Andres Granados Brno, Czech Republic, Red Hat. _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list