All pastes #48773 Raw Edit

Anonymous

public text v1 · immutable
#48773 ·published 2006-04-09 17:36 UTC
rendered paste body
#!/usr/bin/perl


#     Copyright (C) 2003 Derek Kite
# 
#     This library is free software; you can redistribute it and/or
#     modify it under the terms of the GNU Library General Public
#     License as published by the Free Software Foundation; either
#     version 2 of the License, or (at your option) any later version.
# 
#     This library is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#     Library General Public License for more details.
# 
#     You should have received a copy of the GNU Library General Public License
#     along with this library; see the file COPYING.LIB.  If not, write to
#     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
#     Boston, MA 02111-1307, USA.
# 

# script to build statistics report
# parameters are start and end date
# writes out an xml file with the data in current directory

# cvs repository location path.
$repository = "/home/extra/kde_svn";

($start,$end) = @ARGV;


print "<?xml version=\"1.0\" ?>\n";
print "<statistics start=\"$start\" end=\"$end\">\n";



# assign hashes and variables for data

%authorlines = ();     #authorname,number
%authorcommits = ();
%authorfiles = ();
%modulecount = ();
%atomicmodule = ();
%atomicauthor = ();
$totallines = 0;
$totalcommits = 0;
$newfiles = 0;
$modfiles = 0;
$delfiles = 0;
$module = "";

sub esc_chars {
  # will change, for example, a!!a to a\!\!a
     @_[0] =~ s/([\; \<\>\*\|`\&\$\!\#\(\)\[\]\{\}:'"])/\\$1/g;
     return @_[0];
}


sub getmodule   {     #pathname
  my $p = @_[0];
  $p =~ /^\/([\w-\.]*)\/([\w-\.]*)\/{0,1}([\w-\.]*)\/{0,1}([\w-\.]*)/;
  if ($1 eq 'branches') {
    if ($2 eq 'KDE') {
      return $4;
    }
    return $2;
  }
  if ($1 eq 'trunk') {
    if ($2 eq 'KDE') {
      return $3;
    }
    return $2;
  }
  
  if ($1 eq 'tags')  {
    if ($2 eq 'KDE') {
      return $4;
    }
    return $3;
  }
  return "borked";
}


sub parsefilerevision  {#pass revision and filename
  my $rev = @_[0];
  my $fn = @_[1];
  chomp($fn);
  my $logstr = `svn log -r $rev file://$repository/$fn`;
  my @lines = split(/\n/,$logstr);
  foreach  my $i (@lines) {
    
# r4000 | coolo | 1998-01-08 04:51:06 -0800 (Thu, 08 Jan 1998) | 2 lines
  
    if ($i =~ /^r\d*\s\S\s(\S*)\s\S\s(\d*\D\d*\D\d*\D\d*\D\d*).*\|\s(\d*)/) {
      my $date = $2;
      my $author = $1;
      my $lines = $3;
    
      #   removed bot from statistics
      $modfiles++;
      $totallines += $lines;
      my $i = $authorlines{$author};
      $i += $lines;
      $authorlines{$author} = $i;
      $i = 0;
      $i = $authorfiles{$author};
      $i++;
      $authorfiles{$author} = $i;
   }
}
}      


sub parserevision  {  #pass revision, will extract list of files and attributes
  my $rev = @_[0];
  my $logstr = `svn log -v -r $rev file://$repository`;
  my @lines = split(/\n/,$logstr);
  $totalcommits++;
  my $incmodule = 0;
  foreach  my $i (@lines) {
    if ($i =~ /^r\d*\s\S\s(\S*)\s\S\s(\d*\D\d*\D\d*\D\d*\D\d*).*\|\s(\d*)/) {
      my $c = 0;
      $c = $authorcommits{$1};
      $c++;
      $authorcommits{$1} = $c;
    }
    if ($i =~ /^\s*(M|D|A)\s(.*)$/) {
      if ($1 eq 'M')  {
        parsefilerevision($rev,$2);
      }
      if ($1 eq 'A')  {
        $newfiles++;
      }
      if ($1 eq 'D')  {
        $delfiles++;
      }
      #modules
      my $m = getmodule($2);
      if ($incmodule == 0) {
        my $cm = $modulecount{$m};
        $cm++;
        $modulecount{$m} = $cm;
        $incmodule = 1;
      }
      my $c = $modulefilecount{$m};
      $c++;
      $modulefilecount{$m} = $c;
      
      
    }
  }
}


sub in_array  {  # pass array and scalar. returns 1 if true, 0 if false
  my $sc = pop(@_);
  foreach my $i (@_) {
    if ($i eq $sc) {return 1;}
  }
  return 0;
}




sub by_number {
	my @af = split(/\:/,$a);
	my @bf = split(/\:/,$b);
	if (@af[0] < @bf[0]) {
		return -1;
	} elsif (@af[0] == @bf[0]) {
		return 0;
	} elsif (@af[0] > @bf[0]) {
		return 1;
	}
}


for ($i = $start; $i <= $end; $i++) {
    parserevision($i);
  }


while (($module,$count) = each %modulecount)  {
	push(@modulelist, "$count:$module");
	}

@modulelist = sort by_number @modulelist;
@modulelist = reverse(@modulelist);


while (($author, $count) = each %authorcommits) {
	push(@authorclist, "$count:$author");
	}

@authorclist = sort by_number @authorclist;
@authorclist = reverse(@authorclist);


while (($author, $count) = each %authorlines) {
	push(@authorllist, "$count:$author");
	}

@authorllist = sort by_number @authorllist;
$authorcount = @authorclist;

print "<commit_overview>\n<totalcommits>$totalcommits</totalcommits>\n<totallines>$totallines</totallines>\n";
print "<newfiles>$newfiles</newfiles>\n<modfiles>$modfiles</modfiles>\n<numdevs>$authorcount</numdevs>\n";
    
 
#bugstats();
print "</commit_overview>\n";

#print "<i18nlist>\n";
#i18nstat();

#print "</i18nlist>\n";



print "<modulelist>\n";
foreach $imod (@modulelist) {
  my @ma = split(/:/,$imod);
  print "<module>\n<modulename>@ma[1]</modulename>\n";
  print "<moduleatomiccount>@ma[0]</moduleatomiccount>\n";
  print "<modulefilecount>$modulefilecount{@ma[1]}</modulefilecount>\n</module>\n";
}  
print "</modulelist>\n";

print "<authorlist>\n";
foreach $imod (@authorclist) {
  my @ma = split(/:/,$imod);
  if (@ma[1] eq 'scripty') {next;}
  print "<author>\n<authorname>@ma[1]</authorname>\n<authorfilecount>$authorfiles{@ma[1]}</authorfilecount>\n";
  print "<authoratomiccount>@ma[0]</authoratomiccount>";
  print "<authorlines>$authorlines{@ma[1]}</authorlines>\n";
  print "</author>\n";
}  
print "</authorlist>\n";
print "</statistics>";