[yum-cvs] yum-utils repotrack.py,1.1,1.2

Seth Vidal skvidal at linux.duke.edu
Thu Jan 5 08:21:06 UTC 2006


Update of /home/groups/yum/cvs/yum-utils
In directory login1.linux.duke.edu:/tmp/cvs-serv24932

Modified Files:
	repotrack.py 
Log Message:

rough cut of repotrack


Index: repotrack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum-utils/repotrack.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- repotrack.py	11 Jun 2005 19:43:42 -0000	1.1
+++ repotrack.py	5 Jan 2006 08:21:04 -0000	1.2
@@ -27,5 +27,140 @@
 # need to keep state of current repo to know what's 'new' and when to download things
 # arch should be specified or default to system arch.
 
+import os
+import sys
+import time
+
 import yum
+import yum.Errors
+from yum.misc import getCacheDir
+from yum.constants import *
+from yum.packages import parsePackages
+
+output_dir = '/tmp/repotrack_dir'
+user_pkg_list = ['mplayer', 'mplayerplug-in', 'yum']
+enabled_repos = ['livna', 'livna-testing']
+
+class RepoTrack(yum.YumBase):
+    def __init__(self, config = "/etc/yum.conf"):
+        yum.YumBase.__init__(self)
+
+
+    def findDeps(self, pkg_object_list):
+        """Return the dependencies for a given package, as well
+           possible solutions for those dependencies.
+           
+           Returns the deps as a dict  of:
+             packageobject = [reqs] = [list of satisfying pkgs]"""
+        
+        results = {}
+    
+        for pkg in pkg_object_list:
+            results[pkg] = {} 
+            reqs = pkg.returnPrco('requires');
+            reqs.sort()
+            pkgresults = results[pkg] # shorthand so we don't have to do the
+                                      # double bracket thing
+            
+            for req in reqs:
+                (r,f,v) = req
+                if r.startswith('rpmlib('):
+                    continue
+                
+                satisfiers = []
+    
+                for po in self.whatProvides(r, f, v):
+                    satisfiers.append(po)
+    
+                pkgresults[req] = satisfiers
+        
+        return results
+    
+
+def more_to_check(unprocessed_pkgs):
+    for pkg in unprocessed_pkgs.keys():
+        if unprocessed_pkgs[pkg] is not None:
+            return True
+    
+    return False
+
+
+def main():
+# setup yum basics
+# read in repo info
+# find all its deps using findDeps()
+# set the download path to output_dir
+# download and gpg/sha checksum them
+# output list of things that actually got downloaded.
+
+
+# arguments to take: arch, repos, package names to track, yum config file,
+#                    download or list urls
+
+
+    my = RepoTrack()
+    my.doConfigSetup()
+    
+    # do the happy tmpdir thing if we're not root
+    if os.geteuid() != 0:
+        cachedir = getCacheDir()
+        if cachedir is None:
+            print "Error: Could not make cachedir, exiting"
+            sys.exit(50)
+            
+        my.repos.setCacheDir(cachedir)
+
+    for repo in my.repos.repos.values():
+        if repo.id not in enabled_repos:
+            repo.disable()
+        else:
+            repo.enable()
+    
+    my.doRepoSetup()    
+    my.doSackSetup()
+    
+    unprocessed_pkgs = {}
+    final_pkgs = {}
+    user_po_list = []
+    pkg_list = []
+    
+    avail = my.pkgSack.returnPackages()
+    for item in user_pkg_list:
+        print item
+        exactmatch, matched, unmatched = parsePackages(avail, [item])
+        pkg_list.extend(my.bestPackagesFromList(exactmatch+matched))
+    
+    for po in pkg_list:
+        unprocessed_pkgs[po.pkgtup] = po
+    
+
+    while more_to_check(unprocessed_pkgs):
+    
+        for pkgtup in unprocessed_pkgs.keys():
+            if unprocessed_pkgs[pkgtup] is None:
+                continue
+
+            po = unprocessed_pkgs[pkgtup]
+            final_pkgs[po.pkgtup] = po
+            
+            deps_dict = my.findDeps([ po ])
+            unprocessed_pkgs[po.pkgtup] = None
+            for deps_po in deps_dict.keys():
+                for req in deps_dict[deps_po].keys():
+                    best_res = my.bestPackagesFromList(deps_dict[deps_po][req])
+                    for res in best_res:
+                        if res is not None:
+                            if not unprocessed_pkgs.has_key(res.pkgtup):
+                                unprocessed_pkgs[res.pkgtup] = res
+        
+        for pkgtup in unprocessed_pkgs.keys():
+            if unprocessed_pkgs[pkgtup] is not None:
+                print unprocessed_pkgs[pkgtup]
+
+        
+    for po in final_pkgs.values():
+        print po
 
+if __name__ == "__main__":
+    main()
+    




More information about the Yum-cvs-commits mailing list