|
1 # Copyright (c) 2009 Symbian Foundation Ltd |
|
2 # This component and the accompanying materials are made available |
|
3 # under the terms of the License "Eclipse Public License v1.0" |
|
4 # which accompanies this distribution, and is available |
|
5 # at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
6 # |
|
7 # Initial Contributors: |
|
8 # Symbian Foundation Ltd - initial contribution. |
|
9 # |
|
10 # Contributors: |
|
11 # Arnaud Lenoir |
|
12 # |
|
13 # Description: |
|
14 # Task 243 - Generate FCLs details between 2 PDKs to be included as part of the release notes |
|
15 |
|
16 # Here is the location for the naming convention for the PDKs: http://developer.symbian.org/wiki/index.php/Build_and_Integration |
|
17 |
|
18 # |
|
19 # Configuration data and constants for the script |
|
20 # |
|
21 print "\n"; |
|
22 my $default_pdk_loc='\\\\bishare\\releases\\'; |
|
23 print "default_pdk_loc=$default_pdk_loc\n"; |
|
24 |
|
25 # Nb of arguments to be passed to the script to work. If that need to change, just modify nb_arg_to_pass! |
|
26 my $nb_arg_to_pass=2; |
|
27 print "nb_arg_to_pass=$nb_arg_to_pass\n"; |
|
28 |
|
29 # Name of the file that contains the data we need to extract for this script |
|
30 my $build_bom_zip_file_to_extract="build_BOM\.zip"; |
|
31 my $build_logs_zip_file_to_extract="build_logs\.zip"; |
|
32 |
|
33 # Name of the file we need to work on to extract the data necessary for the Release Notes from build_BOM.zip |
|
34 my $name_of_file_to_compare="build-info\.xml"; |
|
35 |
|
36 # File used to extract path and component name for a package from build_logs.zip |
|
37 my $pckg_extraction_data_file_name = "PkgComponentAnalysisSummary\.csv"; |
|
38 |
|
39 |
|
40 # When using the script as part of the build system, we don't have access to the zip files yet, therefore we need to have a look for the file directly |
|
41 # This is working only when using pdkloc2 only. In any other cases we are not bothered!!!!! |
|
42 my $bom_dir="BOM"; |
|
43 my $analysis_dir="analysis"; |
|
44 |
|
45 # Pattern used to search for PDKs |
|
46 my $pdk_start_pattern="PDK_"; |
|
47 |
|
48 # Pattern used to extract info from the xml file |
|
49 my $starting_pattern_for_xml_extraction="<name>Sources</name>"; |
|
50 my $ending_pattern_for_xml_extraction="</project>"; |
|
51 # Pattern to extract data from the line in the file |
|
52 # Branch type. If not a branch type, we are not interested |
|
53 my $branch_type_extraction_pattern="(MCL|FCL)"; |
|
54 |
|
55 my $mcl_cste="MCL"; |
|
56 my $fcl_cste="FCL"; |
|
57 |
|
58 # package name |
|
59 #/imgeditor/#:86a88f39b644</baseline> |
|
60 # # is used to define the changeset number for mercurial. |
|
61 # Therefore if we have a look what is before "/#", we should always find the package name!! |
|
62 my $package_extraction_pattern = "([^/]+)/?#"; |
|
63 |
|
64 # When that "boolean value is set to 1 or true, then the line we read in the file can be search for the information we want to extract |
|
65 # If $starting_pattern_for_xml_extraction true, then set extraction_from_xml_is_allowed to true/1 |
|
66 # If $ending_pattern_for_xml_extraction false, then reset extraction_from_xml_is_allowed to false/0 |
|
67 # $ending_pattern_for_xml_extraction is called several times in the program, but this is not a problem as we don't set it to false/0 and therefore do nothing! |
|
68 my $extraction_from_xml_is_allowed=0; |
|
69 |
|
70 # Temporary location used to do the work |
|
71 my $working_drive="c:"; |
|
72 my $working_directory="temp"; |
|
73 my $working_sub_directory="fcl_extraction"; |
|
74 my $working_pdk1_directory="pdk1"; |
|
75 my $working_pdk2_directory="pdk2"; |
|
76 |
|
77 # Name of the file that we are creating to hold the information necessary for the Release Notes |
|
78 my $name_of_file_to_publish="releaseNotes.wiki.txt"; |
|
79 #Location for that file |
|
80 # This values need to be overwritten!!! |
|
81 my $location_of_file_to_publish="c:\\temp"; |
|
82 my $path_to_file_to_publish="$location_of_file_to_publish\\$name_of_file_to_publish"; |
|
83 |
|
84 # |
|
85 # End configuration data for the script |
|
86 # |
|
87 |
|
88 |
|
89 # Get parameters passed to the script. Save only the 2 first parameters as we need only 2 parameters for the script |
|
90 print "\n"; |
|
91 my $nb_arg_passed = scalar(@ARGV); |
|
92 print "nb_arg_passed=$nb_arg_passed\n"; # Find out the number of arguement passed |
|
93 print "@ARGV\n\n"; |
|
94 # Needs to be done here, otherwise lost if try to recover them later on. Why? |
|
95 my $arg1_passed = $ARGV[0]; |
|
96 my $arg2_passed = $ARGV[1]; |
|
97 print "arg1_passed= $arg1_passed \t arg2_passed=$arg2_passed\n"; |
|
98 |
|
99 # if enter help as unique argument, then we will launch the help becaue we only pass one argument. |
|
100 if ($nb_arg_passed != $nb_arg_to_pass) |
|
101 { |
|
102 helpme(); |
|
103 } |
|
104 |
|
105 # Modules necessary to run this script |
|
106 use Getopt::Long; |
|
107 use strict; |
|
108 |
|
109 |
|
110 # Arguments / Data used for the script |
|
111 my $pdknb1 = ''; |
|
112 my $pdknb2 = ''; |
|
113 my $pdkloc1 = ''; |
|
114 my $pdkloc2 = ''; |
|
115 my $pdkname1 = ''; |
|
116 my $pdkname2 = ''; |
|
117 |
|
118 my $help = 0; |
|
119 |
|
120 GetOptions(( |
|
121 'pdknb1=s' => \$pdknb1, |
|
122 'pdknb2=s' => \$pdknb2, |
|
123 'pdkname1=s' => \$pdkname1, |
|
124 'pdkname2=s' => \$pdkname2, |
|
125 'pdkloc1=s' => \$pdkloc1, |
|
126 'pdkloc2=s' => \$pdkloc2, |
|
127 'help!' => \$help # Not working |
|
128 )); |
|
129 |
|
130 print "\pdknb1=$pdknb1\n"; |
|
131 print "\pdknb2=$pdknb2\n"; |
|
132 print "\pdkname1=$pdkname1\n"; |
|
133 print "\pdkname2=$pdkname2\n"; |
|
134 print "\pdkloc1=$pdkloc1\n"; |
|
135 print "\pdkloc2=$pdkloc2\n"; |
|
136 print "\help=$help\n"; |
|
137 |
|
138 my $count_arg=0; # Caculate the number of arguments we need for the script to work and that we know are correct (help doesn't count) |
|
139 |
|
140 # First PDK to check |
|
141 my $pdk_path1=""; |
|
142 my $pdk_complete_name1=0; |
|
143 my $pdk_complete_path1=0; |
|
144 my $pdk_path1_now_in_use=0; |
|
145 my $pdk_values_to_search1=""; # Not necessary |
|
146 my $pdk_path1_exist=0; |
|
147 my $pdk_zip1_exit=0; # Not necessary |
|
148 my $pdk1_correct_name_to_use=""; |
|
149 my $loc1_contains_the_zip_file_we_need=0; |
|
150 |
|
151 # Second PDK to check |
|
152 my $pdk_path2=""; |
|
153 my $pdk_complete_name2=0; |
|
154 my $pdk_complete_path2=0; |
|
155 my $pdk_path2_now_in_use=0; |
|
156 my $pdk_values_to_search2=""; # Not necessary |
|
157 my $pdk_path2_exist=0; |
|
158 my $pdk_zip2_exist=0; # Not necessary |
|
159 my $pdk2_correct_name_to_use=""; |
|
160 my $loc2_contains_the_zip_file_we_need=0; # Used to indicate that we have found the build_BOM.zip file |
|
161 my $loc2_contains_the_xml_csv_files_we_need=0; # Used to indicate that we have found the build-info.xml and PkgComponentAnalysisSummary.csv |
|
162 my $nb_of_xml_csv_files_we_need=2; # Used to define the number of files we need to have a look at when we are not looking for zip files. |
|
163 my $nb_of_zip_files_we_need=2; # Used to define the number of files we need to have a look at when we are looking for zip files. |
|
164 |
|
165 # Default directory management |
|
166 my @directories_list_default_location=(); |
|
167 my $nb_dir_in_default_loc; |
|
168 my @pdk_dir_list_in_default_location=(); |
|
169 my $nb_pdks_in_default_loc=0; |
|
170 my @pdks_with_valid_zip_in_default_loc=(); |
|
171 my $nb_pdks_with_valid_zip_in_default_loc=0; |
|
172 my @find_pdk_for_corresponding_nb1=(); |
|
173 my $nb_of_pdk_for_corresponding_nb1=0; |
|
174 my @find_pdk_for_corresponding_nb2=(); |
|
175 my $nb_of_pdk_for_corresponding_nb2=0; |
|
176 my @find_pdk_for_corresponding_name1=(); |
|
177 my $nb_of_pdk_for_corresponding_name1=0; |
|
178 my @find_pdk_for_corresponding_name2=(); |
|
179 my $nb_of_pdk_for_corresponding_name2=0; |
|
180 my @read_files_in_loc=(); |
|
181 |
|
182 # Data / statistics to be displayed in the release notes |
|
183 # We consider that pdk1 is the old version and pdk2 is the new version. |
|
184 # Note that for the moment, the scripts is not able to make sure that the old version of the pdk is set as pdk1 and the new version of the pdk is set as pdk2!!!!! |
|
185 # Can be done for pdknb and pdkname but not for pdkloc as for the moment, no way to find out the pdk version from the build-info.xmL!!!! |
|
186 # Totals |
|
187 my $total_packages_pdk1=0; # Nb of packages included in the pdk1 |
|
188 my $total_packages_pdk2=0; # Nb of packages included in the pdk2 |
|
189 my $total_packages_added=0; # Nb of packages added in the pdk2 |
|
190 my $total_packages_removed=0; # Nb of packages removed from the pdk2 |
|
191 my $total_new_fcl=0; # Nb of packages that are now on fcl in pdk2 (means were mcl in pdk1 and are now fcl in pdk2) |
|
192 my $total_no_more_fcl=0; # Nb of packages that are no more on fcl in pdk2 (means were fcl in pdk1 and are now mcl in pdk2) |
|
193 my $total_still_fcl=0; # Nb of packages that are still on fcl in pdk2 (means were fcl in pdk1 and are still fcl in pdk2) |
|
194 my $total_very_good_mcl=0; # Nb of packages that are very good on mcl in pdk1 and pdk2 (means were on mcl in pdk1 and are still mcl in pdk2) |
|
195 # Tables |
|
196 my @pdk1_sorting_table; # Table for pdk1 that is used to sort out and compare the 2 pdks |
|
197 my @pdk2_sorting_table; # Table for pdk2 that is used to sort out and compare the 2 pdks |
|
198 my @packages_added_table; # Table that contains the packages that have been added to pdk2 |
|
199 my @packages_removed_table; # Table that contains the packages that have been deleted from pdk2 |
|
200 my @new_fcl_table; # Table containing the packages that are now on fcl in pdk2 (means were mcl in pdk1 and are now fcl in pdk2) |
|
201 my @no_more_fcl_table; # Table containing the packages that are no more on fcl in pdk2 (means were fcl in pdk1 and are now mcl in pdk2) |
|
202 my @still_fcl_table; # Table containing the packages that are still on fcl in pdk2 (means were fcl in pdk1 and are still fcl in pdk2) |
|
203 my @very_good_mcl_table; # Table containing the packages that are very good on mcl in pdk1 and pdk2 (means were on mcl in pdk1 and are still mcl in pdk2) |
|
204 my %pckg_path_name_array; # Table containing the path for each packages |
|
205 my %pckg_name_array; # Table containing the real meaning name for each packages, not the name of the package in the directory structure |
|
206 |
|
207 # Check that we have only 2 values for the PDKs. If not 2, then not good! |
|
208 |
|
209 |
|
210 # Script code start here! |
|
211 if($pdknb1) |
|
212 { |
|
213 $count_arg++; |
|
214 |
|
215 # Get data for first pdk used for the comparison |
|
216 $pdk_path1 = $default_pdk_loc; |
|
217 $pdk_complete_name1=1; |
|
218 $pdk_complete_path1=1; |
|
219 $pdk_path1_now_in_use=1; |
|
220 $pdk_values_to_search1=$pdknb1; # Not necessary |
|
221 } |
|
222 if($pdknb2) |
|
223 { |
|
224 $count_arg++; |
|
225 |
|
226 # Get data for first pdk used for the comparison |
|
227 $pdk_path2 = $default_pdk_loc; |
|
228 $pdk_complete_name2=1; |
|
229 $pdk_complete_path2=1; |
|
230 $pdk_path2_now_in_use=1; |
|
231 $pdk_values_to_search2=$pdknb2; # Not necessary |
|
232 } |
|
233 if($pdkname1) |
|
234 { |
|
235 $count_arg++; |
|
236 |
|
237 if(!$pdk_path1_now_in_use) |
|
238 { |
|
239 # Get data for first pdk used for the comparison |
|
240 $pdk_path1 = $default_pdk_loc; |
|
241 $pdk_complete_path1=1; |
|
242 $pdk_path1_now_in_use=1; |
|
243 $pdk_values_to_search1=$pdkname1; # Not necessary |
|
244 } |
|
245 else |
|
246 { |
|
247 print "You are a bad boy!!!!, you can't enter 2 parameters ending with the same number like pdknb1 and pdkname1! Start again with the right parameters!\n"; |
|
248 exit(0); |
|
249 } |
|
250 } |
|
251 if($pdkname2) |
|
252 { |
|
253 $count_arg++; |
|
254 |
|
255 if(!$pdk_path2_now_in_use) |
|
256 { |
|
257 # Get data for first pdk used for the comparison |
|
258 $pdk_path2 = $default_pdk_loc; |
|
259 $pdk_complete_path2=1; |
|
260 $pdk_path2_now_in_use=1; |
|
261 $pdk_values_to_search2=$pdkname2; # Not necessary |
|
262 } |
|
263 else |
|
264 { |
|
265 print "You are a bad boy!!!!, you can't enter 2 parameters ending with the same number like pdknb2 and pdkname2! Start again with the right parameters!\n"; |
|
266 exit(0); |
|
267 } |
|
268 } |
|
269 if($pdkloc1) |
|
270 { |
|
271 $count_arg++; |
|
272 |
|
273 if(!$pdk_path1_now_in_use) |
|
274 { |
|
275 # Get data for first pdk used for the comparison |
|
276 $pdk_path1 = $pdkloc1; |
|
277 $pdk_path1_now_in_use=1; |
|
278 } |
|
279 else |
|
280 { |
|
281 print "You are a bad boy!!!!, you can't enter 2 parameters ending with the same number like pdknb1 and pdkloc1! Start again with the right parameters!\n"; |
|
282 exit(0); |
|
283 } |
|
284 } |
|
285 |
|
286 if($pdkloc2) |
|
287 { |
|
288 $count_arg++; |
|
289 |
|
290 if(!$pdk_path2_now_in_use) |
|
291 { |
|
292 # Get data for first pdk used for the comparison |
|
293 $pdk_path2 = $pdkloc2; |
|
294 $pdk_path2_now_in_use=1; |
|
295 } |
|
296 else |
|
297 { |
|
298 print "You are a bad boy!!!!, you can't enter 2 parameters ending with the same number like pdknb2 and pdkloc2! Start again with the right parameters!\n"; |
|
299 exit(0); |
|
300 } |
|
301 } |
|
302 |
|
303 print "count_arg=$count_arg\n"; |
|
304 |
|
305 |
|
306 # If no parameters entered or help selected, display help |
|
307 if ($count_arg != $nb_arg_to_pass) |
|
308 { |
|
309 #$help = 1; |
|
310 helpme(); |
|
311 print"\nThe script accepts $nb_arg_to_pass parameters only!\n\n"; |
|
312 } |
|
313 |
|
314 |
|
315 # |
|
316 # If we reach this point, this means that we have the right numbers of arguments passed to the script. |
|
317 # |
|
318 print "\nWe are on the right path!!!!\n"; |
|
319 |
|
320 print "pdk_path1=$pdk_path1\n"; |
|
321 print "pdk_complete_name1=$pdk_complete_name1\n"; |
|
322 print "pdk_complete_path1=$pdk_complete_path1\n"; |
|
323 print "pdk_values_to_search1=$pdk_values_to_search1\n"; # Not necessary |
|
324 print "\n"; |
|
325 print "pdk_path2=$pdk_path2\n"; |
|
326 print "pdk_complete_name2=$pdk_complete_name2\n"; |
|
327 print "pdk_complete_path2=$pdk_complete_path2\n"; |
|
328 print "pdk_values_to_search2=$pdk_values_to_search2\n"; # Not necessary |
|
329 print "\n\n"; |
|
330 |
|
331 # Get directory listing of all directories in the default location $default_pdk_loc |
|
332 extract_dir_default_loc(); |
|
333 extract_pdk_in_default_loc(); |
|
334 extract_pdk_with_valid_zip_in_default_loc(); |
|
335 |
|
336 # Compose path if necessary. |
|
337 print "\n"; |
|
338 |
|
339 my $find_val=0; |
|
340 |
|
341 if ($pdk_complete_path1) |
|
342 { |
|
343 if ($pdk_complete_name1) |
|
344 { |
|
345 print "We have the PDK number, we need to define if possible the PDK name and therefore the path to the PDK\n"; |
|
346 # Have a look in the default directory if there is a PDK with that number. If none or more than one with the same id, returns the list of PDKs with that same number |
|
347 foreach $find_val (@pdks_with_valid_zip_in_default_loc) |
|
348 { |
|
349 #print $find_val, "\n"; |
|
350 if($find_val =~ /$pdknb1/i) |
|
351 { |
|
352 $find_pdk_for_corresponding_nb1[$nb_of_pdk_for_corresponding_nb1++]=$find_val; |
|
353 } |
|
354 } |
|
355 print "Table find_pdk_for_corresponding_nb1 is:\n"; |
|
356 display_array_one_line_at_the_time(@find_pdk_for_corresponding_nb1); |
|
357 |
|
358 if($nb_of_pdk_for_corresponding_nb1==1) |
|
359 { |
|
360 print "There is only $nb_of_pdk_for_corresponding_nb1 PDK with the name corresponding to the PDK number given, we can keep going!\n"; |
|
361 } |
|
362 else |
|
363 { |
|
364 print "There is $nb_of_pdk_for_corresponding_nb1 PDKs with the same name, please select one in the list above and run the perl script again with the right PDK name\n"; |
|
365 exit(0); |
|
366 } |
|
367 |
|
368 #extract PDK name if only one |
|
369 $pdk1_correct_name_to_use = $find_pdk_for_corresponding_nb1[0]; |
|
370 $pdk_path1 .= $find_pdk_for_corresponding_nb1[0]; |
|
371 print "pdknb1 = $pdknb1\n"; |
|
372 } |
|
373 else |
|
374 { |
|
375 print "We have the PDK Name therefore we can define the path to the PDK\n"; |
|
376 |
|
377 # Have a look in the default directory if there is a PDK with that number. If none or more than one with the same id, returns the list of PDKs with that same number |
|
378 foreach $find_val (@pdks_with_valid_zip_in_default_loc) |
|
379 { |
|
380 #print $find_val, "\n"; |
|
381 if($find_val =~ /$pdkname1/i) |
|
382 { |
|
383 $find_pdk_for_corresponding_name1[$nb_of_pdk_for_corresponding_name1++]=$find_val; |
|
384 } |
|
385 } |
|
386 print "Table find_pdk_for_corresponding_name1 is: \n"; |
|
387 display_array_one_line_at_the_time(@find_pdk_for_corresponding_name1); |
|
388 |
|
389 if($nb_of_pdk_for_corresponding_name1==1) |
|
390 { |
|
391 print "There is only $nb_of_pdk_for_corresponding_name1 PDK with the name corresponding to the PDK name given, we can keep going!\n"; |
|
392 } |
|
393 else |
|
394 { |
|
395 print "There is $nb_of_pdk_for_corresponding_name1 PDKs with the same name, please select one in the list above and run the perl script again with the right PDK name\n"; |
|
396 exit(0); |
|
397 } |
|
398 |
|
399 #extract PDK name if only one |
|
400 $pdk1_correct_name_to_use = $find_pdk_for_corresponding_name1[0]; |
|
401 $pdk_path1 .= @find_pdk_for_corresponding_name1[0]; |
|
402 print "pdkname1 = $pdkname1\n"; |
|
403 } |
|
404 print "The PDK used is: $pdk1_correct_name_to_use\n"; |
|
405 print "pdk_path1 = $pdk_path1\n"; |
|
406 } |
|
407 |
|
408 $find_val=0; |
|
409 |
|
410 if ($pdk_complete_path2) |
|
411 { |
|
412 if ($pdk_complete_name2) |
|
413 { |
|
414 print "We have the PDK number, we need to define if possible the PDK name and therefore the path to the PDK\n"; |
|
415 # Have a look in the default directory if there is a PDK with that number. If none or more than one with the same id, returns the list of PDKs with that same number |
|
416 foreach $find_val (@pdks_with_valid_zip_in_default_loc) |
|
417 { |
|
418 #print $find_val, "\n"; |
|
419 if($find_val =~ /$pdknb2/i) |
|
420 { |
|
421 $find_pdk_for_corresponding_nb2[$nb_of_pdk_for_corresponding_nb2++]=$find_val; |
|
422 } |
|
423 } |
|
424 print "Table find_pdk_for_corresponding_nb is:\n"; |
|
425 display_array_one_line_at_the_time(@find_pdk_for_corresponding_nb2); |
|
426 |
|
427 if($nb_of_pdk_for_corresponding_nb2==1) |
|
428 { |
|
429 print "There is only $nb_of_pdk_for_corresponding_nb2 PDK with the name corresponding to the PDK number given, we can keep going!\n"; |
|
430 } |
|
431 else |
|
432 { |
|
433 print "There is $nb_of_pdk_for_corresponding_nb2 PDKs with the same name, please select one in the list above and run the perl script again with the right PDK name\n"; |
|
434 exit(0); |
|
435 } |
|
436 |
|
437 #extract PDK name if only one |
|
438 $pdk2_correct_name_to_use = $find_pdk_for_corresponding_nb2[0]; |
|
439 $pdk_path2 .= $find_pdk_for_corresponding_nb2[0]; |
|
440 print "pdknb2 = $pdknb2\n"; |
|
441 } |
|
442 else |
|
443 { |
|
444 print "We have the PDK Name therefore we can define the path to the PDK\n"; |
|
445 |
|
446 # Have a look in the default directory if there is a PDK with that number. If none or more than one with the same id, returns the list of PDKs with that same number |
|
447 foreach $find_val (@pdks_with_valid_zip_in_default_loc) |
|
448 { |
|
449 #print $find_val, "\n"; |
|
450 if($find_val =~ /$pdkname2/i) |
|
451 { |
|
452 $find_pdk_for_corresponding_name2[$nb_of_pdk_for_corresponding_name2++]=$find_val; |
|
453 } |
|
454 } |
|
455 print "Table find_pdk_for_corresponding_name2 is:\n"; |
|
456 display_array_one_line_at_the_time(@find_pdk_for_corresponding_name2); |
|
457 |
|
458 if($nb_of_pdk_for_corresponding_name2==1) |
|
459 { |
|
460 print "There is only $nb_of_pdk_for_corresponding_name2 PDK with the name corresponding to the PDK name given, we can keep going!\n"; |
|
461 } |
|
462 else |
|
463 { |
|
464 print "There is $nb_of_pdk_for_corresponding_name2 PDKs with the same name, please select one in the list above and run the perl script again with the right PDK name\n"; |
|
465 exit(0); |
|
466 } |
|
467 |
|
468 #extract PDK name if only one |
|
469 $pdk2_correct_name_to_use = $find_pdk_for_corresponding_name2[0]; |
|
470 $pdk_path2 .= @find_pdk_for_corresponding_name2[0]; |
|
471 print "pdkname2 = $pdkname2\n"; |
|
472 } |
|
473 print "The PDK used is: $pdk2_correct_name_to_use\n"; |
|
474 print "pdk_path2 = $pdk_path2\n"; |
|
475 } |
|
476 |
|
477 # Find out if the locations are correct or not. We just need to make sure that the location contains the build_BOM.zip, if it's the case, then bingo! If not, exit the program. |
|
478 my $loc_var; |
|
479 |
|
480 if($pdkloc1) |
|
481 { |
|
482 # Get the list of file in the location choosen. |
|
483 opendir(LOC1_DIR, $pdkloc1); |
|
484 @read_files_in_loc = readdir(LOC1_DIR); |
|
485 close(LOC1_DIR); |
|
486 |
|
487 #print "List of files in the directory: @read_files_in_loc\n"; |
|
488 |
|
489 foreach $loc_var (@read_files_in_loc) |
|
490 { |
|
491 if($loc_var =~ /$build_bom_zip_file_to_extract$/) |
|
492 { |
|
493 print "We found the file: $loc_var\n"; |
|
494 |
|
495 $pdk1_correct_name_to_use = "PDK1"; |
|
496 $pdk_path1 = $pdkloc1; |
|
497 |
|
498 print "The PDK used is: $pdk1_correct_name_to_use\n"; |
|
499 print "pdk_path1 = $pdk_path1\n"; |
|
500 $loc1_contains_the_zip_file_we_need=1; |
|
501 |
|
502 # As we have found the file, we can probably break! |
|
503 } |
|
504 } |
|
505 if(!$loc1_contains_the_zip_file_we_need) |
|
506 { |
|
507 print "We can't find the file $build_bom_zip_file_to_extract in the location $pdkloc2 and therefore we can't go any further!!\n"; |
|
508 exit(0); |
|
509 } |
|
510 } |
|
511 print "\n"; |
|
512 |
|
513 if($pdkloc2) |
|
514 { |
|
515 # Have a look at the zip files in the location choosen. |
|
516 opendir(LOC2_DIR, $pdkloc2); |
|
517 @read_files_in_loc = readdir(LOC2_DIR); # Need to have a look at the sub directories too!!!!!! |
|
518 close(LOC2_DIR); |
|
519 print "List of files in the directory: @read_files_in_loc\n"; |
|
520 |
|
521 foreach $loc_var (@read_files_in_loc) |
|
522 { |
|
523 # Have a look for build_bom.zip and build_logs.zip |
|
524 if( ($loc_var =~ /$build_bom_zip_file_to_extract$/) || ($loc_var =~ /$build_logs_zip_file_to_extract$/) ) |
|
525 { |
|
526 print "We found the file: $loc_var\n"; |
|
527 $loc2_contains_the_zip_file_we_need++; |
|
528 } |
|
529 } |
|
530 |
|
531 if(!$loc2_contains_the_zip_file_we_need) # If we have the zip file, no need to have a look for the csv and xml files! |
|
532 { |
|
533 my $local_var_path; |
|
534 |
|
535 print "We are checking for xml file\n"; |
|
536 $local_var_path = "$pdkloc2\\$bom_dir"; |
|
537 print "local_var_path = $local_var_path\n"; |
|
538 |
|
539 opendir(LOCBOM_DIR, $local_var_path); |
|
540 @read_files_in_loc = readdir(LOCBOM_DIR); |
|
541 close(LOCBOM_DIR); |
|
542 |
|
543 print "List of files in the directory: @read_files_in_loc\n"; |
|
544 |
|
545 foreach $loc_var (@read_files_in_loc) |
|
546 { |
|
547 if($loc_var =~ /$name_of_file_to_compare$/) |
|
548 { |
|
549 print "We are in the case of the build and instead of looking for zip files, we need to have a look for $name_of_file_to_compare\n"; |
|
550 |
|
551 print "We found the file: $loc_var\n"; |
|
552 |
|
553 $loc2_contains_the_xml_csv_files_we_need++; |
|
554 } |
|
555 } |
|
556 |
|
557 print "We are checking for csv file\n"; |
|
558 $local_var_path = "$pdkloc2\\$analysis_dir"; |
|
559 print "local_var_path = $local_var_path\n"; |
|
560 |
|
561 opendir(LOCANALYSIS_DIR, $local_var_path); |
|
562 @read_files_in_loc = readdir(LOCANALYSIS_DIR); |
|
563 close(LOCANALYSIS_DIR); |
|
564 |
|
565 print "List of files in the directory: @read_files_in_loc\n"; |
|
566 |
|
567 foreach $loc_var (@read_files_in_loc) |
|
568 { |
|
569 if($loc_var =~ /$pckg_extraction_data_file_name$/) |
|
570 { |
|
571 print "We are in the case of the build and instead of looking for zip files, we need to have a look for $pckg_extraction_data_file_name\n"; |
|
572 |
|
573 print "We found the file: $loc_var\n"; |
|
574 |
|
575 $loc2_contains_the_xml_csv_files_we_need++; |
|
576 } |
|
577 } |
|
578 } |
|
579 if(($loc2_contains_the_zip_file_we_need==$nb_of_zip_files_we_need) || ($loc2_contains_the_xml_csv_files_we_need==$nb_of_xml_csv_files_we_need)) |
|
580 { |
|
581 $pdk2_correct_name_to_use = "PDK2"; |
|
582 $pdk_path2 = $pdkloc2; |
|
583 |
|
584 print "The PDK used is: $pdk2_correct_name_to_use\n"; |
|
585 print "pdk_path2 = $pdk_path2\n"; |
|
586 |
|
587 if($loc2_contains_the_xml_csv_files_we_need==$nb_of_xml_csv_files_we_need) |
|
588 { |
|
589 $location_of_file_to_publish=$pdkloc2; |
|
590 $path_to_file_to_publish="$location_of_file_to_publish\\$name_of_file_to_publish"; |
|
591 print "location_of_file_to_publish=$location_of_file_to_publish\n"; |
|
592 print "path_to_file_to_publish=$path_to_file_to_publish\n"; |
|
593 } |
|
594 } |
|
595 else |
|
596 { |
|
597 if($loc2_contains_the_xml_csv_files_we_need<=$nb_of_xml_csv_files_we_need) |
|
598 { |
|
599 print "We can't find the files $name_of_file_to_compare and\/or $pckg_extraction_data_file_name in the location $pdkloc2 and therefore we can't go any further!!\n"; |
|
600 } |
|
601 else |
|
602 { |
|
603 print "We can't find the files $build_bom_zip_file_to_extract in the location $pdkloc2 and therefore we can't go any further!!\n"; |
|
604 } |
|
605 exit(0); |
|
606 } |
|
607 } |
|
608 |
|
609 print "\n"; |
|
610 print "If we are here, this means that both $build_bom_zip_file_to_extract have been found and we can start the real work to compare the 2 files to extract what we need!\n"; |
|
611 print "This is the value for the path we are looking at for pdk_path1: $pdk_path1\n"; |
|
612 print "This is the value for the path we are looking at for pdk_path2: $pdk_path2\n"; |
|
613 |
|
614 # When we are at this point, we know we have 2 build_BOM.zip files that we can compare them!!!! |
|
615 |
|
616 my $system_cmd = ""; |
|
617 |
|
618 my $working_dir="$working_drive\\$working_directory\\$working_sub_directory"; |
|
619 my $working_dir1="$working_drive\\$working_directory\\$working_sub_directory\\$working_pdk1_directory"; |
|
620 my $working_dir2="$working_drive\\$working_directory\\$working_sub_directory\\$working_pdk2_directory"; |
|
621 |
|
622 # 1st step is to extract the 2 zip files to allow us to have access to build-info.xml |
|
623 |
|
624 # Extract just one file from the zip file using "7z e -r -oOutput_Directory" |
|
625 #7z e -r build_BOM.zip build-info.xml |
|
626 # Where 7z is the unzip program |
|
627 # Where e is for extraction of a file |
|
628 # Where -r is for recursive to make sure we have a look in the subdirectories |
|
629 # Where -oOutput_Directory is the directory where we want the files to be unzipped |
|
630 # |
|
631 # Where $working_sub_directory is the directory where we will be carry the work to be done for the script. |
|
632 # Where $working_pdk1_directory is the subdirectory destination for the PDK1 |
|
633 # Where $build_bom_zip_file_to_extract is the name of the zip file (in our case: build_BOM.zip) |
|
634 # Where $pdk_path1 is the place where the zip file to unzip is |
|
635 # where $name_of_file_to_compare is the name of the file we want to extract from the zip file (in our case: build-info.xml) |
|
636 # Example: 7z e -r -oc:\temp\fcl_extraction\pdk1 C:\temp\Task243Test\PDK_1\build_BOM.zip build-info.xml |
|
637 |
|
638 # Extract file from 1st PDK |
|
639 $system_cmd = "7z e -r -o$working_dir1 $pdk_path1\\$build_bom_zip_file_to_extract $name_of_file_to_compare"; |
|
640 print "Exec: $system_cmd\n"; |
|
641 system($system_cmd); |
|
642 |
|
643 print "\n"; |
|
644 |
|
645 # Extract the information contained in PkgComponentAnalysisSummary.csv for path a nd package name used by PDK1. |
|
646 $system_cmd = "7z e -r -o$working_dir1 $pdk_path1\\$build_logs_zip_file_to_extract $pckg_extraction_data_file_name"; |
|
647 print "Exec: $system_cmd\n"; |
|
648 system($system_cmd); |
|
649 |
|
650 print "\n"; |
|
651 |
|
652 # Extract file from 2nd PDK |
|
653 if($loc2_contains_the_xml_csv_files_we_need==$nb_of_xml_csv_files_we_need) |
|
654 { |
|
655 my $local_file_path; |
|
656 print "We are copying the files $name_of_file_to_compare and $pckg_extraction_data_file_name from $pdk_path2 to $working_dir2\n"; |
|
657 |
|
658 print "Create directory $working_dir2\n"; |
|
659 $system_cmd = "mkdir $working_dir2"; |
|
660 print "Exec: $system_cmd\n"; |
|
661 system($system_cmd); |
|
662 |
|
663 print "We are going to copy $name_of_file_to_compare to $working_dir2\n"; |
|
664 $local_file_path = "$pdk_path2\\$bom_dir\\$name_of_file_to_compare"; |
|
665 $system_cmd = "xcopy $local_file_path $working_dir2 \/F"; |
|
666 print "Exec: $system_cmd\n"; |
|
667 system($system_cmd); |
|
668 |
|
669 print "\n"; |
|
670 |
|
671 # Extract the information contained in PkgComponentAnalysisSummary.csv for path and package name used by PDK1. |
|
672 print "We are going to copy $pckg_extraction_data_file_name to $working_dir2\n"; |
|
673 $local_file_path = "$pdk_path2\\$analysis_dir\\$pckg_extraction_data_file_name"; |
|
674 $system_cmd = "xcopy $local_file_path $working_dir2 \/F"; |
|
675 print "Exec: $system_cmd\n"; |
|
676 system($system_cmd); |
|
677 } |
|
678 else |
|
679 { |
|
680 print "We are looking for zip files, then we extract them\n"; |
|
681 $system_cmd = "7z e -r -o$working_dir2 $pdk_path2\\$build_bom_zip_file_to_extract $name_of_file_to_compare"; |
|
682 print "Exec: $system_cmd\n"; |
|
683 system($system_cmd); |
|
684 |
|
685 print "\n"; |
|
686 |
|
687 # Extract the information contained in PkgComponentAnalysisSummary.csv for path and package name used by PDK1. |
|
688 $system_cmd = "7z e -r -o$working_dir2 $pdk_path2\\$build_logs_zip_file_to_extract $pckg_extraction_data_file_name"; |
|
689 print "Exec: $system_cmd\n"; |
|
690 system($system_cmd); |
|
691 } |
|
692 |
|
693 # 2nd step is to extract the information we need from the 2 files build-info.xml |
|
694 |
|
695 # Create 2 hash arrays that will contain the name of the package as key and the value associated as MCL or FCL |
|
696 my %build_info_xml1; |
|
697 my %build_info_xml2; |
|
698 my @sorting_build_info_xml1; |
|
699 my @sorting_build_info_xml2; |
|
700 |
|
701 #my @display_hash_array; |
|
702 my $key; |
|
703 # Define the path for the files to work on |
|
704 my $path_to_pdk1_file_to_work_on="$working_dir1\\$name_of_file_to_compare"; |
|
705 my $path_to_pdk2_file_to_work_on="$working_dir2\\$name_of_file_to_compare"; |
|
706 |
|
707 print "\n"; |
|
708 |
|
709 my $count_packages=0; |
|
710 my @not_sorted_table; |
|
711 |
|
712 # Keep only what we need and keep it safe somewhere. |
|
713 # pdk1 |
|
714 %build_info_xml1 = extract_packages_and_branch_type_from_file($path_to_pdk1_file_to_work_on); |
|
715 |
|
716 print "%build_info_xml1:\n"; |
|
717 # Define the number of packages for pdk1 |
|
718 $total_packages_pdk1 = keys %build_info_xml1; |
|
719 print "\nThere is $total_packages_pdk1 packages for $pdk1_correct_name_to_use\n"; |
|
720 |
|
721 # 3rd a) step is to sort out the 2 files / table |
|
722 # Sort out the tables to facilitate the checking of the different packages |
|
723 @not_sorted_table = keys %build_info_xml1; |
|
724 |
|
725 #print "\nnot_sorted_table:\n @not_sorted_table\n"; |
|
726 |
|
727 # ascendant alphabetical sort |
|
728 @pdk1_sorting_table = sort { lc($a) cmp lc($b) } @not_sorted_table; |
|
729 |
|
730 #print "\npdk1_sorting_table :\n @pdk1_sorting_table\n"; |
|
731 |
|
732 print "\n"; |
|
733 |
|
734 # pdk2 |
|
735 %build_info_xml2 = extract_packages_and_branch_type_from_file($path_to_pdk2_file_to_work_on); |
|
736 print "%build_info_xml2:\n"; |
|
737 # Define the number of packages for pdk2 |
|
738 $total_packages_pdk2 = keys %build_info_xml2; |
|
739 print "\nThere is $total_packages_pdk2 packages for $pdk2_correct_name_to_use\n"; |
|
740 |
|
741 # 3rd b) step is to sort out the 2 files / table |
|
742 # Sort out the tables to facilitate the checking of the different packages |
|
743 @not_sorted_table = keys %build_info_xml2; |
|
744 |
|
745 #print "\nnot_sorted_table:\n @not_sorted_table\n"; |
|
746 |
|
747 # ascendant alphabetical sort |
|
748 @pdk2_sorting_table = sort { lc($a) cmp lc($b) } @not_sorted_table; |
|
749 |
|
750 #print "\npdk2_sorting_table :\n @pdk2_sorting_table\n"; |
|
751 |
|
752 print "\n"; |
|
753 |
|
754 # 4th step is to compare both data and export it to a file or something similar that is good for media wiki. |
|
755 # Compare both files to find out the difference between each packages FCL, MCL, added or deleted packages |
|
756 |
|
757 my $tab_counter1=0; |
|
758 my $tab_counter2=0; |
|
759 my $compare_2_tables; |
|
760 my $value_package_pdk1; |
|
761 my $value_package_pdk2; |
|
762 |
|
763 while (($tab_counter1 < $total_packages_pdk1) && ($tab_counter2 < $total_packages_pdk2)) # or should it be || |
|
764 { |
|
765 #print "tab_counter1=$tab_counter1, total_packages_pdk1=$total_packages_pdk1\ntab_counter2=$tab_counter2, total_packages_pdk2=$total_packages_pdk2\n"; |
|
766 #print "packages in pdk1 is $pdk1_sorting_table[$tab_counter1] and in pdk2 is $pdk2_sorting_table[$tab_counter2]\n"; |
|
767 |
|
768 # $a cmp $b |
|
769 # if $a > $b value returned is 1 |
|
770 # if $a = $b value returned is 0 |
|
771 # if $a < $b value returned is -1 |
|
772 |
|
773 $compare_2_tables = ( $pdk1_sorting_table[$tab_counter1] cmp $pdk2_sorting_table[$tab_counter2] ); |
|
774 #print "compare_2_tables=$compare_2_tables\n"; |
|
775 |
|
776 if(!$compare_2_tables) # Compare if the the packages in the tables(index) are the same or not, if $compare_2_tables=0, then equal |
|
777 { |
|
778 #print "the package is the same in pdk1_sorting_table and pdk2_sorting_table\n"; |
|
779 |
|
780 $value_package_pdk1 = $build_info_xml1{$pdk1_sorting_table[$tab_counter1]}; |
|
781 $value_package_pdk2 = $build_info_xml2{$pdk2_sorting_table[$tab_counter2]}; |
|
782 #print "value_package_pdk1=$value_package_pdk1\n"; |
|
783 #print "value_package_pdk2=$value_package_pdk2\n"; |
|
784 |
|
785 if(($value_package_pdk1 eq $mcl_cste) && ($value_package_pdk2 eq $fcl_cste)) |
|
786 { |
|
787 #print "the package was MCL and is now FCL - NEW\n"; |
|
788 $new_fcl_table[$total_new_fcl++] = $pdk1_sorting_table[$tab_counter1]; |
|
789 } |
|
790 else |
|
791 { |
|
792 if(($value_package_pdk1 eq $fcl_cste) && ($value_package_pdk2 eq $mcl_cste)) |
|
793 { |
|
794 #print "the package was FCL and is now MCL - NO MORE\n"; |
|
795 $no_more_fcl_table[$total_no_more_fcl++] = $pdk1_sorting_table[$tab_counter1]; |
|
796 } |
|
797 else |
|
798 { |
|
799 if(($value_package_pdk1 eq $fcl_cste) && ($value_package_pdk2 eq $fcl_cste)) |
|
800 { |
|
801 #print "the package was FCL and is still FCL - STILL\n"; |
|
802 $still_fcl_table[$total_still_fcl++] = $pdk1_sorting_table[$tab_counter1]; |
|
803 } |
|
804 else |
|
805 { |
|
806 #print "the package was MCL and is still MCL - VERY GOOD\n"; |
|
807 $very_good_mcl_table[$total_very_good_mcl++] = $pdk1_sorting_table[$tab_counter1]; |
|
808 } |
|
809 } |
|
810 } |
|
811 $tab_counter1++; |
|
812 $tab_counter2++; |
|
813 } |
|
814 else |
|
815 { |
|
816 # The values are not the same, therefore it must be an added or deleted package |
|
817 if($compare_2_tables<0) # If $compare_2_tables=-1, then pdk1 is smaller than pdk2, which means that it has been deleted from pdk2 |
|
818 { |
|
819 #print "the package $pdk1_sorting_table[$tab_counter1] has been deleted from pdk2\n"; |
|
820 $packages_removed_table[$total_packages_removed++]=$pdk1_sorting_table[$tab_counter1++]; |
|
821 } |
|
822 else |
|
823 { |
|
824 # If $compare_2_tables=1, then pdk1 is bigger than pdk2, which means that it has been added to pdk2 |
|
825 #print "the package $pdk2_sorting_table[$tab_counter2] has been added to pdk2\n"; |
|
826 $packages_added_table[$total_packages_added++]=$pdk2_sorting_table[$tab_counter2++]; |
|
827 } |
|
828 } |
|
829 } |
|
830 |
|
831 # Build list of files path and name based on csv file generated by the build system (analysis part) |
|
832 extract_package_detail("$working_dir2\\$pckg_extraction_data_file_name"); |
|
833 extract_package_detail("$working_dir1\\$pckg_extraction_data_file_name"); |
|
834 |
|
835 print "\nPrint all the values related to our calculations\n"; |
|
836 print "total_packages_pdk1=$total_packages_pdk1\n"; |
|
837 print "total_packages_pdk2=$total_packages_pdk2\n"; |
|
838 print "\n"; |
|
839 print "total_packages_added=$total_packages_added\n"; |
|
840 print "packages_added_table=\n"; |
|
841 #display_array_one_line_at_the_time(@packages_added_table); |
|
842 print "\n"; |
|
843 print "total_packages_removed=$total_packages_removed\n"; |
|
844 print "packages_removed_table=\n"; |
|
845 #display_array_one_line_at_the_time(@packages_removed_table); |
|
846 print "\n"; |
|
847 print "total_new_fcl=$total_new_fcl\n"; |
|
848 print "new_fcl_table=\n"; |
|
849 #display_array_one_line_at_the_time(@new_fcl_table); |
|
850 print "\n"; |
|
851 print "total_no_more_fcl=$total_no_more_fcl\n"; |
|
852 print "no_more_fcl_table=\n"; |
|
853 #display_array_one_line_at_the_time(@no_more_fcl_table); |
|
854 print "\n"; |
|
855 print "total_still_fcl=$total_still_fcl\n"; |
|
856 print "still_fcl_table=\n"; |
|
857 #display_array_one_line_at_the_time(@still_fcl_table); |
|
858 print "\n"; |
|
859 print "total_very_good_mcl=$total_very_good_mcl\n"; |
|
860 print "very_good_mcl_table=\n"; |
|
861 #display_array_one_line_at_the_time(@very_good_mcl_table); |
|
862 print "\n"; |
|
863 # Checking that the packages have been assigned properly. |
|
864 # !!!! Need to verify the formula. Not sure that is correct!!!!!! |
|
865 print "Verification for the total packages between the 2 pdks\n"; |
|
866 print "Formula used is: total_packages_pdk2 = total_packages_pdk1 + total_packages_added - total_packages_removed\n"; |
|
867 print "$total_packages_pdk2 = $total_packages_pdk1 + $total_packages_added - $total_packages_removed\n"; |
|
868 print "\n"; |
|
869 print "Formula used is: total_packages_pdk1 = total_very_good_mcl + total_new_fcl + total_no_more_fcl + total_still_fcl= total\n"; |
|
870 print "$total_packages_pdk1 = $total_very_good_mcl + $total_new_fcl + $total_no_more_fcl + $total_still_fcl = ", ($total_very_good_mcl + $total_new_fcl + $total_no_more_fcl + $total_still_fcl), "\n"; |
|
871 print "\n"; |
|
872 print "Formula used is: total_packages_pdk2 = total_very_good_mcl + total_new_fcl + total_no_more_fcl + total_still_fcl + total_packages_added = total\n"; |
|
873 print "$total_packages_pdk2 = $total_very_good_mcl + $total_new_fcl + $total_no_more_fcl + $total_still_fcl + $total_packages_added - $total_packages_removed= ", ($total_very_good_mcl + $total_new_fcl + $total_no_more_fcl + $total_still_fcl + $total_packages_added - $total_packages_removed), "\n"; |
|
874 print "\n"; |
|
875 |
|
876 # 5th step is to create a txt file ready to be used for the release notes in a media wiki format. |
|
877 open(FCLCOMPARISONFILE, ">$path_to_file_to_publish"); # !!!!! First time we are accessing the file, therefore create it or replace it, AFTR THAT WE NEED TO APPEND IT ONLY!!!!! |
|
878 |
|
879 my $val; |
|
880 |
|
881 # Enter the beginning of the section for general information about the pdk and it's predecessor. |
|
882 print FCLCOMPARISONFILE <<"EOT"; |
|
883 == Packages == |
|
884 |
|
885 This section is about general information on the packages included in the platform. |
|
886 |
|
887 This is an analysis between '''$pdk2_correct_name_to_use''' and '''$pdk1_correct_name_to_use''' |
|
888 |
|
889 EOT |
|
890 |
|
891 |
|
892 print FCLCOMPARISONFILE "Number total of packages in $pdk1_correct_name_to_use is: '''$total_packages_pdk1'''\n\n"; |
|
893 print FCLCOMPARISONFILE "Number total of packages in $pdk2_correct_name_to_use is: '''$total_packages_pdk2'''\n\n"; |
|
894 |
|
895 print FCLCOMPARISONFILE "=== Packages added ===\n\n"; |
|
896 print FCLCOMPARISONFILE "Number total of packages added in $pdk2_correct_name_to_use is: '''$total_packages_added'''\n\n"; |
|
897 foreach $val (@packages_added_table) |
|
898 { |
|
899 if($pckg_name_array{$val}) |
|
900 { |
|
901 print FCLCOMPARISONFILE "''' $pckg_name_array{$val} ($pckg_path_name_array{$val}) '''\n\n"; |
|
902 } |
|
903 else |
|
904 { |
|
905 print FCLCOMPARISONFILE "''' $val ($pckg_path_name_array{$val}) '''\n\n"; |
|
906 } |
|
907 } |
|
908 |
|
909 print FCLCOMPARISONFILE "=== Packages removed ===\n\n"; |
|
910 print FCLCOMPARISONFILE "''' Number total of packages removed in $pdk2_correct_name_to_use is: $total_packages_removed'''\n\n"; |
|
911 foreach $val (@packages_removed_table) |
|
912 { |
|
913 if($pckg_name_array{$val}) |
|
914 { |
|
915 print FCLCOMPARISONFILE "''' $pckg_name_array{$val} ($pckg_path_name_array{$val}) '''\n\n"; |
|
916 } |
|
917 else |
|
918 { |
|
919 print FCLCOMPARISONFILE "''' $val ($pckg_path_name_array{$val}) '''\n\n"; |
|
920 } |
|
921 } |
|
922 |
|
923 # Enter the beginning of the section for the FCL |
|
924 print FCLCOMPARISONFILE <<"EOT"; |
|
925 == FCLs == |
|
926 |
|
927 '''$pdk2_correct_name_to_use''' was built using the FCL versions of the packages listed below: for each one we list the changes in the FCL which are not in the MCL. |
|
928 |
|
929 The previous PDK also involved some FCLs, so we indicate which problems are now fixed in the MCL, and which FCLs are new to this build. |
|
930 |
|
931 Cloning the source from Mercurial is made more awkward by using a mixture of MCLs and FCLs, but we provide a tool to help - see [[How_to_build_the_Platform#Automatic_Mercurial_Clone]] for details. |
|
932 |
|
933 EOT |
|
934 |
|
935 # Packages that were on MCL and that are now on FCL |
|
936 foreach $val (@new_fcl_table) |
|
937 { |
|
938 if($pckg_name_array{$val}) |
|
939 { |
|
940 print FCLCOMPARISONFILE "=== $pckg_name_array{$val} ($pckg_path_name_array{$val}) -- NEW ===\n\n"; |
|
941 # TO DO!!!! |
|
942 # Needs to be recovered from Mercurial. How???? |
|
943 #[http://developer.symbian.org/bugs/show_bug.cgi?id=156 Bug 156]: Add a missing bld.inf, to renable compilation of the package |
|
944 #[http://developer.symbian.org/bugs/show_bug.cgi?id=197 Bug 197]: PSAlgorithmInternalCRKeys.h is missing |
|
945 } |
|
946 else |
|
947 { |
|
948 print FCLCOMPARISONFILE "=== $val ($pckg_path_name_array{$val}) -- NEW ===\n\n"; |
|
949 } |
|
950 } |
|
951 |
|
952 # Packages that were on FCL and that are now on FCL |
|
953 foreach $val (@still_fcl_table) |
|
954 { |
|
955 if($pckg_name_array{$val}) |
|
956 { |
|
957 print FCLCOMPARISONFILE "=== $pckg_name_array{$val} ($pckg_path_name_array{$val}) ===\n\n"; |
|
958 } |
|
959 else |
|
960 { |
|
961 print FCLCOMPARISONFILE "=== $val ($pckg_path_name_array{$val}) ===\n\n"; |
|
962 } |
|
963 } |
|
964 |
|
965 print FCLCOMPARISONFILE "=== FCLs used in $pdk1_correct_name_to_use but not needed in $pdk2_correct_name_to_use ===\n\n"; |
|
966 |
|
967 foreach $val (@no_more_fcl_table) |
|
968 { |
|
969 if($pckg_name_array{$val}) |
|
970 { |
|
971 print FCLCOMPARISONFILE "''' $pckg_name_array{$val} ($pckg_path_name_array{$val}) '''\n\n"; |
|
972 } |
|
973 else |
|
974 { |
|
975 print FCLCOMPARISONFILE "''' $val ($pckg_path_name_array{$val}) '''\n\n"; |
|
976 } |
|
977 } |
|
978 |
|
979 # Packages were on MCL and they are still on MCL. |
|
980 foreach $val (@very_good_mcl_table) |
|
981 { |
|
982 #print "Value for package $val is: $pckg_name_array{$val}\n"; |
|
983 if($pckg_name_array{$val}) |
|
984 { |
|
985 #print "There is a real name for the package: ($pckg_name_array{$val})\n"; |
|
986 #print FCLCOMPARISONFILE "=== $pckg_name_array{$val} ($pckg_path_name_array{$val}) -- VERY GOOD ===\n"; |
|
987 } |
|
988 else |
|
989 { |
|
990 #print "There is not a real name for the package: ($pckg_name_array{$val})\n"; |
|
991 #print FCLCOMPARISONFILE "=== $val ($pckg_path_name_array{$val}) -- VERY GOOD ===\n"; |
|
992 } |
|
993 } |
|
994 |
|
995 close(FCLCOMPARISONFILE); |
|
996 |
|
997 #print "Path for each packages:\n"; |
|
998 #display_hash_array_one_line_at_the_time(%pckg_path_name_array); |
|
999 #print "\n"; |
|
1000 #print "Real name for each packages:\n"; |
|
1001 #display_hash_array_one_line_at_the_time(%pckg_name_array); |
|
1002 #print "\n"; |
|
1003 #print "Branch type for each packages:\n"; |
|
1004 #display_hash_array_one_line_at_the_time(%build_info_xml2); |
|
1005 #print "\n"; |
|
1006 |
|
1007 # Used to verify the differences between build_info.xml and PkgComponentAnalysisSummary.csv because not the same number of packages. |
|
1008 #print "Packages list from build-info.xml:\n"; |
|
1009 #my @local_array_key_extraction; |
|
1010 #my @local_array_key_extraction_sorted; |
|
1011 #@local_array_key_extraction = keys (%build_info_xml2); |
|
1012 #@local_array_key_extraction_sorted = sort { lc($a) cmp lc($b) } @local_array_key_extraction; |
|
1013 #display_array_one_line_at_the_time(@local_array_key_extraction_sorted); |
|
1014 #print "\n"; |
|
1015 #print "Packages list from csv file:\n"; |
|
1016 #my @local_array_key_extraction; |
|
1017 #my @local_array_key_extraction_sorted; |
|
1018 #@local_array_key_extraction = keys (%pckg_name_array); |
|
1019 #@local_array_key_extraction_sorted = sort { lc($a) cmp lc($b) } @local_array_key_extraction; |
|
1020 #display_array_one_line_at_the_time(@local_array_key_extraction_sorted); |
|
1021 |
|
1022 |
|
1023 # 6th step is to export that txt file the appropriate location. |
|
1024 # That could be the location from where we launched the script! |
|
1025 print "\nYou will find the file with all the information you need for the releases note, here: $path_to_file_to_publish\n\n"; |
|
1026 |
|
1027 # Cleanup the mess!!! |
|
1028 #pause_script(); # Temporary until script is finished!!!!!! |
|
1029 |
|
1030 $system_cmd = "rmdir /S /Q $working_dir"; |
|
1031 print "Exec: $system_cmd\n"; |
|
1032 system($system_cmd); |
|
1033 |
|
1034 ## |
|
1035 ### End of the program!!! |
|
1036 ## |
|
1037 |
|
1038 |
|
1039 # |
|
1040 # Functions section!!!!! |
|
1041 # |
|
1042 |
|
1043 |
|
1044 # If no parameters entered or help selected, display help |
|
1045 sub helpme |
|
1046 { |
|
1047 print "\nfct: helpme\n"; |
|
1048 |
|
1049 print "Generate FCLs details between 2 PDKs to be included as part of the release notes\n"; |
|
1050 print "Default location for PDKs is: $default_pdk_loc\n"; |
|
1051 print "Usage: perl fcls4releasenotes.pl --input_data1=x --input_data2=y\n"; |
|
1052 print "Where input_data1 and input_data2 could be pdknb1 or pdknb2 or pdkloc1 or pdkloc2 or pdkname1 or pdkname2\n"; |
|
1053 print "Where pdknb is the PDK number, for example 2.0.e\n"; |
|
1054 print "Where pdkloc is the root location where your file $build_bom_zip_file_to_extract is. For ex: \\\\bishare\\releases\\PDK_2.0.e\\ or c:\\temp\\myPDK\\\n"; |
|
1055 print "Where pdkname is the full name of the PDK, like for ex PDK_candidate_2.0.d_flat\n"; |
|
1056 print "\nNotes:\n"; |
|
1057 print "\tParameter names with 1 at the end (pdknb1, pdkname1, pdkloc1) are set for the oldest PDK to use (PDK1)\n"; |
|
1058 print "\tParameter names with 2 at the end (pdknb2, pdkname2, pdkloc2) are set for the newest PDK to use (PDK2)\n"; |
|
1059 print "\tIf you try to use for example pdknb2 and pdkname2 or pdkloc1 and pdknb1 the result is not guaranted to be correct!!!! as one will be set as PDK1 and the other as PDK2, but which order????\n"; |
|
1060 print "\tThe difference is done as follow PDK2 - PDK1\n"; |
|
1061 print "\n"; |
|
1062 print "\nTypical command lines from script location:\n"; |
|
1063 print "\t<perl fcls4releasenotes.pl --pdknb1=2.0.e --pdkloc2=c:\\temp\\myPDK\\>\n"; |
|
1064 print "\t<perl fcls4releasenotes.pl --pdkname1=PDK_2.0.e --pdknb2=2.0.e>\n"; |
|
1065 print "\t<perl fcls4releasenotes.pl --pdknb2=2.0.d --pdknb1=2.0.e>\n"; |
|
1066 print "\t<perl fcls4releasenotes.pl help>\n"; |
|
1067 #print "\t<perl fcls4releasenotes.pl validpdks>\n"; |
|
1068 |
|
1069 list_pdks_at_default_location(); |
|
1070 |
|
1071 exit(0); |
|
1072 } |
|
1073 # End section related to help |
|
1074 |
|
1075 # Extract list of PDKs that are in the default location. |
|
1076 sub list_pdks_at_default_location |
|
1077 { |
|
1078 print "\nfct: list_pdks_at_default_location\n"; |
|
1079 |
|
1080 # Do a dir of the default location |
|
1081 print "List of directories in the default location $default_pdk_loc\n"; |
|
1082 extract_dir_default_loc(); |
|
1083 |
|
1084 # Extract all the PDKs that have the pattern PDK_ |
|
1085 print "All available PDKS in the default location $default_pdk_loc that have the pattern $pdk_start_pattern\n"; |
|
1086 extract_pdk_in_default_loc(); |
|
1087 |
|
1088 # Extract all the PDKs that have the file build_BOM.zip |
|
1089 print "All available PDKS in the default location $default_pdk_loc that contains the zip file $build_bom_zip_file_to_extract\n"; |
|
1090 extract_pdk_with_valid_zip_in_default_loc(); |
|
1091 |
|
1092 } |
|
1093 |
|
1094 # Generates list of directories in the default location used for the storage of the PDKs |
|
1095 sub extract_dir_default_loc |
|
1096 { |
|
1097 print "\nfct: extract_dir_default_loc\n"; |
|
1098 |
|
1099 # Get the list of directories in the default location |
|
1100 opendir(DEFAULT_DIR, $default_pdk_loc); |
|
1101 @directories_list_default_location = readdir(DEFAULT_DIR); |
|
1102 close(DEFAULT_DIR); |
|
1103 |
|
1104 $nb_dir_in_default_loc = scalar(@directories_list_default_location); |
|
1105 |
|
1106 print "nb_dir_in_default_loc=$nb_dir_in_default_loc\n"; |
|
1107 #display_array_one_line_at_the_time(@directories_list_default_location); |
|
1108 } |
|
1109 |
|
1110 # Establish the list of directories that are an actual PDK |
|
1111 sub extract_pdk_in_default_loc |
|
1112 { |
|
1113 print "\nfct: extract_pdk_in_default_loc\n"; |
|
1114 |
|
1115 my $var; |
|
1116 $nb_pdks_in_default_loc=0; |
|
1117 print "pdk_start_pattern = $pdk_start_pattern\n"; |
|
1118 |
|
1119 foreach $var (@directories_list_default_location) |
|
1120 { |
|
1121 if($var =~ /^$pdk_start_pattern+/) |
|
1122 { |
|
1123 #print "$var\n"; |
|
1124 $pdk_dir_list_in_default_location[$nb_pdks_in_default_loc++] = $var; |
|
1125 } |
|
1126 #else |
|
1127 #{ |
|
1128 #print "Not a PDK!!!!\n"; |
|
1129 #} |
|
1130 } |
|
1131 print "There is $nb_pdks_in_default_loc PDKs in the default location $default_pdk_loc\n"; |
|
1132 |
|
1133 print "This is the list of PDKs that are in the default location $default_pdk_loc\n"; |
|
1134 #display_array_one_line_at_the_time(@pdk_dir_list_in_default_location); |
|
1135 } |
|
1136 |
|
1137 # Establish the list of PDK directories with a valid zip file to do the test |
|
1138 sub extract_pdk_with_valid_zip_in_default_loc |
|
1139 { |
|
1140 print "\nfct: extract_pdk_with_valid_zip_in_default_loc\n"; |
|
1141 |
|
1142 my $var1; |
|
1143 my $var2; |
|
1144 my $path_to_find_zip = ""; |
|
1145 my @read_pdk_directory=(); |
|
1146 |
|
1147 $nb_pdks_with_valid_zip_in_default_loc=0; |
|
1148 |
|
1149 print "build_bom_zip_file_to_extract=$build_bom_zip_file_to_extract\n"; |
|
1150 |
|
1151 foreach $var1 (@pdk_dir_list_in_default_location) |
|
1152 { |
|
1153 $path_to_find_zip=$default_pdk_loc; |
|
1154 |
|
1155 $path_to_find_zip .= $var1; |
|
1156 #print "path_to_find_zip=$path_to_find_zip\n"; |
|
1157 |
|
1158 # Get the list of directories in the default location |
|
1159 opendir(PDK_DIR, $path_to_find_zip); |
|
1160 @read_pdk_directory = readdir(PDK_DIR); |
|
1161 close(PDK_DIR); |
|
1162 |
|
1163 foreach $var2 (@read_pdk_directory) |
|
1164 { |
|
1165 if($var2 =~ /$build_bom_zip_file_to_extract$/) |
|
1166 { |
|
1167 #print "$var2\n"; |
|
1168 $pdks_with_valid_zip_in_default_loc[$nb_pdks_with_valid_zip_in_default_loc++] = $var1; |
|
1169 } |
|
1170 #else |
|
1171 #{ |
|
1172 #print "Doesn't contain $build_bom_zip_file_to_extract!!!!\n"; |
|
1173 #} |
|
1174 } |
|
1175 } |
|
1176 print "There is $nb_pdks_with_valid_zip_in_default_loc PDKs with a valid $build_bom_zip_file_to_extract zip in the default location $default_pdk_loc\n"; |
|
1177 |
|
1178 print "This is the list of PDKs that have a zip file called $build_bom_zip_file_to_extract in the default location $default_pdk_loc\n"; |
|
1179 display_array_one_line_at_the_time(@pdks_with_valid_zip_in_default_loc); |
|
1180 } |
|
1181 |
|
1182 # Function created to pause the script to allow analysis and debug of the script. |
|
1183 # Will require the user to press enter to carry on the execution of the script. |
|
1184 sub pause_script |
|
1185 { |
|
1186 print "\nfct: pause_script\n"; |
|
1187 my $local_system_cmd = "pause"; |
|
1188 print "Exec: $local_system_cmd\n"; |
|
1189 system($local_system_cmd); |
|
1190 } |
|
1191 |
|
1192 |
|
1193 # This function is used to extract the name of the package and the type |
|
1194 sub extract_packages_and_branch_type_from_file |
|
1195 { |
|
1196 # 1 Parameters passed, the path to the file to be viewed |
|
1197 my ($file_to_work_on) = @_; |
|
1198 |
|
1199 print "\nfct: extract_packages_and_branch_type_from_file\n"; |
|
1200 |
|
1201 print "$file_to_work_on\n"; |
|
1202 |
|
1203 my %local_hash_array; |
|
1204 #my @local_hash_array; |
|
1205 my $local_key; |
|
1206 |
|
1207 my $package=""; |
|
1208 my $type_of_branch=""; |
|
1209 |
|
1210 #@hash_array_to_display = %local_hash_array; |
|
1211 #print "%local_hash_array before starting = @hash_array_to_display\n"; |
|
1212 |
|
1213 # Open file |
|
1214 open(FILETOWORKON , $file_to_work_on); |
|
1215 |
|
1216 # Extract data from file |
|
1217 my @local_array = <FILETOWORKON>; |
|
1218 #print "local_array= @local_array\n"; |
|
1219 |
|
1220 # Close file |
|
1221 close(FILETOWORKON); |
|
1222 |
|
1223 |
|
1224 my $extracted_line; |
|
1225 |
|
1226 # Go line by line |
|
1227 foreach $extracted_line (@local_array) |
|
1228 { |
|
1229 #print "\nextracted_line is: $extracted_line"; # no need to add \\n as it's part of the line displayed. |
|
1230 |
|
1231 if ($extracted_line =~ /$starting_pattern_for_xml_extraction/) |
|
1232 { |
|
1233 #print "The line extracted is our starting pattern $starting_pattern_for_xml_extraction\n"; |
|
1234 $extraction_from_xml_is_allowed=1; |
|
1235 } |
|
1236 else |
|
1237 { |
|
1238 if ($extracted_line =~ /$ending_pattern_for_xml_extraction/) |
|
1239 { |
|
1240 #print "The line extracted is our ending pattern $ending_pattern_for_xml_extraction\n"; |
|
1241 $extraction_from_xml_is_allowed=0; |
|
1242 } |
|
1243 } |
|
1244 #print "extraction_from_xml_is_allowed=$extraction_from_xml_is_allowed\n"; |
|
1245 |
|
1246 if($extraction_from_xml_is_allowed) |
|
1247 { |
|
1248 #print "We are looking to extract the package and branch type from the line extracted\n"; |
|
1249 |
|
1250 # Decode the line |
|
1251 |
|
1252 # Decode the branch type |
|
1253 if($extracted_line =~ /$branch_type_extraction_pattern/) |
|
1254 { |
|
1255 $type_of_branch=$1; |
|
1256 |
|
1257 # Decode the package because there is a branch type in the line extracted! |
|
1258 if ($extracted_line =~ m,$package_extraction_pattern,) |
|
1259 { |
|
1260 $package=$1; |
|
1261 } |
|
1262 #print "package is $package and type_of_branch is $type_of_branch\n"; |
|
1263 $local_hash_array{$package}=$type_of_branch; |
|
1264 |
|
1265 } |
|
1266 else |
|
1267 { |
|
1268 #print "The extracted line doesn't contain $look_for_mcl or $look_for_fcl, therefore we need to skip it!\n"; |
|
1269 } |
|
1270 } |
|
1271 } |
|
1272 |
|
1273 # Check the contain of the hash array to make sure that we have extracted the data as expected. To check against the actual file. |
|
1274 |
|
1275 # Option 1: Display all in one line |
|
1276 #@hash_array_to_display = %local_hash_array; |
|
1277 # Print "%local_hash_array when extraction is finished = @hash_array_to_display\n"; |
|
1278 |
|
1279 # Option 2: Print 1 key with 1 value by line |
|
1280 #foreach $local_key (keys(%local_hash_array)) |
|
1281 #{ |
|
1282 # print "$local_key = $local_hash_array{$local_key}\n"; |
|
1283 #} |
|
1284 |
|
1285 # Return hash array containing all the packages and branch type associated |
|
1286 return (%local_hash_array); |
|
1287 } |
|
1288 |
|
1289 # Function used to extract all the data from the csv file about the different packages (name, path and real name) |
|
1290 sub extract_package_detail |
|
1291 { |
|
1292 # 1 Parameters passed, the path to the file to be viewed |
|
1293 my ($file_to_work_on) = @_; |
|
1294 |
|
1295 print "\nfct: extract_package_detail\n"; |
|
1296 |
|
1297 print "$file_to_work_on\n"; |
|
1298 |
|
1299 my @local_array; |
|
1300 |
|
1301 # Open file |
|
1302 open(FILETOWORKON , $file_to_work_on); |
|
1303 |
|
1304 # Extract data from file |
|
1305 my @local_array = <FILETOWORKON>; |
|
1306 #print "build_bom_local_array= @build_bom_local_array\n"; |
|
1307 |
|
1308 # Close file |
|
1309 close(FILETOWORKON); |
|
1310 |
|
1311 my $extracted_line; |
|
1312 |
|
1313 # Create a table with the path for each package using a hash array |
|
1314 my $pckg_name_extraction_pattern = "^sf\/[\\w]*\/([\\w]*)"; |
|
1315 my $pckg_path_extraction_pattern = "^(sf[\W\w]*[^,]+),"; |
|
1316 my $pckg_real_name_extraction_pattern = ",[\\s]+([\\w\\s]*),[\\s]+[\\w\\s]*\$"; |
|
1317 my $pckg_name=""; |
|
1318 my $pckg_path=""; |
|
1319 my $pckg_real_name=""; |
|
1320 |
|
1321 #Typical lines to decode |
|
1322 #sf/app/helps,SFL,sf/app/helps/symhelp/helpmodel/group/bld.inf,OK, Help Apps, Help |
|
1323 #sf/app/java,SFL,sf/app/java/java_plat/group/bld.inf,OK, , |
|
1324 #sf/app/helps,SFL,sf/app/helps/symhelp/helpmodel/group/bld.inf,OK, Help Apps, Help |
|
1325 #sf/app/helps, |
|
1326 #SFL, |
|
1327 #sf/app/helps/symhelp/helpmodel/group/bld.inf, |
|
1328 #OK, |
|
1329 # Help Apps, |
|
1330 # Help |
|
1331 |
|
1332 #sf/app/java,SFL,sf/app/java/java_plat/group/bld.inf,OK, , |
|
1333 #sf/app/java, |
|
1334 #SFL, |
|
1335 #sf/app/java/java_plat/group/bld.inf, |
|
1336 #OK, |
|
1337 # , |
|
1338 # |
|
1339 |
|
1340 # Go line by line |
|
1341 |
|
1342 foreach $extracted_line (@local_array) |
|
1343 { |
|
1344 #print "\nextracted_line is: $extracted_line"; # no need to add \\n as it's part of the line displayed. |
|
1345 |
|
1346 if($extracted_line =~ m;$pckg_name_extraction_pattern;) |
|
1347 { |
|
1348 $pckg_name = $1; |
|
1349 #print "Pckg name is: $pckg_name\n"; |
|
1350 |
|
1351 #print "Is $pckg_name already exist in the hash array?: $pckg_path_name_array{$pckg_name}\n"; |
|
1352 |
|
1353 if(!$pckg_path_name_array{$pckg_name}) # Check if package is not already in the table to avoid duplicates |
|
1354 { |
|
1355 #print "$pckg_name is not in the hash array, we need to add it\n"; |
|
1356 if($extracted_line =~ m;$pckg_path_extraction_pattern;) |
|
1357 { |
|
1358 $pckg_path = $1; |
|
1359 #print "Pckg path is: $pckg_path\n"; |
|
1360 } |
|
1361 if($extracted_line =~ m;$pckg_real_name_extraction_pattern;) |
|
1362 { |
|
1363 $pckg_real_name = $1; |
|
1364 #print "Pckg real name is: $pckg_real_name\n"; |
|
1365 } |
|
1366 # fill the tables |
|
1367 $pckg_path_name_array{$pckg_name} = $pckg_path; |
|
1368 $pckg_name_array{$pckg_name} = $pckg_real_name; |
|
1369 } |
|
1370 } |
|
1371 } |
|
1372 |
|
1373 my $local_value=""; |
|
1374 my @local_array_sorted; |
|
1375 |
|
1376 @local_array=keys (%pckg_path_name_array); |
|
1377 @local_array_sorted = sort { lc($a) cmp lc($b) } @local_array; |
|
1378 |
|
1379 # print "\n"; |
|
1380 # my $counter_to_remove=0; |
|
1381 # foreach $local_value (@local_array_sorted) |
|
1382 # { |
|
1383 #print "$counter_to_remove: The path for package $local_value is: $pckg_path_name_array{$local_value}\n"; |
|
1384 #print "$counter_to_remove:The real name for package $local_value is: $pckg_name_array{$local_value}\n"; |
|
1385 #print "$counter_to_remove: local_array_sorted[$counter_to_remove]:$local_array_sorted[$counter_to_remove]\n"; |
|
1386 #print "$local_array_sorted[$counter_to_remove]\n"; |
|
1387 #$counter_to_remove++; |
|
1388 # } |
|
1389 } |
|
1390 |
|
1391 # Function used to display one line at the time for an array |
|
1392 sub display_array_one_line_at_the_time |
|
1393 { |
|
1394 my (@table_to_display_one_line_at_the_time) = @_; |
|
1395 |
|
1396 #print "\nfct: display_array_one_line_at_the_time\n"; # Not displayed because you could think that is part of the table. As well it's easier to copy the name of the table and the contain wihtout the need to remove something. |
|
1397 |
|
1398 my $line_to_display; |
|
1399 |
|
1400 foreach $line_to_display (@table_to_display_one_line_at_the_time) |
|
1401 { |
|
1402 print "$line_to_display\n"; |
|
1403 } |
|
1404 } |
|
1405 |
|
1406 # Function used to display one line at the time for an hash array |
|
1407 sub display_hash_array_one_line_at_the_time |
|
1408 { |
|
1409 my (%hash_array_to_display_one_line_at_the_time) = @_; |
|
1410 |
|
1411 my @local_keys_array; |
|
1412 my @local_keys_array_sorted; |
|
1413 |
|
1414 #print "\nfct: display_hash_array_one_line_at_the_time\n"; # Not displayed because you could think that is part of the table. As well it's easier to copy the name of the table and the contain wihtout the need to remove something. |
|
1415 |
|
1416 my $line_to_display; |
|
1417 |
|
1418 @local_keys_array = keys (%hash_array_to_display_one_line_at_the_time); |
|
1419 @local_keys_array_sorted = sort { lc($a) cmp lc($b) } @local_keys_array; |
|
1420 |
|
1421 foreach $line_to_display (@local_keys_array_sorted) |
|
1422 { |
|
1423 print "$line_to_display = $hash_array_to_display_one_line_at_the_time{$line_to_display}\n"; |
|
1424 } |
|
1425 } |
|
1426 |
|
1427 # PDKs with build_bom.zip file in the default PDKs location 14-09-2009 |
|
1428 #Z:\Releases\PDK_2.0.e |
|
1429 #Z:\Releases\PDK_candidate_2.0.d_flat |
|
1430 #Z:\Releases\PDK_candidate_2.0e_FCL_27.78 |