tools/gen-components
changeset 2140 ba3091d7e9b6
parent 1205 6c6c27bcf9ac
child 2150 1acc968ac0d9
equal deleted inserted replaced
2139:127c47823841 2140:ba3091d7e9b6
    17 # fields enclosed by brackets "[]" replaced with your own identifying
    17 # fields enclosed by brackets "[]" replaced with your own identifying
    18 # information: Portions Copyright [yyyy] [name of copyright owner]
    18 # information: Portions Copyright [yyyy] [name of copyright owner]
    19 #
    19 #
    20 # CDDL HEADER END
    20 # CDDL HEADER END
    21 #
    21 #
    22 # Copyright (c) 2012, 2013, Oracle and/or it's affiliates.  All rights reserved.
    22 # Copyright (c) 2012, 2014, Oracle and/or it's affiliates.  All rights reserved.
    23 #
    23 #
    24 #
    24 #
    25 # gen_components
    25 # gen_components
    26 # A simple script to generate (on stdout), the component.html web page 
    26 # A simple script to generate (on stdout), the component.html web page
    27 # found at: http://userland.us.oracle.com/components.html
    27 # found at: http://userland.us.oracle.com/component-lists/s12.html
    28 #
    28 #
    29 
    29 
    30 import getopt
    30 import getopt
    31 import os
    31 import os
    32 import sys
    32 import sys
    33 
    33 
    34 debug = False
    34 debug = False
    35 
       
    36 # TPNO string to search for in each .p5m file.
       
    37 TPNO_str = "com.oracle.info.tpno"
       
    38 
       
    39 # Hashtable of components with TPNOs keyed by component name.
       
    40 comp_TPNOs = {}
       
    41 
    35 
    42 # Hashtable of RE's, RM's and Teams keyed by component path.
    36 # Hashtable of RE's, RM's and Teams keyed by component path.
    43 owners = {}
    37 owners = {}
    44 
    38 
    45 # Initial HTML for the generated web page.
    39 # Initial HTML for the generated web page.
   125         component, re, rm, team = line.split("|")
   119         component, re, rm, team = line.split("|")
   126         owners[component] = [ re, rm, team ]
   120         owners[component] = [ re, rm, team ]
   127 
   121 
   128     return owners
   122     return owners
   129 
   123 
   130 # Return a hashtable of components with TPNOs keyed by component name.
       
   131 def find_TPNOs(workspace):
       
   132     comp_TPNOs = {}
       
   133     for directory, _, files in os.walk(workspace + "/components"):
       
   134         for filename in files:
       
   135             if filename.endswith(".p5m"):
       
   136                 pathname = os.path.join(directory, filename)
       
   137                 fin = open(pathname, 'r')
       
   138                 lines = fin.readlines()
       
   139                 fin.close()
       
   140 
       
   141                 for line in lines:
       
   142                     line = line.replace("\n", "")
       
   143                     n = line.find(TPNO_str)
       
   144                     if n != -1:
       
   145                         tpno_str = line[n:].split("=")[1]
       
   146                         try:
       
   147                             # Check that the TPNO is a valid number.
       
   148                             tpno = int(tpno_str)
       
   149                             if debug:
       
   150                                 print >> sys.stderr, "TPNO: %s: %s" % \
       
   151                                     (directory, tpno_str)
       
   152                             comp_TPNOs[directory] = tpno_str
       
   153                         except:
       
   154                             # Check to see if line end in a "\" character in
       
   155                             # which case, it's an attribute rather than an
       
   156                             # set name action, so extract it a different way.
       
   157                             try:
       
   158                                 n += len(TPNO_str)+1
       
   159                                 tpno_str = line[n:].split()[0]
       
   160                                 # Check that the TPNO is a valid number.
       
   161                                 tpno = int(tpno_str)
       
   162                                 if debug:
       
   163                                     print >> sys.stderr, "TPNO: %s: %s" % \
       
   164                                         (directory, tpno_str)
       
   165 
       
   166                                 # If it's an attribute, there might be more
       
   167                                 # than one TPNO for this component.
       
   168                                 if directory in comp_TPNOs:
       
   169                                     entry = comp_TPNOs[directory]
       
   170                                     tpno_str = "%s,%s" % (entry, tpno_str)
       
   171 
       
   172                                 comp_TPNOs[directory] = tpno_str
       
   173                             except:
       
   174                                 print >> sys.stderr, \
       
   175                                     "Unable to read TPNO: %s" % pathname
       
   176 
       
   177     return(comp_TPNOs)
       
   178 
       
   179 # Return a sorted list of the directories containing one or more .p5m files.
   124 # Return a sorted list of the directories containing one or more .p5m files.
   180 def find_p5m_dirs(workspace):
   125 def find_p5m_dirs(workspace):
   181     p5m_dirs = []
   126     p5m_dirs = []
   182     for dir, _, files in os.walk(workspace + "/components"):
   127     for dir, _, files in os.walk(workspace + "/components"):
   183         for file in files:
   128         for file in files:
   215 # under the components build directory.
   160 # under the components build directory.
   216 def gen_reports(workspace, component_dir):
   161 def gen_reports(workspace, component_dir):
   217     if debug:
   162     if debug:
   218         print >> sys.stderr, "Processing %s" % component_dir
   163         print >> sys.stderr, "Processing %s" % component_dir
   219 
   164 
   220     try:
       
   221         tpno = comp_TPNOs[component_dir]
       
   222     except:
       
   223         tpno = ""
       
   224 
       
   225     re, rm, team = get_owner(component_dir)
   165     re, rm, team = get_owner(component_dir)
   226     makefiles = "-f Makefile -f %s/make-rules/component-report" % workspace
   166     makefiles = "-f Makefile -f %s/make-rules/component-report" % workspace
   227     targets = "clean component-hook"
   167     targets = "clean component-hook"
   228     template = "cd %s; "
   168     template = "cd %s; "
   229     template += "TPNO='%s' "
       
   230     template += "RESPONSIBLE_ENGINEER='%s' "
   169     template += "RESPONSIBLE_ENGINEER='%s' "
   231     template += "RESPONSIBLE_MANAGER='%s' "
   170     template += "RESPONSIBLE_MANAGER='%s' "
   232     template += "TEAM='%s' "
   171     template += "TEAM='%s' "
   233     template += "gmake COMPONENT_HOOK='gmake %s component-report' %s"
   172     template += "gmake COMPONENT_HOOK='gmake %s component-report' %s"
   234     cmd = template % (component_dir, tpno, re, rm, team, makefiles, targets)
   173     cmd = template % (component_dir, re, rm, team, makefiles, targets)
   235 
   174 
   236     if debug:
   175     if debug:
   237         print >> sys.stderr, "gen_reports: command: `%s`" % cmd
   176         print >> sys.stderr, "gen_reports: command: `%s`" % cmd
   238     lines = os.popen(cmd).readlines()
   177     lines = os.popen(cmd).readlines()
   239 
   178 
   297         else:
   236         else:
   298             assert False, "unknown option"
   237             assert False, "unknown option"
   299  
   238  
   300     owners = read_owners(owners_file)
   239     owners = read_owners(owners_file)
   301     write_preamble()
   240     write_preamble()
   302     comp_TPNOs = find_TPNOs(workspace)
       
   303     p5m_dirs = find_p5m_dirs(workspace)
   241     p5m_dirs = find_p5m_dirs(workspace)
   304     for p5m_dir in p5m_dirs:
   242     for p5m_dir in p5m_dirs:
   305         gen_reports(workspace, p5m_dir)
   243         gen_reports(workspace, p5m_dir)
   306     write_reports(p5m_dirs, owners_file)
   244     write_reports(p5m_dirs, owners_file)
   307     write_postamble()
   245     write_postamble()