code_churn/fbf_churn.pl
author Simon Howkins <simonh@symbian.org>
Wed, 14 Apr 2010 12:58:22 +0100
changeset 219 d57b367400c0
parent 157 27cf0a88d449
permissions -rw-r--r--
Updated release notes generation: Added copyright message Proper command line parsing Usage message if inputs are not right Added explanatory preamble to output "NEW" FCLs are marked as such Merge changesets are included in output

#! 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 $mirror = 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 @mirroropt = ();
@mirroropt = "-mirror" if ($mirror);

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,@mirroropt,"-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);