add 'oemake -s' option to dump out a table of latest and preferred versions for all...
authorPhil Blundell <philb@gnu.org>
Sun, 28 Nov 2004 11:57:07 +0000 (11:57 +0000)
committerPhil Blundell <philb@gnu.org>
Sun, 28 Nov 2004 11:57:07 +0000 (11:57 +0000)
bin/oemake

index fa22f38..46fa7da 100644 (file)
@@ -71,6 +71,9 @@ Default OEFILES are the .oe files in the current directory.""" )
     parser.add_option( "-d", "--disable-psyco", help = "disable using the psyco just-in-time compiler (not recommended)",
                action = "store_true", dest = "disable_psyco", default = False )
 
+    parser.add_option( "-s", "--show-versions", help = "show current and preferred versions of all packages",
+               action = "store_true", dest = "show_versions", default = False )
+
     options, args = parser.parse_args( args )
     return options, args[1:]
 
@@ -143,6 +146,103 @@ def try_build(fn, virtual):
         __building_list.remove(fn)
         __build_path.remove(pathstr)
 
+def showVersions():
+    pkg_pn = {}
+    preferred_versions = {}
+    latest_versions = {}
+
+    for p in make.pkgdata.keys():
+        pn = oe.data.getVar('PN', make.pkgdata[p], 1)
+        if not pkg_pn.has_key(pn):
+            pkg_pn[pn] = []
+        pkg_pn[pn].append(p)
+    
+    # Sort by priority
+    for pn in pkg_pn.keys():
+        files = pkg_pn[pn]
+        priorities = {}
+        for f in files:
+            priority = oefile_priority[f]
+            if not priorities.has_key(priority):
+                priorities[priority] = []
+            priorities[priority].append(f)
+        p_list = priorities.keys()
+        p_list.sort(lambda a, b: a - b)
+        pkg_pn[pn] = []
+        for p in p_list:
+            pkg_pn[pn] = [ priorities[p] ] + pkg_pn[pn]
+
+    # If there is a PREFERRED_VERSION, find the highest-priority oefile providing that
+    # version.  If not, find the latest version provided by an oefile in the
+    # highest-priority set.
+    for pn in pkg_pn.keys():
+        preferred_file = None
+        
+        preferred_v = oe.data.getVar('PREFERRED_VERSION_%s' % pn, make.cfg, 1)
+        if preferred_v:
+            preferred_r = None
+            m = re.match('(.*)_(.*)', preferred_v)
+            if m:
+                preferred_v = m.group(1)
+                preferred_r = m.group(2)
+                
+            for file_set in pkg_pn[pn]:
+                for f in file_set:
+                    the_data = make.pkgdata[f]
+                    pv = oe.data.getVar('PV', the_data, 1)
+                    pr = oe.data.getVar('PR', the_data, 1)
+                    if preferred_v == pv and (preferred_r == pr or preferred_r == None):
+                        preferred_file = f
+                        preferred_ver = (pv, pr)
+                        break
+                if preferred_file:
+                    break
+            if preferred_r:
+                pv_str = '%s-%s' % (preferred_v, preferred_r)
+            else:
+                pv_str = preferred_v
+            if preferred_file is None:
+                oe.note("preferred version %s of %s not available" % (pv_str, pn))
+            else:
+                oe.debug(1, "selecting %s as PREFERRED_VERSION %s of package %s" % (preferred_file, pv_str, pn))
+               
+        # get highest priority file set
+        files = pkg_pn[pn][0]
+        latest = None
+        latest_p = 0
+        latest_f = None
+        for f in files:
+            the_data = make.pkgdata[f]
+            pv = oe.data.getVar('PV', the_data, 1)
+            pr = oe.data.getVar('PR', the_data, 1)
+            dp = int(oe.data.getVar('DEFAULT_PREFERENCE', the_data, 1) or "0")
+
+            if (latest is None) or ((latest_p == dp) and (make.vercmp(latest, (pv, pr)) < 0)) or (dp > latest_p):
+                latest = (pv, pr)
+                latest_f = f
+                latest_p = dp
+        if preferred_file is None:
+            preferred_file = latest_f
+            preferred_ver = latest
+            
+        preferred_versions[pn] = (preferred_ver, preferred_file)
+        latest_versions[pn] = (latest, latest_f)
+
+    pkg_list = pkg_pn.keys()
+    pkg_list.sort()
+    
+    for p in pkg_list:
+        pref = preferred_versions[p]
+        latest = latest_versions[p]
+
+        if pref != latest:
+            prefstr = pref[0][0] + "-" + pref[0][1]
+        else:
+            prefstr = ""
+
+        print "%-30s %20s %20s" % (p, latest[0][0] + "-" + latest[0][1],
+                                   prefstr)
+
 def buildPackage(item):
     fn = None
 
@@ -490,7 +590,7 @@ if __name__ == "__main__":
             oepkgs = oe.data.getVar('OEPKGS', make.cfg, 1)
             if oepkgs:
                     pkgs_to_build = oepkgs.split()
-    if not pkgs_to_build:
+    if not pkgs_to_build and not make.options.show_versions:
             print "Nothing to build. Use 'oemake world' to build everything."
             sys.exit(0)
 
@@ -520,8 +620,13 @@ if __name__ == "__main__":
         if make.options.parse_only:
             print "Requested parsing .oe files only.  Exiting."
             sys.exit(0)
+
         build_depgraph()
 
+        if make.options.show_versions:
+            showVersions()
+            sys.exit(0)
+            
         if 'world' in pkgs_to_build:
             pkgs_to_build.remove('world')
             for t in __world_target: