Re: [PATCH] Rewrote parts of the pkgorder script (#451083)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux