releaseAutomation/fcls4releasenotes.pl
changeset 79 ce6215be051a
child 87 97b833888afe
equal deleted inserted replaced
78:fe1b7f0a1e13 79:ce6215be051a
       
     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