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'>
100 # Final HTML for the generated web page.
109 # Return a hashtable of RE's, RM's and Teams keyed by component path.
110 def read_owners(owners_file
):
112 print >> sys
.stderr
, "Reading %s" % owners_file
114 fin
= open(owners_file
, 'r')
115 lines
= fin
.readlines()
119 print >> sys
.stderr
, "Unable to read owners file: %s" % owners_file
124 component
, re
, rm
, team
= line
.split("|")
125 owners
[component
] = [ re
, rm
, team
]
129 # Return a hashtable of components with TPNOs keyed by component name.
130 def find_TPNOs(workspace
):
132 for directory
, _
, files
in os
.walk(workspace
+ "/components"):
133 for filename
in files
:
134 if filename
.endswith(".p5m"):
135 pathname
= os
.path
.join(directory
, filename
)
136 fin
= open(pathname
, 'r')
137 lines
= fin
.readlines()
141 line
= line
.replace("\n", "")
142 n
= line
.find(TPNO_str
)
144 tpno_str
= line
[n
:].split("=")[1]
146 # Check that the TPNO is a valid number.
149 print >> sys
.stderr
, "TPNO: %s: %s" % \
150 (directory
, tpno_str
)
151 comp_TPNOs
[directory
] = tpno_str
153 # Check to see if line end in a "\" character in
154 # which case, it's an attribute rather than an
155 # set name action, so extract it a different way.
158 tpno_str
= line
[n
:].split()[0]
159 # Check that the TPNO is a valid number.
162 print >> sys
.stderr
, "TPNO: %s: %s" % \
163 (directory
, tpno_str
)
165 # If it's an attribute, there might be more
166 # than one TPNO for this component.
167 if directory
in comp_TPNOs
:
168 entry
= comp_TPNOs
[directory
]
169 tpno_str
= "%s,%s" % (entry
, tpno_str
)
171 comp_TPNOs
[directory
] = tpno_str
173 print >> sys
.stderr
, \
174 "Unable to read TPNO: %s" % pathname
178 # Return a sorted list of the directories containing one or more .p5m files.
179 def find_p5m_dirs(workspace
):
181 for dir, _
, files
in os
.walk(workspace
+ "/components"):
183 if file.endswith(".p5m"):
186 return sorted(list(set(p5m_dirs
)))
188 # Write out the initial HTML for the components.html web page.
189 def write_preamble():
192 # Return the RE, RM and Team for this component.
193 def get_owner(p5m_dir
):
194 result
= [ "Unknown", "Unknown", "Unknown" ]
197 tokens
= p5m_dir
.split("/")
200 component_path
+= token
+ "/"
201 if token
== "components":
203 component_path
= component_path
[:-1]
204 if component_path
in owners
:
205 result
= owners
[component_path
]
207 print >> sys
.stderr
, "Component path: ", component_path
,
208 print >> sys
.stderr
, "RE, RM, Team: ", result
212 # Generate an HTML table entry for all the information for the component
213 # in the given directory. This generates a file called 'component-report'
214 # under the components build directory.
215 def gen_reports(workspace
, component_dir
):
217 print >> sys
.stderr
, "Processing %s" % component_dir
220 tpno
= comp_TPNOs
[component_dir
]
224 re
, rm
, team
= get_owner(component_dir
)
225 makefiles
= "-f Makefile -f %s/make-rules/component-report" % workspace
226 targets
= "clean component-hook"
228 template
+= "TPNO='%s' "
229 template
+= "RESPONSIBLE_ENGINEER='%s' "
230 template
+= "RESPONSIBLE_MANAGER='%s' "
231 template
+= "TEAM='%s' "
232 template
+= "gmake COMPONENT_HOOK='gmake %s component-report' %s"
233 cmd
= template
% (component_dir
, tpno
, re
, rm
, team
, makefiles
, targets
)
236 print >> sys
.stderr
, "gen_reports: command: `%s`" % cmd
237 lines
= os
.popen(cmd
).readlines()
239 # Collect all the .../build/component-report files and write them to stdout.
240 def write_reports(p5m_dirs
, owners_file
):
241 for p5m_dir
in p5m_dirs
:
242 report
= "%s/build/component-report" % p5m_dir
244 print >> sys
.stderr
, "Reading %s" % report
246 fin
= open(report
, 'r')
247 lines
= fin
.readlines()
249 sys
.stdout
.writelines(lines
)
252 print >> sys
.stderr
, "Unable to read: %s" % report
254 # Write out the final HTML for the components.html web page.
255 def write_postamble():
258 # Write out a usage message showing valid options to this script.
260 print >> sys
.stderr
, \
263 gen-components [OPTION...]
269 Location of a file containing a list of RE's /RM's per component
272 Location of the Userland workspace
278 if __name__
== "__main__":
279 workspace
= os
.getenv('WS_TOP')
280 owners_file
= "/net/userland.us.oracle.com/gates/private/RE-RM-list.txt"
283 opts
, args
= getopt
.getopt(sys
.argv
[1:], "do:w:",
284 [ "debug", "owners=", "workspace=" ])
285 except getopt
.GetoptError
, err
:
289 for opt
, arg
in opts
:
290 if opt
in [ "-d", "--debug" ]:
292 elif opt
in [ "-o", "--owners" ]:
294 elif opt
in [ "-w", "--workspace" ]:
297 assert False, "unknown option"
299 owners
= read_owners(owners_file
)
301 comp_TPNOs
= find_TPNOs(workspace
)
302 p5m_dirs
= find_p5m_dirs(workspace
)
303 for p5m_dir
in p5m_dirs
:
304 gen_reports(workspace
, p5m_dir
)
305 write_reports(p5m_dirs
, owners_file
)