<html>
<head>
<title>$CVSHeader: www/eclipse/platform-ui/scripts/pde_contributions_csv.php,v 1.32 2008/06/02 21:09:57 darin Exp $</title>
</head>
<body>
<?php
require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_bugs_ro.class.php";
ini_set("display_errors", "true");
error_reporting (E_ALL);
$committerList = array("Michael Valenta" => array("IBM", ""), "Mike Pawlowski" => array("IBM", ""), "Paul Webster" => array("IBM", ""), "Andrew Niefer" => array("IBM", ""), "Wassim Melhem" => array("IBM", ""), "Curtis Windatt" => array("IBM", ""), "Olivier Thomann" => array("IBM", ""), "Darin Wright" => array("IBM", ""), "Michael Rennie" => array("IBM", ""), "Brian Bauman"=> array("IBM", ""), "Noam Chitayat"=> array("IBM", ""), "Chris Aniszczyk" => array("IBM", "") );
// the following bugs have been examined by hand and found to not be viable contributions
$exclusions = array();
$committerOverrides = array("170213" => "Wassim Melhem", "170941" => "Brian Bauman", "173447" => "Brian Bauman", "173793" => "Brian Bauman", "185502" => "Brian Bauman", "190717" => "Brian Bauman", "191365" => "Brian Bauman", "229453" => "Nick Boldt", "215760" => "Brian Bauman", "214511" => "Brian Bauman", "214457" => "Brian Bauman", "213255" => "Brian Bauman", "212755" => "Brian Bauman", "212745" => "Brian Bauman", "212744" => "Brian Bauman", "211754" => "Brian Bauman", "208967" => "Brian Bauman", "192232" => "Mike Pawlowski", "192232" => "Mike Pawlowski", "192259" => "Mike Pawlowski", "192267" => "Mike Pawlowski", "192275" => "Mike Pawlowski", "192296" => "Mike Pawlowski", "192329" => "Mike Pawlowski", "192330" => "Mike Pawlowski", "192517" => "Mike Pawlowski", "193385" => "Brian Bauman", "194529" => "Mike Pawlowski", "194650" => "Brian Bauman", "195281" => "Chris Aniszczyk", "195433" => "Brian Bauman", "195763" => "Brian Bauman", "196027" => "Mike Pawlowski", "196046" => "Mike Pawlowski", "196091" => "Mike Pawlowski", "196095" => "Wassim Melhem", "196226" => "Mike Pawlowski", "196227" => "Mike Pawlowski", "196240" => "Mike Pawlowski", "196335" => "Mike Pawlowski", "196675" => "Mike Pawlowski", "196685" => "Mike Pawlowski", "196734" => "Brian Bauman", "196735" => "Wassim Melhem", "196866" => "Wassim Melhem", "196874" => "Wassim Melhem", "196878" => "Wassim Melhem", "196879" => "Mike Pawlowski", "196882" => "Wassim Melhem", "197056" => "Wassim Melhem", "197077" => "Wassim Melhem", "197410" => "Wassim Melhem", "197821" => "Brian Bauman", "197905" => "Wassim Melhem", "198175" => "Brian Bauman", "198305" => "Wassim Melhem", "198309" => "Wassim Melhem", "198310" => "Wassim Melhem", "199101" => "Brian Bauman", "199134" => "Brian Bauman", "199149" => "Wassim Melhem", "199169" => "Brian Bauman", "200428" => "Brian Bauman", "200756" => "Brian Bauman", "201044" => "Brian Bauman", "201260" => "Mike Pawlowski", "201325" => "Brian Bauman", "201880" => "Chris Aniszczyk", "201980" => "Brian Bauman", "202011" => "Mike Pawlowski", "203993" => "Brian Bauman", "229453" => "Nick Boldt", "215760" => "Brian Bauman", "214511" => "Brian Bauman", "214457" => "Brian Bauman");
$contributorOverrides = array("195281" => "Danail Nachev");
$locationOverrides = array();
$includedMilestones = array("3.4", "3.4 M1", "3.4 M2", "3.4 M4", "3.4 M5", "3.4 M6", "3.4 M7", "3.4 RC1", "3.4 RC2", "3.4 RC3", "3.4 RC4");
$uniqueNames = array();
$uniqueCount = array();
$uniqueBugs = array();

$dbc 	= new DBConnectionBugs();
$dbh 	= $dbc->connect();
$rs = null;

//
// David M Williams
// Tim deBoer
// Raghu Srinivasan
// Phil Berkland
// kiril mitov

