Home | History | Annotate | Download | only in projectName
      1 <?php
      2 require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); $App = new App(); $Nav = new Nav(); $Menu = new Menu(); include($App->getProjectCommon());
      3 ob_start();
      4 
      5 include("includes/db.php");
      6 
      7 $pagesize = 25; //results per page
      8 $scroll = 5; //+- pages to show in nav
      9 $days = 7;
     10 $page = (preg_match("/^\d+$/", $_GET["p"]) ? $_GET["p"] : 1);
     11 $offset = ($page - 1) * $pagesize;
     12 
     13 $where = "WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL $days DAY)";
     14 $order = "ORDER BY `date` DESC";
     15 
     16 $extraf = array(
     17 	array("regex" => "/author: ?(\S+)/", "sql" => "`author` LIKE '%%%s%%'", "sqlpart" => "where"),
     18 	array("regex" => "/file: ?(\S+)/", "sql" => "`cvsname` LIKE '%%%s%%'", "sqlpart" => "where"),
     19 	array("regex" => "/days: ?(\d+)/", "sql" => "`date` >= DATE_SUB(CURDATE(), INTERVAL %d DAY)", "sqlpart" => "where"),
     20 	array("regex" => "/(?:project|module): ?(\S+)/", "sql" => "`project` LIKE '%s'", "sqlpart" => "where"),
     21 	array("regex" => "/branch: ?(\S+)/", "sql" => "`branch` LIKE '%%%s%%'", "sqlpart" => "having") //is a calculated value, won't work in WHERE
     22 );
     23 
     24 $q = (get_magic_quotes_gpc() ? $_GET["q"] : addslashes($_GET["q"]));
     25 $extra = array("where" => array(), "having" => array());
     26 foreach ($extraf as $z)
     27 {
     28 	while (preg_match($z["regex"], $q, $regs))
     29 	{
     30 		array_push($extra[$z["sqlpart"]], sprintf($z["sql"], $regs[1]));
     31 		$q = preg_replace($z["regex"], "", $q);
     32 	}
     33 }
     34 
     35 $regs = array();
     36 /* this *could* be put into $extraf, but it would change the semantics slightly, in that any number searched for would be treated as a bug #, which i think is undesirable */
     37 if (preg_match("/^\s*\[?(\d+)\]?\s*$/", $_GET["q"], $regs))
     38 {
     39 	$_GET["q"] = $regs[1];
     40 	$where = "WHERE `bugid` = $regs[1]";
     41 	$et = "Bug #";
     42 }
     43 else if (preg_match("/(\S)/", $q, $regs) || sizeof($extra["where"]) + sizeof($extra["having"]) > 0)
     44 {
     45 	$match = "'1'";
     46 	if (sizeof($regs) > 0)
     47 	{
     48 		$match = "MATCH(`message`) AGAINST('$q'" . (preg_match("/\".+\"/", $q) ? " IN BOOLEAN MODE" : "") . ")";
     49 	}
     50 	$where = "WHERE " . ($match ? $match : "1");
     51 	$where .= (sizeof($extra["where"]) > 0 ? " AND " . join($extra["where"], " AND ") : "");
     52 	$having = (sizeof($extra["having"]) > 0 ? " HAVING " . join($extra["having"], " AND ") : "");
     53 	$ec = ", $match AS `relevance`";
     54 	$order = "ORDER BY `relevance` DESC, `date` DESC";
     55 }
     56 ?>
     57 <div id="midcolumn">
     58 <div class="homeitem3col">
     59 	<h3>Search</h3>
     60 	<div id="searchdiv">
     61 		<form action="" method="get">
     62 			<input type="text" size="60" id="q" name="q"<?php print ($_GET["q"] ? " value=\"" . sanitize($_GET["q"], "text") . "\"" : ""); ?>/>
     63 			<input type="submit" value="Go!"/>
     64 		</form>
     65 	</div>
     66 </div>
     67 <?php
     68 
     69 /* 1.1.2.x <- 1.1.0.2 = branch tag, likewise, 1.1.4.x <- 1.1.0.4 = branch tag, so dynamically rewrite a.b.c.d to a.b.0.c to find the branch tag */
     70 $branch = "IF(`revision` LIKE '%.%.%.%', (SELECT `tagname` FROM `tags` NATURAL JOIN `filetags` WHERE `fid` = `ofid` AND `revision` = CONCAT(SUBSTRING_INDEX(`orev`, '.', 2), '.0.', SUBSTRING_INDEX(SUBSTRING_INDEX(`orev`, '.', -2), '.', 1))), 'HEAD')";
     71 $sql = "SELECT SQL_CALC_FOUND_ROWS `cvsname`, `revision`, `date`, `author`, `message`, `keyword_subs`, `bugid`, `revision` AS `orev`, `fid` AS `ofid`, $branch AS `branch`$ec FROM `cvsfiles` NATURAL JOIN `commits` NATURAL LEFT JOIN `bugs` $where GROUP BY `fid`, `revision`, `bugid` $having $order LIMIT $offset, $pagesize";
     72 $result = wmysql_query($sql);
     73 
     74 $count = wmysql_query("SELECT FOUND_ROWS()"); //mysql_num_rows() doesn't do what we want here
     75 $row = mysql_fetch_row($count);
     76 $rows = $row[0];
     77 
     78 $title = "<span>$rows results total</span>Showing results " . ($offset + 1) . "-" . ($offset + $pagesize > $rows ? $rows : $offset + $pagesize) . " for " . ($_GET["q"] == "" ? "last $days days of commits" : "$et" . sanitize($_GET["q"], "text"));
     79 $title = ($rows == 0 ? "No results found for " . sanitize($_GET["q"], "text") . "" : $title);
     80 
     81 print "<div class=\"homeitem3col\">\n";
     82 print "<h3>$title</h3>\n";
     83 
     84 dopager($rows, $page, $pagesize);
     85 
     86 print "<ul>\n";
     87 
     88 while ($row = mysql_fetch_assoc($result))
     89 {
     90 	$file = basename($row["cvsname"], ",v");
     91 	$row["cvsname"] = preg_replace("#^/cvsroot/[^\/]+/(.+),v$#", "$1", $row["cvsname"]);
     92 	print "<li>\n";
     93 	print "<div>{$row['date']}</div>";
     94 	print ($row["bugid"] ? "[<a href=\"https://bugs.eclipse.org/bugs/show_bug.cgi?id={$row['bugid']}\">{$row['bugid']}</a>] " : "");
     95 	print "<a href=\"" . cvsfile($row["cvsname"]) . "\"><abbr title=\"{$row['cvsname']}\">$file</abbr></a> ({$row['branch']} " . showrev($row['revision'], $row["cvsname"]) . ")";
     96 	print "<ul>\n";
     97 	print "<li><div>{$row['author']}</div>" . pretty_comment($row["message"], $q) . "</li>";
     98 	print "</ul>\n";
     99 	print "</li>\n";
    100 }
    101 print "</ul>\n";
    102 
    103 dopager($rows, $page, $pagesize);
    104 
    105 print "</div>\n";
    106 print "</div>\n";
    107 mysql_close($connect);
    108 ?>
    109 <div id="rightcolumn">
    110 	<div class="sideitem">
    111 		<h6>Help</h6>
    112 		<p><a href="http://wiki.eclipse.org/index.php/Search_CVS">Consult the wiki</a>, or try these examples:</p>
    113 		<ul>
    114 			<li><a href="?q=%5B155286%5D">[155286]</a></li>
    115 			<li><a href="?q=98877+file%3A+ChangeAdapter">98877 file: ChangeAdapter</a></li>
    116 			<li><a href="?q=file%3A+org.eclipse.emf%2F+days%3A+7">file: org.eclipse.emf/ days: 7</a></li>
    117 			<li><a href="?q=days%3A200+author%3Amerks">days:200 author:merks</a></li>
    118 			<li><a href="?q=branch%3A+R2_1_+file%3A+.xml">branch: R2_1_ file: .xml</a></li>
    119 			<li><a href="?q=static+dynamic+project%3A+org.eclipse.emf">static dynamic project: org.eclipse.emf</a></li>
    120 			<li><a href="?q=%22package+protected%22">"package protected"</a></li>
    121 			<li><a href="?q=Neil+Skrypuch">Neil Skrypuch</a></li>
    122 		</ul>
    123         <p>See also the complete <a href="http://wiki.eclipse.org/index.php/Search_CVS#Parameter_List">Parameter List</a>.</p>
    124 	</div>
    125 </div>
    126 <?php
    127 $html = ob_get_contents();
    128 ob_end_clean();
    129 
    130 $pageTitle = "Eclipse Tools - Search CVS";
    131 $pageKeywords = "";
    132 $pageAuthor = "Neil Skrypuch";
    133 
    134 $App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf/includes/searchcvs.css"/>' . "\n");
    135 if (!isset($_GET["totalonly"]))
    136 {
    137 	ob_start();
    138 	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
    139 	$html = ob_get_contents();
    140 	ob_end_clean();
    141 	print preg_replace("/<body>/", "<body onload=\"document.getElementById('q').focus()\">", $html);
    142 }
    143 else
    144 {
    145 	header("Content-Type: text/plain");
    146 	print $rows;
    147 }
    148 
    149 function pretty_comment($str, $hl)
    150 {
    151 	$str = preg_replace("/\n/", "<br/>", $str);
    152 	$hl = words($hl);
    153 
    154 	for ($i = 0; $i < sizeof($hl); $i++)
    155 	{
    156 		$str = preg_replace("/\b(\Q$hl[$i]\E)\b([^=]|\Z)/i", "<span class=\"hl$i\">$1</span>$2", $str);
    157 	}
    158 
    159 	$str = preg_replace("/^(\Q*** empty log message ***\E)$/", "<span class=\"empty\">$1</span>", $str);
    160 
    161 	return $str;
    162 }
    163 
    164 function cvsminus($rev)
    165 {
    166 	if (preg_match("/^1\.1$/", $rev)) // "1.10" == "1.1" returns true, curiously enough
    167 	{
    168 		return $rev;
    169 	}
    170 	else
    171 	{
    172 		if (preg_match("/\.1$/", $rev))
    173 		{
    174 			return preg_replace("/^(\d+\.\d+)\..+$/", "$1", $rev);
    175 		}
    176 		else
    177 		{
    178 			return preg_replace("/^(.+\.)(\d+)$/e", "\"$1\" . ($2 - 1);", $rev);
    179 		}
    180 	}
    181 }
    182 
    183 function showrev($rev, $file)
    184 {
    185 	$link = "<a href=\"" . cvsfile($file) . "\">$rev</a>";
    186 	if (!preg_match("/^1\.1$/", $rev)) // "1.10" == "1.1" returns true, curiously enough
    187 	{
    188 		$oldrev = cvsminus($rev);
    189 		$link = "<a href=\"" . cvsfile($file, $rev, $oldrev) . "\">$rev &gt; $oldrev</a>";
    190 	}
    191 
    192         return $link;
    193 }
    194 
    195 function cvsfile($file, $rev = "", $oldrev = "")
    196 {
    197 	if ($rev && $oldrev)
    198 	{
    199 		$ext = ".diff";
    200 		$params = "r1=$oldrev&amp;r2=$rev&amp;";
    201 	}
    202 	$params .= (preg_match("/\.php$/", $file) && $ext != ".diff" ? "content-type=text/plain&amp;" : "");
    203 
    204 	if (preg_match("/^www/", $file))
    205 	{
    206 		return "http://dev.eclipse.org/viewcvs/index.cgi/~checkout~/$file$ext?${params}cvsroot=Eclipse_Website";
    207 	}
    208 	else
    209 	{
    210 		return "http://dev.eclipse.org/viewcvs/indextools.cgi/~checkout~/$file$ext?$params";
    211 	}
    212 }
    213 
    214 function sanitize($str, $type = "url")
    215 {
    216 	$tmp = urlencode(urldecode((get_magic_quotes_gpc() ? stripslashes($str) : $str)));
    217 	return ($type == "url" ? $tmp : htmlspecialchars(urldecode($tmp)));
    218 }
    219 
    220 function pagelink($page, $selected, $linktext = "")
    221 {
    222 	$innertext = ($linktext ? $linktext : $page);
    223 	$text = (!$selected ? "<a href=\"?q=" . sanitize($_GET["q"]) . "&amp;p=$page\">$innertext</a>" : $innertext);
    224 	return "<span" . ($selected ? " class=\"selected\"" : "") . ">$text</span>";
    225 }
    226 
    227 function dopager($rows, $page, $pagesize)
    228 {
    229 	$startpage = ($page - 5 < 1 ? 1 : $page - 5);
    230 	$endpage = ($page + 5 > $rows/$pagesize ? ceil($rows/$pagesize) : $page + 5);
    231 
    232 	if ($rows > 0)
    233 	{
    234 		print "<div class=\"pager\">\n";
    235 		print ($page > 1 ? pagelink($page - 1, false, "Previous") : "");
    236 		for ($i = $startpage; $i <= $endpage; $i++)
    237 		{
    238 			print pagelink($i, $i == $page);
    239 		}
    240 		print ($page < ceil($rows/$pagesize) ? pagelink($page + 1, false, "Next") : "");
    241 		print "</div>\n";
    242 	}
    243 }
    244 
    245 function words($str)
    246 {
    247 	$str = stripslashes($str);
    248         $list = array();
    249 
    250         preg_match_all("/\"([^\"]+)\"/", $str, $regs);
    251         foreach ($regs[1] as $word)
    252         {
    253 		$word = addslashes($word);
    254                 $list[] = $word;
    255                 $str = preg_replace("/\Q$word\E/", "", $str);
    256         }
    257 
    258         $regs = null;
    259         preg_match_all("/(\w+)/", $str, $regs);
    260         foreach ($regs[1] as $word)
    261         {
    262                 $list[] = addslashes($word);
    263         }
    264 
    265         return $list;
    266 }
    267 ?>
    268