5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
22 # Copyright (c) 2012, 2013, Oracle and/or it's affiliates. All rights reserved.
26 # A simple script to generate (on stdout), the component.html web page
27 # found at: http://userland.us.oracle.com/components.html
36 # TPNO string to search for in each .p5m file.
37 TPNO_str
= "com.oracle.info.tpno"
39 # Hashtable of components with TPNOs keyed by component name.
42 # Hashtable of RE's, RM's and Teams keyed by component path.
45 # Initial HTML for the generated web page.
49 <style type='text/css' media='screen'>
50 @import '/css/demo_table.css';
51 @import '/css/ColVis.css';
52 @import '/css/ColReorder.css';
54 tr.even:hover, tr.even:hover td.sorting_1 ,
55 tr.odd:hover, tr.odd:hover td.sorting_1 {
56 background-color: gold;
60 <script type='text/javascript' src='js/jquery.js'></script>
61 <script type='text/javascript' src='js/jquery.dataTables.js'></script>
62 <script type='text/javascript' src='js/ColReorder.js'></script>
63 <script type='text/javascript' src='js/ColVis.js'></script>
66 $(document).ready(function() {
67 $('#components').dataTable({
68 "sDom": 'C<"clear">Rlfrtip',
73 aLengthMenu: [ [ 10, 50, -1], [ 10, 50, 'All'] ]
80 <h1>Userland Components</h1>
82 <table align='center' id='components'>
101 # Final HTML for the generated web page.
110 # Return a hashtable of RE's, RM's and Teams keyed by component path.
111 def read_owners(owners_file
):
113 print >> sys
.stderr
, "Reading %s" % owners_file
115 fin
= open(owners_file
, 'r')
116 lines
= fin
.readlines()
120 print >> sys
.stderr
, "Unable to read owners file: %s" % owners_file
125 component
, re
, rm
, team
= line
.split("|")
126 owners
[component
] = [ re
, rm
, team
]
130 # Return a hashtable of components with TPNOs keyed by component name.
131 def find_TPNOs(workspace
):
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()
142 line
= line
.replace("\n", "")
143 n
= line
.find(TPNO_str
)
145 tpno_str
= line
[n
:].split("=")[1]
147 # Check that the TPNO is a valid number.
150 print >> sys
.stderr
, "TPNO: %s: %s" % \
151 (directory
, tpno_str
)
152 comp_TPNOs
[directory
] = tpno_str
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.
159 tpno_str
= line
[n
:].split()[0]
160 # Check that the TPNO is a valid number.
163 print >> sys
.stderr
, "TPNO: %s: %s" % \
164 (directory
, tpno_str
)
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
)
172 comp_TPNOs
[directory
] = tpno_str
174 print >> sys
.stderr
, \
175 "Unable to read TPNO: %s" % pathname
179 # Return a sorted list of the directories containing one or more .p5m files.
180 def find_p5m_dirs(workspace
):
182 for dir, _
, files
in os
.walk(workspace
+ "/components"):
184 if file.endswith(".p5m"):
187 return sorted(list(set(p5m_dirs
)))
189 # Write out the initial HTML for the components.html web page.
190 def write_preamble():
193 # Return the RE, RM and Team for this component.
194 def get_owner(p5m_dir
):
195 result
= [ "Unknown", "Unknown", "Unknown" ]
198 tokens
= p5m_dir
.split("/")
201 component_path
+= token
+ "/"
202 if token
== "components":
204 component_path
= component_path
[:-1]
205 if component_path
in owners
:
206 result
= owners
[component_path
]
208 print >> sys
.stderr
, "Component path: ", component_path
,
209 print >> sys
.stderr
, "RE, RM, Team: ", result
213 # Generate an HTML table entry for all the information for the component
214 # in the given directory. This generates a file called 'component-report'
215 # under the components build directory.
216 def gen_reports(workspace
, component_dir
):
218 print >> sys
.stderr
, "Processing %s" % component_dir
221 tpno
= comp_TPNOs
[component_dir
]
225 re
, rm
, team
= get_owner(component_dir
)
226 makefiles
= "-f Makefile -f %s/make-rules/component-report" % workspace
227 targets
= "clean component-hook"
229 template
+= "TPNO='%s' "
230 template
+= "RESPONSIBLE_ENGINEER='%s' "
231 template
+= "RESPONSIBLE_MANAGER='%s' "
232 template
+= "TEAM='%s' "
233 template
+= "gmake COMPONENT_HOOK='gmake %s component-report' %s"
234 cmd
= template
% (component_dir
, tpno
, re
, rm
, team
, makefiles
, targets
)
237 print >> sys
.stderr
, "gen_reports: command: `%s`" % cmd
238 lines
= os
.popen(cmd
).readlines()
240 # Collect all the .../build/component-report files and write them to stdout.
241 def write_reports(p5m_dirs
, owners_file
):
242 for p5m_dir
in p5m_dirs
:
243 report
= "%s/build/component-report" % p5m_dir
245 print >> sys
.stderr
, "Reading %s" % report
247 fin
= open(report
, 'r')
248 lines
= fin
.readlines()
250 sys
.stdout
.writelines(lines
)
253 print >> sys
.stderr
, "Unable to read: %s" % report
255 # Write out the final HTML for the components.html web page.
256 def write_postamble():
259 # Write out a usage message showing valid options to this script.
261 print >> sys
.stderr
, \
264 gen-components [OPTION...]
270 Location of a file containing a list of RE's /RM's per component
273 Location of the Userland workspace
279 if __name__
== "__main__":
280 workspace
= os
.getenv('WS_TOP')
281 owners_file
= "/net/userland.us.oracle.com/gates/private/RE-RM-list.txt"
284 opts
, args
= getopt
.getopt(sys
.argv
[1:], "do:w:",
285 [ "debug", "owners=", "workspace=" ])
286 except getopt
.GetoptError
, err
:
290 for opt
, arg
in opts
:
291 if opt
in [ "-d", "--debug" ]:
293 elif opt
in [ "-o", "--owners" ]:
295 elif opt
in [ "-w", "--workspace" ]:
298 assert False, "unknown option"
300 owners
= read_owners(owners_file
)
302 comp_TPNOs
= find_TPNOs(workspace
)
303 p5m_dirs
= find_p5m_dirs(workspace
)
304 for p5m_dir
in p5m_dirs
:
305 gen_reports(workspace
, p5m_dir
)
306 write_reports(p5m_dirs
, owners_file
)