function count_addedlines( $data ) {
//$count = substr_count( $data, "\n+" );
$count = preg_match_all ('/\n\+/', $data, $matches );
return $count;
}
function count_newlines( $data ) {
$count = substr_count( $data, "\n" );
//$count = preg_match_all ('/\n\+/', $data, $matches );
return $count;
}
function countNewLines($myrow) {

$result = 0;
$count1 = preg_match( '/patch/', $myrow['filename'] );
if( $count1 > 0 ) {
$result = count_newlines($myrow['thedata']);
}
else
{
$count2 = preg_match( '/RCS file:/', $myrow['thedata'] );
if( $count2 > 0 ) {
$result = count_newlines($myrow['thedata']);
}
}
return $result;
}
function countAddedLines($myrow) {

$result = 0;
$count1 = preg_match( '/patch/', $myrow['filename'] );
if( $count1 > 0 ) {
$result = count_addedlines($myrow['thedata']);
}
else
{
$count2 = preg_match( '/RCS file:/', $myrow['thedata'] );
if( $count2 > 0 ) {
$result = count_addedlines($myrow['thedata']);
}
}
return $result;
}

function findPatchProjects($myrow) {

preg_match_all( '/RCS file: \/(?:(?:cvsroot){0,1}(?:home){0,1}){1}\/eclipse\/([A-Za-z0-9\-\.]+)\/[A-Za-z0-9\/]*/', $myrow['thedata'], $matches);
return $matches[1];
}

function checkProject($componenetLabel, $projectNumber, $component, $includes) {

global $dbc;
global $dbh;
global $rs;
global $committerList;
global $exclusions;
global $uniqueCount;
global $uniqueNames;
global $uniqueBugs;
global $committerOverrides;
global $contributorOverrides;
global $locationOverrides;

$buglist = array ();

$sql_info = "SELECT  bugs.bug_id as bug_id,
		bugs.bug_status as bug_status,
		bugs.resolution as bug_resolution,
		bugs.target_milestone as bug_target_milestone,
		bugs.status_whiteboard as status,
		bugs.short_desc as description,
		attachments.filename as filename,
		attachments.ispatch as ispatch,
        attachments.creation_ts as timestamp,
		attachmentProfiles.login_name as attachment_login_name,
        attachmentProfiles.realname as attachment_real_name,
        committerProfiles.realname as committer_real_name,
        attach_data.thedata as thedata,
		bugs.keywords as bug_keywords,
		bugs.component_id as component_id
    FROM bugs,attachments,profiles as attachmentProfiles, profiles as committerProfiles,attach_data
      WHERE attachments.bug_id = bugs.bug_id
      	  AND resolution = \"FIXED\"
          AND attachments.ispatch = 1
          AND attachments.isobsolete = 0
		  AND char_length(bugs.keywords) > 0
          AND bugs.product_id = $projectNumber
		  AND attachments.submitter_id = attachmentProfiles.userid
		  AND bugs.assigned_to = committerProfiles.userid
          AND attach_data.id = attachments.attach_id 
          AND component_id = $component
          ORDER BY bugs.bug_id, attachments.creation_ts DESC";

$rs = mysql_query($sql_info, $dbh);

while( $myrow  = mysql_fetch_assoc($rs) ) {
if( !array_key_exists($myrow['attachment_real_name'], $committerList) && !in_array($myrow['bug_id'], $exclusions) && !in_array($myrow['bug_id'], $uniqueBugs)) {
if (in_array($myrow['bug_target_milestone'],$includes)) {

array_push($uniqueBugs, $myrow['bug_id']);
$contributor =  $myrow['attachment_real_name'];
$contributorEmail =  $myrow['attachment_login_name'];
if (array_key_exists($myrow['bug_id'], $contributorOverrides)) {
	$pair = $contributorOverrides[$myrow['bug_id']];
	$contributorEmail = $pair[1];
	$contributor = $pair[0];
}
if ($contributor == null) {
	$contributor = $contributorEmail;
}
$committer = $myrow['committer_real_name'];
if (array_key_exists($myrow['bug_id'], $committerOverrides)) {
	$committer = $committerOverrides[$myrow['bug_id']];
}
if (strcmp($committer, $contributor) == 0) {
	$committer = "Chris Aniszczyk";
}


echo $componenetLabel . ",";
echo "https://bugs.eclipse.org/bugs/show_bug.cgi?id=" . $myrow['bug_id'] . ",";

echo str_replace("@","{at}", $contributor) . ",";

$count = countAddedLines($myrow);
echo ($count < 100 ? "small" :  $count) . ",";

echo $committer . ",";
echo str_replace(",", " ", $myrow['description']);
echo "\n";
}
}


}

flush();
}

checkProject("API Tools", 2, 883, $includedMilestones);

checkProject("Build", 2, 21, $includedMilestones);

checkProject("Doc", 2, 23, $includedMilestones);

//checkProject("Incubators", 2, 602, $includedMilestones);

checkProject("UI", 2, 22, $includedMilestones);

$dbc->disconnect();

$rs 		= null;
$dbh 		= null;
$dbc 		= null;


exit();
?>