code_churn/fbf_churn.pl
author Simon Howkins <simonh@symbian.org>
Fri, 06 Nov 2009 12:10:52 +0000
changeset 99 5adea361d896
parent 55 7b39c2ae2526
child 158 27cf0a88d449
permissions -rw-r--r--
Bug 881: "Automatic creation of release note content broken by config change" Added a new option to allow the caller to specify where the publish location is. Minor improvements to formatting of output. Turned on warnings, and fixed most of those that appeared. Greatly simplified the checking of the script arguments. Removed code which was noted to be unnecessary, and was. Declared some variables more closely to the code that uses them.

#! perl -w

# Copyright (c) 2009 Symbian Foundation Ltd
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
#
# Initial Contributors:
# Symbian Foundation Ltd - initial contribution.
# 
# Contributors:
#
# Description:
#

use strict;
use Getopt::Long;

use FindBin;
#my $churn_core = "D:\\mirror\\churn_core.pl";
my $churn_core = "$FindBin::Bin\\churn_core.pl";
my $churn_output_temp = "$FindBin::Bin\\fbf_churn_output";
mkdir $churn_output_temp;

my $path = $FindBin::Bin;
$path =~ s/\//\\/g;
my $clone_packages = "$path\\..\\clone_packages\\clone_all_packages.pl";


sub Usage($)
  {
  my ($msg) = @_;
  
  print "$msg\n\n" if ($msg ne "");
  
	print <<'EOF';

	
fbf_churn.pl - simple script for calculating code churn in between two revisions 
or labels for a package. This script can also be used to calculate code size for 
a package.

When used without a package name or filter, this script runs for all the packages
in the BOM (build-info.xml) file supplied to it. 

Important: 
  This script uses clone_all_packages.pl which clones all repositories listed in 
  the BOM or pull changes into a previously cloned repository.
  
  This script uses its accompayning script churn_core.pl - which should be
  present in the same directory as this script.

Limitations:
  If a BOM is not supplied to the script using the -bom option, then the script 
  runs on the package locations inside both MCL and FCL producing two results
  for a single package. For running the script for calculating code churn between 
  two release buils (using labels) or for calculating code size for a release build,
  it is essential that a BOM (preferably for the newer build) is passed as an 
  argument using the -bom option.
  

Options:

-o --old		old revision or label for a package/respoitory

-n --new		new revision or label for a package/respoitory

--rev			revision for package/respoitory - Use this while calculating code size for a single package
			
--label			revision tag for package or release build - Use this while calculating code size

-bom --bom		build-info.xml files supplied with Symbian PDKs

-verbose		print the underlying "clone_all_packages" & "hg" commands before executing them

-help			print this help information

-package <RE>   	only process repositories matching regular expression <RE>

-filter <RE>    	only process repositories matching regular expression <RE>

EOF
  exit (1);  
  }

print "\n\n==Symbian Foundation Code Churn Tool v1.0==\n\n";



my $old = "null";
my $new = "";
my $filter = "";
my $codeline = "";
my $package = "";
my $licence = "";
my $packagelist = "";
my $verbose = 0;
my $help = 0;

sub do_system
	{
	my (@args) = @_;
	print "* ", join(" ", @args), "\n" if ($verbose);
	return system(@args);
	}

# Analyse the command-line parameters
if (!GetOptions(
    "n|new-rev|new-label|label|rev=s" => \$new,
    "o|old-rev|old-label=s" => \$old,
    "f|filter=s" => \$filter,
    "p|package=s" => \$filter,
    "cl|codeline=s" => \$codeline,
    "li|licence=s" => \$licence,
	"bom|bom=s" => \$packagelist,
	"v|verbose" => \$verbose,
	"h|help" => \$help,
    ))
  {
  Usage("Invalid argument");
  }
  
Usage("") if ($help);
Usage("Too few arguments....use at least one from -n|new-rev|new-label|label|rev or -bom") if ($new eq "" && $packagelist eq "");
#Usage("Too many arguments") if ($new ne "" && $packagelist ne "");


if ($old eq 'null')
  {
    print "\nCode size calculation....\n";		  
  }
else
  {
    print "\nCode churn calculation....\n";		  
  }

  
my @packagelistopts = ();
@packagelistopts = ("-packagelist", $packagelist) if ($packagelist ne "");

my @verboseopt = ();
@verboseopt = "-v" if ($verbose);

my $new_rev = $new;
$new_rev = "%REV%" if ($new_rev eq "");

#TO_DO: Locate clone_all_packages relative to the location of this script.
#TO_DO: Remove references to absolute paths, change to relative paths.
do_system($clone_packages,@verboseopt,"-mirror","-filter","$licence.*$codeline.*$filter",@packagelistopts,"-exec","--",
   "hg","--config","\"extensions.hgext.extdiff=\"","extdiff","-p",$churn_core,"-o",$churn_output_temp,
   "-r","$old","-r","$new_rev");

exit(0);