<?php
/******************************************************************************
 * Copyright (c) 2013, 2014 IBM Corporation 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:
*    IBM Corporation - initial implementation
****************************************************************************/

function loadDirSimple($dir, $ext, $type) // 1D array, not 2D
{
	$stuff = array();

	if(is_dir($dir) && is_readable($dir))
	{
		$handle = opendir($dir);
		while(($file = readdir($handle)) !== false)
		{
			if(preg_match("/$ext$/", $file) && !preg_match("/^\.{1,2}$/", $file))
			{
				if(($type == "d" && is_dir("$dir/$file")) ||($type == "f" && is_file("$dir/$file")))
				{
					$stuff[] = $file;
				}
			}
		}
		closedir($handle);
	}
	else
	{
		global $hadLoadDirSimpleError;
		if(!$hadLoadDirSimpleError)
		{
			$issue =(!is_dir($dir) ? "NOT FOUND" :(!is_readable($dir) ? "NOT READABLE" : "PROBLEM"));
			print "<p>Directory ($dir) <b>$issue</b> on mirror: <b>" . $_SERVER["HTTP_HOST"] . "</b>!</p>";
			print "<p>Please report this error to <a href=\"mailto:webmaster@eclipse.org?Subject=Directory ($dir) $issue in scripts.php::loadDirSimple() on mirror " . $_SERVER["HTTP_HOST"] . "\">webmaster@eclipse.org</a>, or make directory readable.</p>";
			$hadLoadDirSimpleError = 1;
		}
	}

	return $stuff;
}

/* TODO: remove this when we upgrade php to >= 4.3.0 everywhere */
if(!function_exists("file_get_contents"))
{
	function file_get_contents($file)
	{
		return(is_file($file) ? join("", file($file)) : "");
	}
}

function project_name($proj)
{
	global $projects, $projectname;

	if (isset($projects))
	{
		$tmp = array_flip($projects);
		$proj = preg_replace("#^/#", "", $proj);
		return isset($tmp[$proj]) ? $tmp[$proj] :(isset($tmp[$projectname]) ? $tmp[$projectname] : "");
	}
	else
	{
		return strtoupper($proj);
	}

}

function debug($str, $level = 0)
{
	global $debug;

	if($debug > $level)
	{
		print "<div class=\"debug\">$str</div>\n";
	}
}

function debug_r($str, $header = "", $footer = "", $level = 0, $isPreformatted = false)
{
	global $debug;

	if($debug > $level)
	{
		if($header)
		{
			print "<div class=\"debug\">";
			print $header;
			print "</div>\n";
		}
		print "<div class=\"debug\">";
		print $isPreformatted ? "<pre><small>" : "";
		print_r($str);
		print $isPreformatted ? "</small></pre>" : "";
		print "</div>\n";
		if($footer)
		{
			print "<div class=\"debug\">";
			print $footer;
			print "</div>\n";
		}
	}
}

function domainSuffix($domain)
{
	return preg_replace("/.*([^\.]+\.[^\.]+)$/", "$1", $domain);
}

/* convert a wiki category page into a series of <li> items */
function wikiCategoryToListItems($category)
{
	$wiki_contents = "";

	// insert wiki content
	$host = "wiki.eclipse.org";
	$url = "/Category:" . $category;

	$header = "Host: $host\r\n";
	$header .= "User-Agent: PHP Script\r\n";
	$header .= "Connection: close\r\n\r\n";

	$fp = fsockopen($host, 80, $errno, $errstr, 30);
	if(!$fp)
	{
		$out .= "<li><i>$errstr ($errno)</i></li>\n";
	}
	else
	{
		fputs($fp, "GET $url HTTP/1.1\r\n");
		fputs($fp, $header);
		while(!feof($fp))
		{
			$wiki_contents .= fgets($fp, 128);
		}
		fclose($fp);
	}

	$out = "";
	if($wiki_contents)
	{
		$m = null;
		if(preg_match("#<div id=\"mw-pages\">(.+)</div>[ \t\n]*<div class=\"printfooter\">#s", $wiki_contents, $m))
		{
			$links = null;
			if(preg_match_all("#<a href=\"([^\"]+)\" title=\"([^\"]+)\">([^<]+)</a>#", $m[1], $links, PREG_SET_ORDER))
			{
				foreach($links as $z)
				{
					$out .= "<li><a href=\"http://wiki.eclipse.org/$z[1]\" title=\"$z[2]\">$z[3]</a></li>\n";
				}
			}
		}
	}
	return $out;
}

