| | |
| | | # |
| | | # CDDL HEADER END |
| | | # |
| | | # Copyright (c) 2012, Oracle and/or it's affiliates. All rights reserved. |
| | | # Copyright (c) 2012, 2013, Oracle and/or it's affiliates. All rights reserved. |
| | | # |
| | | # |
| | | # gen_components.py |
| | | # A simple program to generate (on stdout) the component.html web page |
| | | # gen_components |
| | | # A simple script to generate (on stdout), the component.html web page |
| | | # found at: http://userland.us.oracle.com/components.html |
| | | # |
| | | |
| | |
| | | |
| | | debug = False |
| | | |
| | | # Hashtable of RE's / RM's keyed by component path. |
| | | # TPNO string to search for in each .p5m file. |
| | | TPNO_str = "com.oracle.info.tpno" |
| | | |
| | | # Hashtable of components with TPNOs keyed by component name. |
| | | comp_TPNOs = {} |
| | | |
| | | # Hashtable of RE's, RM's and Teams keyed by component path. |
| | | owners = {} |
| | | |
| | | # Initial HTML for the generated web page. |
| | |
| | | <th>Package(s)</th> |
| | | <th>ARC Case(s)</th> |
| | | <th>License(s)</th> |
| | | <th>TPNO</th> |
| | | <th>RE</th> |
| | | <th>RM</th> |
| | | <th>Team</th> |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | |
| | | </html> |
| | | """ |
| | | |
| | | # Return a hashtable of RE's / RM's keyed by component path. |
| | | # Return a hashtable of RE's, RM's and Teams keyed by component path. |
| | | def read_owners(owners_file): |
| | | if debug: |
| | | print >> sys.stderr, "Reading %s" % owners_file |
| | |
| | | owners = {} |
| | | for line in lines: |
| | | line = line[:-1] |
| | | component, re, rm = line.split("|") |
| | | owners[component] = [ re, rm ] |
| | | component, re, rm, team = line.split("|") |
| | | owners[component] = [ re, rm, team ] |
| | | |
| | | return owners |
| | | |
| | | # Return a hashtable of components with TPNOs keyed by component name. |
| | | def find_TPNOs(workspace): |
| | | comp_TPNOs = {} |
| | | for directory, _, files in os.walk(workspace + "/components"): |
| | | for filename in files: |
| | | if filename.endswith(".p5m"): |
| | | pathname = os.path.join(directory, filename) |
| | | fin = open(pathname, 'r') |
| | | lines = fin.readlines() |
| | | fin.close() |
| | | |
| | | for line in lines: |
| | | line = line.replace("\n", "") |
| | | n = line.find(TPNO_str) |
| | | if n != -1: |
| | | tpno_str = line[n:].split("=")[1] |
| | | try: |
| | | # Check that the TPNO is a valid number. |
| | | tpno = int(tpno_str) |
| | | if debug: |
| | | print >> sys.stderr, "TPNO: %s: %s" % \ |
| | | (directory, tpno_str) |
| | | comp_TPNOs[directory] = tpno_str |
| | | except: |
| | | # Check to see if line end in a "\" character in |
| | | # which case, it's an attribute rather than an |
| | | # set name action, so extract it a different way. |
| | | try: |
| | | n += len(TPNO_str)+1 |
| | | tpno_str = line[n:].split()[0] |
| | | # Check that the TPNO is a valid number. |
| | | tpno = int(tpno_str) |
| | | if debug: |
| | | print >> sys.stderr, "TPNO: %s: %s" % \ |
| | | (directory, tpno_str) |
| | | |
| | | # If it's an attribute, there might be more |
| | | # than one TPNO for this component. |
| | | if directory in comp_TPNOs: |
| | | entry = comp_TPNOs[directory] |
| | | tpno_str = "%s,%s" % (entry, tpno_str) |
| | | |
| | | comp_TPNOs[directory] = tpno_str |
| | | except: |
| | | print >> sys.stderr, \ |
| | | "Unable to read TPNO: %s" % pathname |
| | | |
| | | return(comp_TPNOs) |
| | | |
| | | # Return a sorted list of the directories containing one or more .p5m files. |
| | | def find_p5m_dirs(workspace): |
| | |
| | | def write_preamble(): |
| | | print preamble |
| | | |
| | | # Return the RE / RM for this component. |
| | | def get_re_and_rm(p5m_dir): |
| | | re_and_rm = [ "Unknown", "Unknown" ] |
| | | # Return the RE, RM and Team for this component. |
| | | def get_owner(p5m_dir): |
| | | result = [ "Unknown", "Unknown", "Unknown" ] |
| | | component_path = "" |
| | | started = False |
| | | tokens = p5m_dir.split("/") |
| | |
| | | started = True |
| | | component_path = component_path[:-1] |
| | | if component_path in owners: |
| | | re_and_rm = owners[component_path] |
| | | result = owners[component_path] |
| | | if debug: |
| | | print >> sys.stderr, "Component path: ", component_path, |
| | | print >> sys.stderr, "RE / RM: ", re_and_rm |
| | | print >> sys.stderr, "RE, RM, Team: ", result |
| | | |
| | | return re_and_rm |
| | | return result |
| | | |
| | | # Generate an HTML table entry for all the information for the component |
| | | # in the given directory. This generates a file called 'component-report' |
| | |
| | | if debug: |
| | | print >> sys.stderr, "Processing %s" % component_dir |
| | | |
| | | re, rm = get_re_and_rm(component_dir) |
| | | try: |
| | | tpno = comp_TPNOs[component_dir] |
| | | except: |
| | | tpno = "" |
| | | |
| | | re, rm, team = get_owner(component_dir) |
| | | makefiles = "-f Makefile -f %s/make-rules/component-report" % workspace |
| | | targets = "clean component-hook" |
| | | cmd = "cd %s; RESPONSIBLE_ENGINEER='%s' RESPONSIBLE_MANAGER='%s' gmake COMPONENT_HOOK='gmake %s component-report' %s" % \ |
| | | (component_dir, re, rm, makefiles, targets) |
| | | template = "cd %s; " |
| | | template += "TPNO='%s' " |
| | | template += "RESPONSIBLE_ENGINEER='%s' " |
| | | template += "RESPONSIBLE_MANAGER='%s' " |
| | | template += "TEAM='%s' " |
| | | template += "gmake COMPONENT_HOOK='gmake %s component-report' %s" |
| | | cmd = template % (component_dir, tpno, re, rm, team, makefiles, targets) |
| | | |
| | | if debug: |
| | | print >> sys.stderr, "gen_reports: command: `%s`" % cmd |
| | |
| | | print >> sys.stderr, \ |
| | | """ |
| | | Usage: |
| | | update_man_pages.py [OPTION...] |
| | | gen-components [OPTION...] |
| | | |
| | | -d, --debug |
| | | Turn on debugging |
| | |
| | | |
| | | if __name__ == "__main__": |
| | | workspace = os.getenv('WS_TOP') |
| | | owners_file = "/net/userland.us.oracle.com/gates/private/RM-RE-list.txt" |
| | | owners_file = "/net/userland.us.oracle.com/gates/private/RE-RM-list.txt" |
| | | |
| | | try: |
| | | opts, args = getopt.getopt(sys.argv[1:], "do:w:", |
| | |
| | | |
| | | owners = read_owners(owners_file) |
| | | write_preamble() |
| | | comp_TPNOs = find_TPNOs(workspace) |
| | | p5m_dirs = find_p5m_dirs(workspace) |
| | | for p5m_dir in p5m_dirs: |
| | | gen_reports(workspace, p5m_dir) |