code_churn/fbf_churn.pl
author William Roberts <williamr@symbian.org>
Fri, 27 Aug 2010 15:27:06 +0100
changeset 281 c62bd4f9dbce
parent 157 27cf0a88d449
permissions -rw-r--r--
Add delete_builds.pl - a utility for making space quickly on build machines This Perl script deletes some directories known to contain very large files first, before deleting the rest of the build which contains millions of small files. Given multiple builds, it will do this breadth first, so that lost of space is released quickly.

#! 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);