function getProjectFromPath($projectname)
{
	$m = null;
	return preg_match("#/" . $projectname . "/([^/]+)/build/.+#", $_SERVER["PHP_SELF"], $m) ? $m[1] :(preg_match("#/(" .
			$projectname . ")/build/.+#", $_SERVER["PHP_SELF"], $m) ? $m[1] : "");
}

function cvsminus($rev)
{
	if(preg_match("/^1\.1$/", $rev)) // "1.10" == "1.1" returns true, curiously enough
	{
		return $rev;
	}
	else
	{
		if(preg_match("/\.1$/", $rev))
		{
			return preg_replace("/^(\d+\.\d+)\..+$/", "$1", $rev);
		}
		else
		{
			return preg_replace("/^(.+\.)(\d+)$/e", "\"$1\" . ($2 - 1);", $rev);
		}
	}
}

function changesetForm($bugid = "")
{
	?>
<form action="http://www.eclipse.org/modeling/emf/news/changeset.php"
	method="get" target="_blank">
	<p>
		<label for="bugid">Bug ID: </label><input size="7" type="text"
			name="bugid" id="bugid" value="<?php print $bugid; ?>" /> <input
			type="submit" value="Go!" />
	</p>
	<p>
		<a href="javascript:void(0)"
			onclick="javascript:this.style.display = 'none'; document.getElementById('changesetinfo').style.display = 'block';">How
			does this work?</a>
	</p>
	<div id="changesetinfo" style="display: none">
		<p>Use this form to generate a bash shell script which can be run
			against the projects and plugins in your workspace to produce a patch
			file showing all changes for a given bug.</p>
		<p>
			The requested bug must be indexed in the <a
				href="http://www.eclipse.org/modeling/searchcvs.php?q=190525">Search
				CVS</a> database. Download the generated script for more
			information. If the script is empty, then the bug was not found.
		</p>
	</div>
</form>
<?php

}

function getDownloadScript()
{
	global $projectname;
	if(strstr($projectname, "/") !== false)
	{
		list($topProj, $parentProj) = explode("/", $projectname); # modeling, emf
	}
	else
	{
		list($topProj, $parentProj) = array("NONE", $projectname); # NONE, gef
	}

	# if this is a Modeling page, use /modeling/download.php;
	# if this is a GEF page, use /gef/download.php
	# if /foo/download.php doesn't exist, revert to /downloads/download.php
	$dlScriptFile = $_SERVER["DOCUMENT_ROOT"] . "/" .($topProj == "NONE" ? $parentProj : $topProj) . "/download.php";
	#print "[$dlScriptFile =? " . is_file($dlScriptFile) . "]<br>";
	if(is_file($dlScriptFile))
	{
		$downloadScript = "http://www.eclipse.org/" .($topProj == "NONE" ? $parentProj : $topProj) . "/download.php?file=";
	}
	else
	{
		$downloadScript = "http://www.eclipse.org/downloads/download.php?file=";
	}
	return $downloadScript;
}

/* thanks to http://www.php.net/manual/en/function.filesize.php#80995 */
function dirsize($path)
{
	$dirsize = exec("du -s $path");
	if($dirsize)
	{
		$dirsize = explode(" ", $dirsize);
		return($dirsize[0] - 0) * 1024;
	}
	if(!is_dir($path))
	{
		return filesize($path);
	}
	$size = 0;
	foreach(scandir($path) as $file)
	{
		if($file != '.' && $file != '..')
		{
			$size += dirsize($path . '/' . $file);
		}
	}
	return $size;
}

function pretty_size($bytes)
{
	$sufs = array("B", "K", "M", "G", "T", "P"); //we shouldn't be larger than 999.9 petabytes any time soon, hopefully
	$suf = 0;

	while($bytes >= 1000)
	{
		$bytes /= 1024;
		$suf++;
	}

	return sprintf("%3.1f%s", $bytes, $sufs[$suf]);
}

?>
