Rev 185 Rev 4988
Line 1... Line 1...
1 <?php 1 <?php
2 # vim:et:ts=3:sts=3:sw=3:fdm=marker: -  
3   -  
4 // WebSVN - Subversion repository viewing via the web using PHP 2 // WebSVN - Subversion repository viewing via the web using PHP
5 // Copyright © 2004-2006 Tim Armes, Matt Sicker 3 // Copyright (C) 2004-2006 Tim Armes
6 // 4 //
7 // This program is free software; you can redistribute it and/or modify 5 // This program is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by 6 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 2 of the License, or 7 // the Free Software Foundation; either version 2 of the License, or
10 // (at your option) any later version. 8 // (at your option) any later version.
11 // 9 //
12 // This program is distributed in the hope that it will be useful, 10 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details. 13 // GNU General Public License for more details.
16 // 14 //
17 // You should have received a copy of the GNU General Public License 15 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software 16 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // 18 //
21 // -- 19 // --
22 // 20 //
23 // log.php 21 // log.php
24 // 22 //
25 // Show the logs for the given path 23 // Show the logs for the given path
26   24  
27 require_once("include/setup.inc"); 25 require_once 'include/setup.php';
28 require_once("include/svnlook.inc"); 26 require_once 'include/svnlook.php';
29 require_once("include/utils.inc"); 27 require_once 'include/utils.php';
30 require_once("include/template.inc"); 28 require_once 'include/template.php';
31 require_once("include/bugtraq.inc"); 29 require_once 'include/bugtraq.php';
32   30  
33 $page = (int)@$_REQUEST["page"]; 31 $page = (int)@$_REQUEST['page'];
34 $all = (@$_REQUEST["all"] == 1)?1:0; 32 $all = @$_REQUEST['all'] == 1;
35 $isDir = (@$_REQUEST["isdir"] == 1)?1:0; 33 $isDir = @$_REQUEST['isdir'] == 1 || $path == '' || $path == '/';
-   34  
-   35 // Make sure that we have a repository
-   36 if (!$rep)
-   37 {
-   38 renderTemplate404('log','NOREP');
-   39 }
-   40  
-   41 if (isset($_REQUEST['showchanges']))
-   42 {
36 $dosearch = (@$_REQUEST["logsearch"] == 1)?1:0; 43 $showchanges = @$_REQUEST['showchanges'] == 1;
-   44 }
-   45 else
-   46 {
-   47 $showchanges = $rep->logsShowChanges();
-   48 }
-   49  
37 $search = trim(@$_REQUEST["search"]); 50 $search = trim((string) @$_REQUEST['search']);
-   51 $dosearch = strlen($search) > 0;
-   52  
38 $words = preg_split('#\s+#', $search); 53 $words = preg_split('#\s+#', $search);
39 $fromRev = (int)@$_REQUEST["fr"]; 54 $fromRev = (int)@$_REQUEST['fr'];
40 $startrev = strtoupper(trim(@$_REQUEST["sr"])); 55 $startrev = strtoupper(trim((string) @$_REQUEST['sr']));
41 $endrev = strtoupper(trim(@$_REQUEST["er"])); 56 $endrev = strtoupper(trim((string) @$_REQUEST['er']));
42 $max = @$_REQUEST["max"]; 57 $max = isset($_REQUEST['max']) ? (int)$_REQUEST['max'] : false;
43   58  
44 // Max number of results to find at a time 59 // Max number of results to find at a time
45 $numSearchResults = 15; 60 $numSearchResults = 20;
46   61  
47 if ($search == "") 62 if ($search == '')
-   63 {
48 $dosearch = false; 64 $dosearch = false;
-   65 }
49   66  
50 // removeAccents 67 // removeAccents
51 // 68 //
52 // Remove all the accents from a string. This function doesn't seem 69 // Remove all the accents from a string. This function doesn't seem
53 // ideal, but expecting everyone to install 'unac' seems a little 70 // ideal, but expecting everyone to install 'unac' seems a little
54 // excessive as well... 71 // excessive as well...
55   72  
56 function removeAccents($string) 73 function removeAccents($string)
57 { 74 {
58 return strtr($string, 75 $string = htmlentities($string, ENT_QUOTES, 'ISO-8859-1');
59 "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", 76 $string = preg_replace('/&([A-Za-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron);/', '$1', $string);
60 "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"); 77 return $string;
61 } 78 }
62   79  
63 // Normalise the search words 80 // Normalise the search words
64 foreach ($words as $index => $word) 81 foreach ($words as $index => $word)
65 { 82 {
66 $words[$index] = strtolower(removeAccents($word)); 83 $words[$index] = strtolower(removeAccents($word));
67 84  
68 // Remove empty string introduced by multiple spaces 85 // Remove empty string introduced by multiple spaces
69 if (empty($words[$index])) 86 if (empty($words[$index]))
70 unset($words[$index]); 87 unset($words[$index]);
71 } 88 }
72   89  
73 if (empty($page)) $page = 1; 90 if (empty($page))
-   91 {
-   92 $page = 1;
-   93 }
74   94  
75 // If searching, display all the results 95 // If searching, display all the results
76 $all = (bool) $dosearch; 96 if ($dosearch)
-   97 {
-   98 $all = true;
-   99 }
77   100  
78 $maxperpage = 20; 101 $maxperpage = 20;
79   102  
80 // Make sure that we have a repository 103 $svnrep = new SVNRepository($rep);
-   104  
-   105 $history = $svnrep->getLog($path, 'HEAD', '', false, 1, ($path == '/') ? '' : $peg);
-   106  
81 if (!isset($rep)) 107 if (!$history)
82 { 108 {
83 echo $lang["NOREP"]; 109 unset($vars['error']);
-   110 $history = $svnrep->getLog($path, '', '', false, 1, ($path == '/') ? '' : $peg);
-   111  
84 exit; 112 if (!$history)
-   113 {
-   114 renderTemplate404('log','NOPATH');
-   115 }
85 } 116 }
86   117  
87 $svnrep = new SVNRepository($rep); 118 $youngest = ($history && isset($history->entries[0])) ? $history->entries[0]->rev : 0;
88   119  
-   120 if (empty($startrev))
-   121 {
-   122 //$startrev = ($rev) ? $rev : 'HEAD';
89 $passrev = $rev; 123 $startrev = $rev;
-   124 }
-   125 else if ($startrev != 'HEAD' && $startrev != 'BASE' && $startrev != 'PREV' && $startrev != 'COMMITTED')
-   126 {
-   127 $startrev = (int)$startrev;
-   128 }
-   129  
-   130 if (empty($endrev))
-   131 {
-   132 $endrev = 1;
-   133 }
-   134 else if ($endrev != 'HEAD' && $endrev != 'BASE' && $endrev != 'PREV' && $endrev != 'COMMITTED')
-   135 {
-   136 $endrev = (int)$endrev;
-   137 }
90   138  
91 // If there's no revision info, go to the lastest revision for this path -  
92 $history = $svnrep->getLog($path, "", "", true); 139 if (empty($rev))
-   140 {
93 $youngest = $history->entries[0]->rev; 141 $rev = $youngest;
-   142 }
94   143  
95 if (empty($rev)) 144 if (empty($startrev))
-   145 {
96 $rev = $youngest; 146 $startrev = $rev;
-   147 }
97   148  
98 // make sure path is prefixed by a / 149 // make sure path is prefixed by a /
99 $ppath = $path; 150 $ppath = $path;
100 if ($path == "" || $path{0} != "/") -  
101 $ppath = "/".$path; -  
102   151  
-   152 if ($path == '' || $path[0] != '/')
-   153 {
-   154 $ppath = '/'.$path;
-   155 }
-   156  
103 $vars["action"] = $lang["LOG"]; 157 $vars['action'] = $lang['LOG'];
104 $vars["repname"] = $rep->getDisplayName(); 158 $vars['rev'] = $rev;
105 $vars["rev"] = $rev; 159 $vars['peg'] = $peg;
-   160 $vars['path'] = str_replace('%2F', '/', rawurlencode($ppath));
106 $vars["path"] = $ppath; 161 $vars['safepath'] = escape($ppath);
-   162  
-   163 if ($history && isset($history->entries[0]))
-   164 {
-   165 $vars['log'] = xml_entities($history->entries[0]->msg);
-   166 $vars['date'] = $history->entries[0]->date;
-   167 $vars['age'] = datetimeFormatDuration(time() - strtotime($history->entries[0]->date));
-   168 $vars['author'] = $history->entries[0]->author;
-   169 }
-   170  
-   171 if ($max === false)
-   172 {
-   173 $max = ($dosearch) ? 0 : 40;
-   174 }
-   175 else if ($max < 0)
-   176 {
-   177 $max = 40;
-   178 }
-   179  
-   180 // TODO: If the rev is less than the head, get the path (may have been renamed!)
-   181 // Will probably need to call `svn info`, parse XML output, and substring a path
107   182  
108 createDirLinks($rep, $ppath, $passrev, $showchanged); 183 createPathLinks($rep, $ppath, $passrev, $peg);
-   184 $passRevString = createRevAndPegString($rev, $peg);
-   185 $isDirString = ($isDir) ? 'isdir=1&amp;' : '';
-   186  
-   187 unset($queryParams['repname']);
-   188 unset($queryParams['path']);
-   189  
-   190 // Toggle 'showchanges' param for link to switch from the current behavior
-   191 if ($showchanges == $rep->logsShowChanges())
-   192 {
-   193 $queryParams['showchanges'] = (int)!$showchanges;
-   194 }
-   195 else
-   196 {
-   197 unset($queryParams['showchanges']);
-   198 }
109   199  
110 $logurl = $config->getURL($rep, $path, "log"); 200 $vars['changesurl'] = $config->getURL($rep, $path, 'log').buildQuery($queryParams);
-   201 $vars['changeslink'] = '<a href="'.$vars['changesurl'].'">'.$lang[($showchanges ? 'HIDECHANGED' : 'SHOWCHANGED')].'</a>';
-   202 $vars['showchanges'] = $showchanges;
111   203  
-   204 // Revert 'showchanges' param to propagate the current behavior
112 if ($rev != $youngest) 205 if ($showchanges == $rep->logsShowChanges())
-   206 {
113 $vars["goyoungestlink"] = "<a href=\"${logurl}sc=1\">${lang["GOYOUNGEST"]}</a>"; 207 unset($queryParams['showchanges']);
-   208 }
114 else 209 else
-   210 {
-   211 $queryParams['showchanges'] = (int)$showchanges;
-   212 }
-   213  
-   214 $vars['revurl'] = $config->getURL($rep, $path, 'revision').$isDirString.$passRevString;
-   215  
-   216 if ($isDir)
-   217 {
-   218 $vars['directoryurl'] = $config->getURL($rep, $path, 'dir').$passRevString.'#'.anchorForPath($path);
-   219 $vars['directorylink'] = '<a href="'.$vars['directoryurl'].'">'.$lang['LISTING'].'</a>';
-   220 }
-   221 else
-   222 {
-   223 $vars['filedetailurl'] = $config->getURL($rep, $path, 'file').$passRevString;
-   224 $vars['filedetaillink'] = '<a href="'.$vars['filedetailurl'].'">'.$lang['FILEDETAIL'].'</a>';
-   225  
-   226 $vars['blameurl'] = $config->getURL($rep, $path, 'blame').$passRevString;
-   227 $vars['blamelink'] = '<a href="'.$vars['blameurl'].'">'.$lang['BLAME'].'</a>';
-   228  
-   229 $vars['diffurl'] = $config->getURL($rep, $path, 'diff').$passRevString;
-   230 $vars['difflink'] = '<a href="'.$vars['diffurl'].'">'.$lang['DIFFPREV'].'</a>';
-   231 }
-   232  
-   233 if ($rep->isRssEnabled())
-   234 {
-   235 $vars['rssurl'] = $config->getURL($rep, $path, 'rss').$isDirString.createRevAndPegString('', $peg);
-   236 $vars['rsslink'] = '<a href="'.$vars['rssurl'].'">'.$lang['RSSFEED'].'</a>';
-   237 }
-   238  
115 $vars["goyoungestlink"] = ""; 239 if ($rev != $youngest)
-   240 {
-   241 if ($path == '/')
-   242 {
-   243 $vars['goyoungesturl'] = $config->getURL($rep, '', 'log').$isDirString;
-   244 }
-   245 else
-   246 {
-   247 $vars['goyoungesturl'] = $config->getURL($rep, $path, 'log').$isDirString.'peg='.($peg ? $peg : $rev);
-   248 }
-   249  
-   250 $vars['goyoungestlink'] = '<a href="'.$vars['goyoungesturl'].'"'.($youngest ? ' title="'.$lang['REV'].' '.$youngest.'"' : '').'>'.$lang['GOYOUNGEST'].'</a>';
-   251 }
116   252  
117 // We get the bugtraq variable just once based on the HEAD 253 // We get the bugtraq variable just once based on the HEAD
118 $bugtraq = new Bugtraq($rep, $svnrep, $ppath); 254 $bugtraq = new Bugtraq($rep, $svnrep, $ppath);
119   255  
-   256 $vars['logsearch_moreresultslink'] = '';
-   257 $vars['pagelinks'] = '';
-   258 $vars['showalllink'] = '';
-   259  
-   260 if ($history)
-   261 {
120 if ($startrev != "HEAD") $startrev = (int)$startrev; 262 $history = $svnrep->getLog($path, $startrev, $endrev, true, $max, $peg);
-   263  
121 if (empty($startrev)) $startrev = $rev; 264 if (empty($history))
-   265 {
122 if (empty($endrev)) $endrev = 1; 266 unset($vars['error']);
-   267 $vars['warning'] = 'Revision '.$startrev.' of this resource does not exist.';
-   268 }
-   269 }
123   270  
124 if (empty($_REQUEST["max"])) 271 if (!empty($history))
125 { 272 {
-   273 // Get the number of separate revisions
-   274 $revisions = count($history->entries);
-   275  
-   276 if ($all)
-   277 {
-   278 $firstrevindex = 0;
-   279 $lastrevindex = $revisions - 1;
-   280 $pages = 1;
-   281 }
-   282 else
-   283 {
-   284 // Calculate the number of pages
-   285 $pages = floor($revisions / $maxperpage);
-   286 if (($revisions % $maxperpage) > 0) $pages++;
-   287  
-   288 if ($page > $pages) $page = $pages;
-   289  
-   290 // Work out where to start and stop
-   291 $firstrevindex = ($page - 1) * $maxperpage;
-   292 $lastrevindex = min($firstrevindex + $maxperpage - 1, $revisions - 1);
-   293 }
-   294  
-   295 $frev = isset($history->entries[0]) ? $history->entries[0]->rev : false;
-   296 $brev = isset($history->entries[$firstrevindex]) ? $history->entries[$firstrevindex]->rev : false;
-   297 $erev = isset($history->entries[$lastrevindex]) ? $history->entries[$lastrevindex]->rev : false;
-   298  
-   299 $entries = array();
-   300  
-   301 if ($brev && $erev)
-   302 {
-   303 $history = $svnrep->getLog($path, $brev, $erev, false, 0, $peg, true);
-   304 if ($history)
-   305 {
-   306 $entries = $history->entries;
-   307 }
-   308 }
-   309  
-   310 $row = 0;
-   311 $index = 0;
-   312 $found = false;
-   313  
-   314 foreach ($entries as $revision)
-   315 {
-   316 // Assume a good match
-   317 $match = true;
-   318 $thisrev = $revision->rev;
-   319  
-   320 // Check the log for the search words, if searching
-   321 if ($dosearch)
-   322 {
-   323 if ((empty($fromRev) || $fromRev > $thisrev))
-   324 {
-   325 // Turn all the HTML entities into real characters.
-   326  
-   327 // Make sure that each word in the search in also in the log
-   328 foreach ($words as $word)
-   329 {
-   330 if (strpos(strtolower(removeAccents($revision->msg)), $word) === false && strpos(strtolower(removeAccents($revision->author)), $word) === false)
-   331 {
-   332 $match = false;
-   333 break;
-   334 }
-   335 }
-   336  
-   337 if ($match)
-   338 {
-   339 $numSearchResults--;
-   340 $found = true;
-   341 }
-   342 }
-   343 else
-   344 {
-   345 $match = false;
-   346 }
-   347 }
-   348  
-   349 $thisRevString = createRevAndPegString($thisrev, ($peg ? $peg : $thisrev));
-   350  
-   351 if ($match)
-   352 {
-   353 // Add the trailing slash if we need to (svnlook history doesn't return trailing slashes!)
-   354 $rpath = $revision->path;
-   355  
-   356 if (empty($rpath))
-   357 {
-   358 $rpath = '/';
-   359 }
-   360 else if ($isDir && $rpath[strlen($rpath) - 1] != '/')
-   361 {
-   362 $rpath .= '/';
-   363 }
-   364  
-   365 $precisePath = $revision->precisePath;
126 if (empty($_REQUEST["logsearch"])) 366 if (empty($precisePath))
-   367 {
-   368 $precisePath = '/';
-   369 }
-   370 else if ($isDir && $precisePath[strlen($precisePath) - 1] != '/')
-   371 {
-   372 $precisePath .= '/';
-   373 }
-   374  
-   375 // Find the parent path (or the whole path if it's already a directory)
-   376 $pos = strrpos($rpath, '/');
-   377 $parent = substr($rpath, 0, $pos + 1);
-   378  
-   379 $compareValue = (($isDir) ? $parent : $rpath).'@'.$thisrev;
-   380  
-   381 $listvar = &$listing[$index];
-   382 $listvar['compare_box'] = '<input type="checkbox" name="compare[]" value="'.$compareValue.'" onclick="enforceOnlyTwoChecked(this)" />';
-   383 $url = $config->getURL($rep, $rpath, 'revision').$thisRevString;
-   384 $listvar['revlink'] = '<a href="'.$url.'">'.$thisrev.'</a>';
-   385  
-   386 $url = $config->getURL($rep, $precisePath, ($isDir ? 'dir' : 'file')).$thisRevString;
-   387  
-   388 $listvar['revpathlink'] = '<a href="'.$url.'">'.escape($precisePath).'</a>';
-   389 $listvar['revpath'] = escape($precisePath);
-   390 $listvar['revauthor'] = $revision->author;
-   391 $listvar['revdate'] = $revision->date;
-   392 $listvar['revage'] = $revision->age;
-   393 $listvar['revlog'] = nl2br($bugtraq->replaceIDs(create_anchors(xml_entities($revision->msg))));
-   394 $listvar['rowparity'] = $row;
-   395 $listvar['compareurl'] = $config->getURL($rep, '', 'comp').'compare[]='.urlencode($rpath).'@'.($thisrev - 1).'&amp;compare[]='.urlencode($rpath).'@'.$thisrev;
-   396  
-   397 if ($showchanges)
-   398 {
-   399 // Aggregate added/deleted/modified paths for display in table
-   400 $modpaths = array();
-   401  
-   402 foreach ($revision->mods as $mod)
-   403 {
-   404 $modpaths[$mod->action][] = $mod->path;
-   405 }
-   406  
-   407 ksort($modpaths);
-   408  
-   409 foreach ($modpaths as $action => $paths)
-   410 {
-   411 sort($paths);
-   412 $modpaths[$action] = $paths;
-   413 }
-   414  
-   415 $listvar['revadded'] = (isset($modpaths['A'])) ? implode('<br/>', escape($modpaths['A'])) : '';
-   416 $listvar['revdeleted'] = (isset($modpaths['D'])) ? implode('<br/>', escape($modpaths['D'])) : '';
-   417 $listvar['revmodified'] = (isset($modpaths['M'])) ? implode('<br/>', escape($modpaths['M'])) : '';
-   418 }
-   419  
-   420 $row = 1 - $row;
-   421 $index++;
-   422 }
-   423  
-   424 // If we've reached the search limit, stop here...
-   425 if (!$numSearchResults)
-   426 {
-   427 $url = $config->getURL($rep, $path, 'log').$isDirString.$thisRevString;
-   428 $vars['logsearch_moreresultslink'] = '<a href="'.$url.'&amp;search='.$search.'&amp;fr='.$thisrev.'">'.$lang['MORERESULTS'].'</a>';
-   429 break;
-   430 }
-   431 }
-   432  
-   433 $vars['logsearch_resultsfound'] = true;
-   434  
-   435 if ($dosearch && !$found)
-   436 {
127 $max = 30; 437 if ($fromRev == 0)
-   438 {
-   439 $vars['logsearch_nomatches'] = true;
-   440 $vars['logsearch_resultsfound'] = false;
-   441 }
128 else 442 else
-   443 {
-   444 $vars['logsearch_nomorematches'] = true;
-   445 }
-   446 }
-   447 else if ($dosearch && $numSearchResults > 0)
-   448 {
-   449 $vars['logsearch_nomorematches'] = true;
-   450 }
-   451  
-   452 // Work out the paging options, create links to pages of results
-   453 if ($pages > 1)
-   454 {
-   455 $prev = $page - 1;
-   456 $next = $page + 1;
-   457  
-   458 unset($queryParams['page']);
-   459 $logurl = $config->getURL($rep, $path, 'log').buildQuery($queryParams);
-   460  
129 $max = 0; 461 if ($page > 1)
-   462 {
-   463 $vars['pagelinks'] .= '<a href="'.$logurl.(!$peg && $frev && $prev != 1 ? '&amp;peg='.$frev : '').'&amp;page='.$prev.'">&larr;'.$lang['PREV'].'</a>';
-   464 }
-   465 else
-   466 {
-   467 $vars['pagelinks'] .= '<span>&larr;'.$lang['PREV'].'</span>';
-   468 }
-   469  
-   470 for ($p = 1; $p <= $pages; $p++)
-   471 {
-   472 if ($p != $page)
-   473 {
-   474 $vars['pagelinks'] .= '<a href="'.$logurl.(!$peg && $frev && $p != 1 ? '&amp;peg='.$frev : '').'&amp;page='.$p.'">'.$p.'</a>';
-   475 }
-   476 else
-   477 {
-   478 $vars['pagelinks'] .= '<span id="curpage">'.$p.'</span>';
-   479 }
-   480 }
-   481  
-   482 if ($page < $pages)
-   483 {
-   484 $vars['pagelinks'] .= '<a href="'.$logurl.(!$peg && $frev ? '&amp;peg='.$frev : '').'&amp;page='.$next.'">'.$lang['NEXT'].'&rarr;</a>';
-   485 }
-   486 else
-   487 {
-   488 $vars['pagelinks'] .= '<span>'.$lang['NEXT'].'&rarr;</span>';
-   489 }
-   490  
-   491 $vars['showalllink'] = '<a href="'.$logurl.'&amp;all=1">'.$lang['SHOWALL'].'</a>';
-   492 }
-   493 }
-   494  
-   495 // Create form elements for filtering and searching log messages
-   496 if ($config->multiViews)
-   497 {
-   498 $hidden = '<input type="hidden" name="op" value="log" />';
-   499 }
-   500 else
-   501 {
-   502 $hidden = '<input type="hidden" name="repname" value="'.$repname.'" />';
-   503 $hidden .= '<input type="hidden" name="path" value="'.$path.'" />';
-   504 }
-   505  
-   506 if ($isDir)
-   507 {
-   508 $hidden .= '<input type="hidden" name="isdir" value="'.$isDir.'" />';
-   509 }
-   510  
-   511 if ($peg)
-   512 {
-   513 $hidden .= '<input type="hidden" name="peg" value="'.$peg.'" />';
-   514 }
-   515  
-   516 if ($showchanges != $rep->logsShowChanges())
-   517 {
-   518 $hidden .= '<input type="hidden" name="showchanges" value="'.$showchanges.'" />';
-   519 }
-   520  
-   521 $vars['logsearch_form'] = '<form method="get" action="'.$config->getURL($rep, $path, 'log').'" id="search">'.$hidden;
-   522 $vars['logsearch_startbox'] = '<input name="sr" size="5" value="'.$startrev.'" />';
-   523 $vars['logsearch_endbox'] = '<input name="er" size="5" value="'.$endrev.'" />';
-   524 $vars['logsearch_maxbox'] = '<input name="max" size="5" value="'.($max == 0 ? 40 : $max).'" />';
-   525 $vars['logsearch_inputbox'] = '<input name="search" value="'.escape($search).'" />';
-   526 $vars['logsearch_showall'] = '<input type="checkbox" name="all" value="1"'.($all ? ' checked="checked"' : '').' />';
-   527 $vars['logsearch_submit'] = '<input type="submit" value="'.$lang['GO'].'" />';
-   528 $vars['logsearch_endform'] = '</form>';
-   529  
-   530 // If a filter is in place, produce a link to clear all filter parameters
-   531 if ($page !== 1 || $all || $dosearch || $fromRev || $startrev !== $rev || $endrev !== 1 || $max !== 40)
-   532 {
-   533 $url = $config->getURL($rep, $path, 'log').$isDirString.$passRevString;
-   534 $vars['logsearch_clearloglink'] = '<a href="'.$url.'">'.$lang['CLEARLOG'].'</a>';
-   535 }
-   536  
-   537 // Create form elements for comparing selected revisions
-   538 $vars['compare_form'] = '<form method="get" action="'.$config->getURL($rep, '', 'comp').'" id="compare">';
-   539  
-   540 if ($config->multiViews)
-   541 {
-   542 $vars['compare_form'] .= '<input type="hidden" name="op" value="comp" />';
130 } 543 }
131 else 544 else
132 { 545 {
133 $max = (int)$max; -  
134 if ($max < 0) $max = 30; 546 $vars['compare_form'] .= '<input type="hidden" name="repname" value="'.$repname.'" />';
135 } 547 }
136   548  
137 $history = $svnrep->getLog($path, $startrev, $endrev, true, $max); 549 $vars['compare_submit'] = '<input type="submit" value="'.$lang['COMPAREREVS'].'" />';
138 $vars["logsearch_moreresultslink"] = ""; -  
139 $vars["pagelinks"] = ""; 550 $vars['compare_endform'] = '</form>';
140 $vars["showalllink"] = ""; -  
141 $listing = array(); -  
142   551  
143 if (!empty($history)) 552 if (!$rep->hasReadAccess($path, false))
144 { 553 {
145 // Get the number of separate revisions -  
146 $revisions = count($history->entries); -  
147 -  
148 if ($all) -  
149 { -  
150 $firstrevindex = 0; -  
151 $lastrevindex = $revisions - 1; -  
152 $pages = 1; -  
153 } -  
154 else -  
155 { -  
156 // Calculate the number of pages -  
157 $pages = floor($revisions / $maxperpage); -  
158 if (($revisions % $maxperpage) > 0) $pages++; -  
159 -  
160 if ($page > $pages) $page = $pages; -  
161 -  
162 // Word out where to start and stop -  
163 $firstrevindex = ($page - 1) * $maxperpage; -  
164 $lastrevindex = $firstrevindex + $maxperpage - 1; -  
165 if ($lastrevindex > $revisions - 1) $lastrevindex = $revisions - 1; -  
166 } -  
167 -  
168 $history = $svnrep->getLog($path, $history->entries[$firstrevindex ]->rev, $history->entries[$lastrevindex]->rev, false, 0); -  
169 -  
170 $row = 0; -  
171 $index = 0; -  
172 $listing = array(); -  
173 $found = false; -  
174 -  
175 foreach ($history->entries as $r) -  
176 { -  
177 // Assume a good match -  
178 $match = true; -  
179 $thisrev = $r->rev; -  
180 -  
181 // Check the log for the search words, if searching -  
182 if ($dosearch) -  
183 { -  
184 if ((empty($fromRev) || $fromRev > $thisrev)) -  
185 { -  
186 // Turn all the HTML entities into real characters. -  
187 -  
188 // Make sure that each word in the search in also in the log -  
189 foreach($words as $word) -  
190 { -  
191 if (strpos(strtolower(removeAccents($r->msg)), $word) === false) -  
192 { -  
193 $match = false; -  
194 break; -  
195 } -  
196 } -  
197 -  
198 if ($match) -  
199 { -  
200 $numSearchResults--; -  
201 $found = true; -  
202 } -  
203 } -  
204 else -  
205 $match = false; -  
206 } -  
207 -  
208 if ($match) -  
209 { -  
210 // Add the trailing slash if we need to (svnlook history doesn't return trailing slashes!) -  
211 $rpath = $r->path; -  
212 -  
213 if (empty($rpath)) -  
214 $rpath = "/"; -  
215 else if ($isDir && $rpath{strlen($rpath) - 1} != "/") -  
216 $rpath .= "/"; -  
217 -  
218 // Find the parent path (or the whole path if it's already a directory) -  
219 $pos = strrpos($rpath, "/"); -  
220 $parent = substr($rpath, 0, $pos + 1); -  
221 -  
222 $url = $config->getURL($rep, $parent, "dir"); -  
223 $listing[$index]["revlink"] = "<a href=\"${url}rev=$thisrev&amp;sc=1\">$thisrev</a>"; -  
224 -  
225 if ($isDir) -  
226 { -  
227 $listing[$index]["compare_box"] = "<input type=\"checkbox\" name=\"compare[]\" value=\"$parent@$thisrev\" onclick=\"checkCB(this)\" />"; -  
228 $url = $config->getURL($rep, $rpath, "dir"); -  
229 $listing[$index]["revpathlink"] = "<a href=\"${url}rev=$thisrev&amp;sc=$showchanged\">$rpath</a>"; -  
230 } -  
231 else -  
232 { -  
233 $listing[$index]["compare_box"] = "<input type=\"checkbox\" name=\"compare[]\" value=\"$rpath@$thisrev\" onclick=\"checkCB(this)\" />"; -  
234 $url = $config->getURL($rep, $rpath, "file"); -  
235 $listing[$index]["revpathlink"] = "<a href=\"${url}rev=$thisrev&amp;sc=$showchanged\">$rpath</a>"; -  
236 } -  
237 -  
238 $listing[$index]["revauthor"] = $r->author; -  
239 $listing[$index]["revage"] = $r->age; -  
240 $listing[$index]["revlog"] = nl2br($bugtraq->replaceIDs(create_anchors($r->msg))); -  
241 $listing[$index]["rowparity"] = "$row"; -  
242 -  
243 $row = 1 - $row; -  
244 $index++; -  
245 } -  
246 -  
247 // If we've reached the search limit, stop here... -  
248 if (!$numSearchResults) -  
249 { -  
250 $url = $config->getURL($rep, $path, "log"); -  
251 $vars["logsearch_moreresultslink"] = "<a href=\"${url}rev=$rev&amp;sc=$showchanged&amp;isdir=$isDir&amp;logsearch=1&amp;search=$search&amp;fr=$thisrev\">${lang["MORERESULTS"]}</a>"; -  
252 break; -  
253 } -  
254 } -  
255 -  
256 $vars["logsearch_resultsfound"] = true; 554 $vars['error'] = $lang['NOACCESS'];
257 -  
258 if ($dosearch && !$found) -  
259 { -  
260 if ($fromRev == 0) -  
261 { -  
262 $vars["logsearch_nomatches"] = true; -  
263 $vars["logsearch_resultsfound"] = false; -  
264 } -  
265 else -  
266 $vars["logsearch_nomorematches"] = true; -  
267 } -  
268 else if ($dosearch && $numSearchResults > 0) -  
269 { -  
270 $vars["logsearch_nomorematches"] = true; -  
271 } -  
272 -  
273 // Work out the paging options -  
274 -  
275 if ($pages > 1) -  
276 { -  
277 $prev = $page - 1; -  
278 $next = $page + 1; -  
279 echo "<p><center>"; -  
280 -  
281 if ($page > 1) $vars["pagelinks"] .= "<a href=\"${logurl}rev=$rev&amp;sr=$startrev&amp;er=$endrev&amp;sc=$showchanged&amp;max=$max&amp;page=$prev\"><&nbsp;${lang["PREV"]}</a> "; -  
282 for ($p = 1; $p <= $pages; $p++) -  
283 { -  
284 if ($p != $page) -  
285 $vars["pagelinks"].= "<a href=\"${logurl}rev=$rev&amp;sr=$startrev&amp;er=$endrev&amp;sc=$showchanged&amp;max=$max&amp;page=$p\">$p</a> "; -  
286 else -  
287 $vars["pagelinks"] .= "<b>$p </b>"; -  
288 } -  
289 if ($page < $pages) $vars["pagelinks"] .=" <a href=\"${logurl}rev=$rev&amp;sr=$startrev&amp;er=$endrev&amp;sc=$showchanged&amp;max=$max&amp;page=$next\">${lang["NEXT"]}&nbsp;></a>"; -  
290 -  
291 $vars["showalllink"] = "<a href=\"${logurl}rev=$rev&amp;sr=$startrev&amp;er=$endrev&amp;sc=$showchanged&amp;all=1&amp;max=$max\">${lang["SHOWALL"]}</a>"; -  
292 echo "</center>"; 555 sendHeaderForbidden();
293 } -  
294 } 556 }
295   -  
296 // Create the project change combo box -  
297 -  
298 $url = $config->getURL($rep, $path, "log"); -  
299 # XXX: forms don't have the name attribute, but _everything_ has the id attribute, -  
300 # so what you're trying to do (if anything?) should be done via that ~J -  
301 $vars["logsearch_form"] = "<form action=\"$url\" method=\"post\" name=\"logsearchform\">"; -  
302   -  
303 $vars["logsearch_startbox"] = "<input name=\"sr\" size=\"5\" value=\"$startrev\" />"; -  
304 $vars["logsearch_endbox" ] = "<input name=\"er\" size=\"5\" value=\"$endrev\" />"; -  
305 $vars["logsearch_maxbox" ] = "<input name=\"max\" size=\"5\" value=\"".($max==0?"":$max)."\" />"; -  
306 $vars["logsearch_inputbox"] = "<input name=\"search\" value=\"$search\" />"; -  
307   -  
308 $vars["logsearch_submit"] = "<input type=\"submit\" value=\"${lang["GO"]}\" />"; -  
309 $vars["logsearch_endform"] = "<input type=\"hidden\" name=\"logsearch\" value=\"1\" />". -  
310 "<input type=\"hidden\" name=\"op\" value=\"log\" />". -  
311 "<input type=\"hidden\" name=\"rev\" value=\"$rev\" />". -  
312 "<input type=\"hidden\" name=\"sc\" value=\"$showchanged\" />". -  
313 "<input type=\"hidden\" name=\"isdir\" value=\"$isDir\" />". -  
314 "</form>"; -  
315   -  
316 $url = $config->getURL($rep, $path, "log"); -  
317 $vars["logsearch_clearloglink"] = "<a href=\"${url}rev=$rev&amp;sc=$showchanged&amp;isdir=$isDir\">${lang["CLEARLOG"]}</a>"; -  
318   -  
319 $url = $config->getURL($rep, "/", "comp"); -  
320 $vars["compare_form"] = "<form action=\"$url\" method=\"post\" name=\"compareform\">"; -  
321 $vars["compare_submit"] = "<input name=\"comparesubmit\" type=\"submit\" value=\"${lang["COMPAREREVS"]}\" />"; -  
322 $vars["compare_endform"] = "<input type=\"hidden\" name=\"op\" value=\"comp\" /><input type=\"hidden\" name=\"sc\" value=\"$showchanged\" /></form>"; -  
323   -  
324 $vars["version"] = $version; -  
325   -  
326 if (!$rep->hasReadAccess($path, false)) -  
327 $vars["noaccess"] = true; -  
328   -  
329 parseTemplate($rep->getTemplatePath()."header.tmpl", $vars, $listing); -  
330 parseTemplate($rep->getTemplatePath()."log.tmpl", $vars, $listing); -  
331 parseTemplate($rep->getTemplatePath()."footer.tmpl", $vars, $listing); -  
332   557  
333 ?> 558 renderTemplate('log');