blob: fc22e672ddf0ee098dc690ed15c2e70df7468c11 [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2008-2019 Eclipse Foundation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eclipse Foundation - Initial API and implementation
* Antoine Toulmé - Bug 248917
* Motorola - Change SVN map file format to follow SVN PDE
* Gustavo de Paula - Bug 261252
* Kit Lo (IBM) - Bug 266250, Map file processor not running properly on live server
* Kit Lo (IBM) - Bug 272176, Support "bundle" element type in map file
* Kit Lo (IBM) - Bug 257332, NLS warnings appear unnecessarily in runtime log
* Kit Lo (IBM) - Bug 302834, Add plugin filtering supports to map files process
* Kit Lo (IBM) - [382800] CSSUIPluginResources.properties is missing on translator tool
* Denis Roy (Eclipse Foundation) - Bug 550544 - Babel server is not ready for PHP 7
*******************************************************************************/
$temp_dir = "/tmp/tmp-babel/";
$files = array();
$files_collected = array(array());
header("Content-type: text/plain");
include("global.php");
InitPage("");
$headless = 0;
if (!isset($User)) {
echo "User not defined - running headless\n";
$User = getGenieUser();
$headless = 1;
}
require(dirname(__FILE__) . "/../classes/file/file.class.php");
$html_spacer = " ";
global $dbh;
$temp_downloads_dir = $temp_dir . "downloads/";
if (!is_dir($temp_downloads_dir)) {
mkdir($temp_downloads_dir) || die("Cannot create a working directory");
}
chdir($temp_downloads_dir) || die("Cannot use working directory");
$sql = "SELECT * FROM map_files AS m
INNER JOIN release_train_projects AS r ON r.project_id = m.project_id AND r.version = m.version
INNER JOIN release_trains AS t on t.train_id = r.train_id
WHERE m.is_active = 1 AND m.is_map_file = 1 AND t.is_active = 1";
$rs_maps = mysqli_query($dbh, $sql);
while ($myrow_maps = mysqli_fetch_assoc($rs_maps)) {
$location = $myrow_maps['location'];
$project_id = $myrow_maps['project_id'];
$version = $myrow_maps['version'];
$properties_file_count = 0;
# Parse each properties file for this project version
echo "Start processing properties files in project $project_id version $version...\n";
echo " Map file location: $location\n";
# Collect all files for this project version
if (!(isset($files_collected[$project_id]) && isset($files_collected[$project_id][$version]))) {
$files_collected[$project_id][$version] = 1;
$sql = "SELECT * FROM files WHERE project_id = \"$project_id\" AND version = \"$version\"";
$rs_files = mysqli_query($dbh, $sql);
while($myrow_files = mysqli_fetch_assoc($rs_files)) {
$file = new File();
$file->project_id = $myrow_files['project_id'];
$file->version = $myrow_files['version'];
$file->name = $myrow_files['name'];
$file->plugin_id = $myrow_files['plugin_id'];
$file->file_id = $myrow_files['file_id'];
$file->is_active = $myrow_files['is_active'];
$files[$file->file_id] = $file;
}
}
# Collect all plugin exclude patterns for this project version
$sql = "SELECT pattern FROM plugin_exclude_patterns WHERE project_id = \"$project_id\" AND version = \"$version\"";
$rs_patterns = mysqli_query($dbh, $sql);
$patterns = Array();
# Add default exclude patterns
$patterns[] = "/^.*\/feature.properties$/";
$patterns[] = "/^.*\/build.properties$/";
$patterns[] = "/^.*\/pom.properties$/";
$patterns[] = "/^.*\.source\/.*$/";
$patterns[] = "/^.*\.test\/.*$/";
$patterns[] = "/^.*\.tests\/.*$/";
$patterns[] = "/^.*\.testing\/.*$/";
while ($myrow_patterns = mysqli_fetch_assoc($rs_patterns)) {
$patterns[] = $myrow_patterns['pattern'];
}
# echo "Processing map file: " . $myrow_maps['filename'] . " in location: " . $myrow_maps['location'] . "\n";
$tmpdir = $temp_downloads_dir . str_replace(" ", "_", $myrow_maps['project_id']);
if (is_dir($tmpdir)) {
# zap the directory to make sure CVS versions don't overlap
exec("rm -rf " . $tmpdir);
}
mkdir($tmpdir) || die("Cannot create working directory $tmpdir !");
chdir($tmpdir) || die("Cannot write to $tmpdir !");
$h = fopen($myrow_maps['location'], "rb");
$file_contents = stream_get_contents($h);
fclose($h);
$file_contents = preg_replace("/\r\n?/", "\n", $file_contents);
$aLines = split("\n", $file_contents);
foreach ($aLines as $line) {
$line = trim($line);
# $line looks something like this:
# See http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.pde.doc.user/guide/tasks/pde_fetch_phase.htm for more info
# plugin@org.eclipse.emf.query=v200802262150,:pserver:anonymous@dev.eclipse.org:/cvsroot/modeling,,org.eclipse.emf/org.eclipse.emf.query/plugins/org.eclipse.emf.query
# plugin@org.eclipse.equinox.frameworkadmin=CVS,tag=R34x_v20080910,cvsRoot=:pserver:anonymous@dev.eclipse.org:/cvsroot/rt,path=org.eclipse.equinox/p2/bundles/org.eclipse.equinox.frameworkadmin
# bundle@org.eclipse.wst.xml.xpath.ui=v200902122100,:pserver:anonymous@dev.eclipse.org:/cvsroot/webtools,,sourceediting/plugins/org.eclipse.wst.xml.xpath.ui
# Bug 272176 - Support "bundle" element type in map file
if (preg_match("/^(plugin|bundle)/", $line)) {
# echo $html_spacer . "Processing line: " . $line . "\n";
$aParts = split("=", $line);
$aElements = split("@", $aParts[0]);
$plugin_id = $aElements[1];
# Bug 272176 - Support "bundle" element type in map file
if ($aElements[0] == "plugin" || $aElements[0] == "bundle") {
$plugin = $aParts[1];
if ($aParts[1] == "CVS,tag") {
$tagPart = split(",", $aParts[2]);
$cvsRootPart = split(",", $aParts[3]);
$plugin = $tagPart[0] . "," . $cvsRootPart[0] . "," . $aParts[4];
} elseif ($aParts[1] == "SVN,url") {
# Support STEM project SVN syntax
# plugin@org.eclipse.stem.core=SVN,url=http://dev.eclipse.org/svnroot/technology/org.eclipse.stem,tag=trunk,path=core/org.eclipse.stem.core
#
# maps $plugin to:
# SVN,<tagPath>[:revision],<svnRepositoryURL>,<preTagPath>,<postTagPath>
$svnRootPart = split(",", $aParts[2]);
$svnTagPart = split(",", $aParts[3]);
$plugin = "SVN," . $svnTagPart[0] . "," . $svnRootPart[0] . ",," . $aParts[4];
}
$aStuff = parseLocation($plugin);
$tagstring = "";
if (isset($aStuff['tag'])) {
$tagstring = "-r " . $aStuff['tag'] . " ";
}
if (isset($aStuff['plugin'])) {
if ($aStuff['plugin'] != "") {
$aElements[1] = $aStuff['plugin'];
}
}
$command = "";
# determine CVS or SVN
if (isset($aStuff['cvsroot'])) {
$command = "cvs -q -d " . $aStuff['cvsroot'] . " co " . $tagstring . $aElements[1];
} elseif (isset($aStuff['svnroot'])) {
$command = "/usr/local/bin/svn co " . $aStuff['svnroot'] . " --config-dir /tmp";
}
# echo $html_spacer . $html_spacer ."--> " . $command . "\n";
$out = "";
if ($command != "") {
$out = shell_exec($command);
}
# process the output lines for .properties
$aOutLines = split("\n", $out);
foreach ($aOutLines as $out_line) {
$out_line = trim($out_line);
# remove SVN's multiple spaces
$out_line = preg_replace("/\s+/", " ", $out_line);
# echo $html_spacer . $html_spacer . "CVS out line: " . $out_line . "\n";
# CVS:
# U org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/dtd/util/AntDTDUtilMessages.properties
# SVN:
# A org.eclipse.stp.bpmn/trunk/org.eclipse.stp.bpmn/org.eclipse.stp.eid/trunk/org.eclipse.stp.eid.generator.test/build.properties
if (preg_match("/\.properties$/", $out_line)) {
# this is a .properties file!
$repository_file_name = trim(substr($out_line, 2));
$file_name = $repository_file_name;
# remove optional outer dirs, e.g. 'pde/ui/'
$pos = strripos($file_name, 'org.');
if ($pos !== false) {
$file_name = substr($file_name, $pos);
}
$pos = strripos($file_name, 'com.');
if ($pos !== false) {
$file_name = substr($file_name, $pos);
}
$pattern =
'/^
(.*?)? # $1 plugin name
\/ # slash
(.*?\/)? # $2 dir name
([^\/]+[.]properties) # $3 file name
$/ix';
$plugin_name_string = preg_replace($pattern, '$1', $file_name);
$dir_name_string = preg_replace($pattern, '$2', $file_name);
$file_name_string = preg_replace($pattern, '$3', $file_name);
# remove optional source dir, e.g. 'src' or 'src_ant'
$pos = stripos($dir_name_string, 'org/');
if ($pos !== false) {
$dir_name_string = substr($dir_name_string, $pos);
}
$pos = strripos($dir_name_string, 'com/');
if ($pos !== false) {
$dir_name_string = substr($dir_name_string, $pos);
}
$file_name = $plugin_name_string . "/" . $dir_name_string . $file_name_string;
$file_id = File::getFileID($file_name, $myrow_maps['project_id'], $myrow_maps['version']);
$properties_file_count = $properties_file_count + 1;
# Match plugin exclude list
$match = false;
foreach ($patterns as $pattern) {
if (preg_match($pattern, $file_name)) {
$match = true;
break;
}
}
if (!$match) {
if ($file_id > 0 && $files[$file_id] != null) {
# Existing file
$file = $files[$file_id];
$file->is_active = 1;
unset($files[$file_id]);
} else {
# New file
$file = new File();
$file->project_id = $myrow_maps['project_id'];
$file->version = $myrow_maps['version'];
$file->name = $file_name;
$file->plugin_id = $plugin_id;
$file->is_active = 1;
}
if (!$file->save()) {
echo $html_spacer . $html_spacer . $html_spacer . $html_spacer . "***ERROR saving file: " . $file_name . "\n";
} else {
$file->parseProperties(file_get_contents($repository_file_name));
echo " $file_name\n";
}
} else {
echo " !!! Excluding $file_name\n";
}
}
}
}
}
}
echo "Done processing " . $properties_file_count . " properties files in project $project_id version $version\n\n";
}
# Deactivate the rest of the files
echo "Start deactivating inactive properties files in all projects above...\n";
foreach ($files as $file) {
if ($file->is_active == 1) {
$file->is_active = 0;
if (!$file->save()) {
echo $html_spacer . $html_spacer . $html_spacer . $html_spacer . "***ERROR saving file: " . $file->name . "\n";
}
echo " " . $file->name . "\n";
} else {
unset($files[$file->file_id]);
}
}
echo "Done deactivating " . sizeof($files) . " inactive properties files in all projects above\n\n";
if (is_dir($temp_downloads_dir)) {
exec("rm -rf $temp_downloads_dir");
}
if ($headless) {
$User = null;
}
echo "Done\n";
function parseLocation($in_string) {
# in_string looks something like this:
# v_832,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,
# v20080204,:pserver:anonymous@dev.eclipse.org:/cvsroot/birt,,source/org.eclipse.birt.report.designer.core
# v200802262150,:pserver:anonymous@dev.eclipse.org:/cvsroot/modeling,,org.eclipse.emf/org.eclipse.emf.query/plugins/org.eclipse.emf.query
# SVN,tags/1.0M5,http://dev.eclipse.org/svnroot/dsdp/org.eclipse.mtj,,features/org.eclipse.mtj
# svn://dev.eclipse.org/svnroot/stp/org.eclipse.stp.bpmn/trunk/
$aTheseElements = array();
$aLocation = split(",", $in_string);
foreach($aLocation as $location_part) {
# TAG
# Bug 257332, NLS warnings appear unnecessarily in runtime log
if (preg_match("/^[0-9a-zA-Z_]+/", $location_part) && !isset($aTheseElements['cvsroot'])) {
$aTheseElements['tag'] = $location_part;
}
# CVSROOT
if (preg_match("/^:.*:.*@.*:\//", $location_part)) {
$aTheseElements['cvsroot'] = $location_part;
}
# SVNROOT
# SVN,<tagPath>[:revision],<svnRepositoryURL>,<preTagPath>,<postTagPath>
# maps to: svn://<svnRepositoryURL>/<preTagPath>/<tagPath>/<postTagPath>
if (preg_match("/^(http|svn):\/\//", $location_part)) {
$location_part = str_replace("http", "svn", $location_part);
if ($aLocation[3] == ' ' || $aLocation[3] == '') {
$aTheseElements['svnroot'] = $location_part . "/" . $aLocation[1] . "/" . $aLocation[4];
} else {
$aTheseElements['svnroot'] = $location_part . "/" . $aLocation[3] . "/" . $aLocation[1] . "/" . $aLocation[4];
}
}
}
$aTheseElements['plugin'] = substr($in_string, strrpos($in_string, ",") + 1);
return $aTheseElements;
}
?>