getLog($path, 'HEAD', 1, false, 2, ($path == '/') ? '' : $peg); if (!$history) { unset($vars['error']); $history = $svnrep->getLog($path, '', '', false, 2, ($path == '/') ? '' : $peg); if (!$history) { header('HTTP/1.x 404 Not Found', true, 404); $vars['error'] = $lang['NOPATH']; } } $youngest = ($history && isset($history->entries[0])) ? $history->entries[0]->rev : false; if (empty($rev)) { $rev = $youngest; } else { $history = $svnrep->getLog($path, $rev, '', false, 2, $peg); if (!$history) { header('HTTP/1.x 404 Not Found', true, 404); $vars['error'] = $lang['NOPATH']; } } if ($path{0} != '/') { $ppath = '/'.$path; } else { $ppath = $path; } // Find the parent path (or the whole path if it's already a directory) $pos = strrpos($ppath, '/'); $parent = substr($ppath, 0, $pos + 1); $vars['rev'] = $rev; $vars['peg'] = $peg; $vars['path'] = escape($ppath); if (isset($history->entries[0])) { $vars['log'] = xml_entities($history->entries[0]->msg); $vars['date'] = $history->entries[0]->date; $vars['age'] = datetimeFormatDuration(time() - strtotime($history->entries[0]->date)); $vars['author'] = $history->entries[0]->author; } createPathLinks($rep, $ppath, $passrev, $peg); $passRevString = createRevAndPegString($rev, $peg); if ($rev != $youngest) { $vars['goyoungesturl'] = $config->getURL($rep, $path, 'blame').createRevAndPegString('', $peg); $vars['goyoungestlink'] = ''.$lang['GOYOUNGEST'].''; } $revurl = $config->getURL($rep, $path, 'blame'); if ($rev < $youngest) { $history2 = $svnrep->getLog($path, $rev, $youngest, false, 2, $peg); if (isset($history2->entries[1])) { $nextRev = $history2->entries[1]->rev; if ($nextRev != $youngest) { $vars['nextrev'] = $nextRev; $vars['nextrevurl'] = $revurl.createRevAndPegString($nextRev, $peg); } } unset($vars['error']); } if (isset($history->entries[1])) { $prevRev = $history->entries[1]->rev; $prevPath = $history->entries[1]->path; $vars['prevrev'] = $prevRev; $vars['prevrevurl'] = $revurl.createRevAndPegString($prevRev, $peg); } $vars['revurl'] = $config->getURL($rep, $path, 'revision').$passRevString; $vars['revlink'] = ''.$lang['LASTMOD'].''; $vars['logurl'] = $config->getURL($rep, $path, 'log').$passRevString; $vars['loglink'] = ''.$lang['VIEWLOG'].''; $vars['filedetailurl'] = $config->getURL($rep, $path, 'file').$passRevString; $vars['filedetaillink'] = ''.$lang['FILEDETAIL'].''; if ($history == null || count($history->entries) > 1) { $vars['diffurl'] = $config->getURL($rep, $path, 'diff').$passRevString; $vars['difflink'] = ''.$lang['DIFFPREV'].''; } if ($rep->isRssEnabled()) { $vars['rssurl'] = $config->getURL($rep, $path, 'rss').createRevAndPegString('', $peg); $vars['rsslink'] = ''.$lang['RSSFEED'].''; } // Check for binary file type before grabbing blame information. $svnMimeType = $svnrep->getProperty($path, 'svn:mime-type', $rev, $peg); if (!$rep->getIgnoreSvnMimeTypes() && preg_match('~application/*~', $svnMimeType)) { $vars['warning'] = 'Cannot display blame info for binary file. (svn:mime-type = '.$svnMimeType.')'; $vars['javascript'] = ''; } else { // Get the contents of the file $tfname = tempnamWithCheck($config->getTempDir(), ''); $highlighted = $svnrep->getFileContents($path, $tfname, $rev, $peg, '', 'line'); if ($file = fopen($tfname, 'r')) { // Get the blame info $tbname = tempnamWithCheck($config->getTempDir(), ''); $svnrep->getBlameDetails($path, $tbname, $rev, $peg); if ($blame = fopen($tbname, 'r')) { // Create an array of version/author/line $index = 0; $seen_rev = array(); $last_rev = ''; $row_class = ''; while (!feof($blame) && !feof($file)) { $blameline = fgets($blame); if ($blameline != '') { list($revision, $author, $remainder) = sscanf($blameline, '%d %s %s'); $empty = !$remainder; $listing[$index]['lineno'] = $index + 1; if ($last_rev != $revision) { $url = $config->getURL($rep, $path, 'blame'); $listing[$index]['revision'] = ''.$revision.''; $seen_rev[$revision] = 1; $row_class = ($row_class == 'light') ? 'dark' : 'light'; $listing[$index]['author'] = $author; } else { $listing[$index]['revision'] = ''; $listing[$index]['author'] = ''; } $listing[$index]['row_class'] = $row_class; $last_rev = $revision; $line = rtrim(fgets($file)); if (!$highlighted) $line = escape(toOutputEncoding($line)); $listing[$index]['line'] = ($empty) ? ' ' : wrapInCodeTagIfNecessary($line); $index++; } } fclose($blame); } fclose($file); @unlink($tbname); } @unlink($tfname); // Build the necessary JavaScript as an array of lines, then join them with \n $javascript = array(); $javascript[] = ''; $javascript[] = ''; $vars['javascript'] = implode("\n", $javascript); } if (!$rep->hasReadAccess($path, false)) { $vars['error'] = $lang['NOACCESS']; checkSendingAuthHeader($rep); } } else { header('HTTP/1.x 404 Not Found', true, 404); } renderTemplate('blame');