websvn |
Subversion Repositories: |
Rev 1 | Rev 3 | |
---|---|---|
Line 26... | Line 26... | |
require_once("include/setup.php"); |
require_once("include/setup.php"); | |
require_once("include/svnlook.php"); |
require_once("include/svnlook.php"); | |
require_once("include/utils.php"); |
require_once("include/utils.php"); | |
require_once("include/template.php"); |
require_once("include/template.php"); | |
|
| |
$context = 5; |
require_once("include/diff_inc.php"); | |
|
| |
$vars["action"] = $lang["DIFF"]; |
$vars["action"] = $lang["DIFF"]; | |
$all = (@$_REQUEST["all"] == 1)?1:0; |
$all = (@$_REQUEST["all"] == 1); | |
$ignoreWhitespace = (@$_REQUEST["ignorews"] == 1); | ||
|
| |
// Make sure that we have a repository |
// Make sure that we have a repository | |
if (!isset($rep)) { |
if (!isset($rep)) { | |
echo $lang["NOREP"]; |
echo $lang["NOREP"]; | |
exit; |
exit; | |
Line 41... | Line 42... | |
|
| |
$svnrep = new SVNRepository($rep); |
$svnrep = new SVNRepository($rep); | |
|
| |
// If there's no revision info, go to the lastest revision for this path |
// If there's no revision info, go to the lastest revision for this path | |
$history = $svnrep->getLog($path, "", "", true); |
$history = $svnrep->getLog($path, "", "", true); | |
if (is_string($history)) { | ||
echo $history; | ||
exit; | ||
} | ||
$youngest = $history->entries[0]->rev; |
$youngest = $history->entries[0]->rev; | |
|
| |
if (empty($rev)) { |
if (empty($rev)) { | |
$rev = $youngest; |
$rev = $youngest; | |
} |
} | |
|
| |
$history = $svnrep->getLog($path, $rev); |
$history = $svnrep->getLog($path, $rev); | |
if (is_string($history)) { | ||
echo $history; | ||
exit; | ||
} | ||
|
| |
if ($path{0} != "/") { |
if ($path{0} != "/") { | |
$ppath = "/".$path; |
$ppath = "/".$path; | |
} else { |
} else { | |
$ppath = $path; |
$ppath = $path; | |
Line 95... | Line 104... | |
|
| |
if ($prevrev) { |
if ($prevrev) { | |
$url = $config->getURL($rep, $path, "diff"); |
$url = $config->getURL($rep, $path, "diff"); | |
|
| |
if (!$all) { |
if (!$all) { | |
$vars["showalllink"] = "<a href=\"${url}rev=$rev&all=1\">${lang["SHOWENTIREFILE"]}</a>"; |
$vars["showalllink"] = '<a href="'.$url.'rev='.$rev.'&all=1&ignorews='.($ignoreWhitespace ? '1' : '0').'">'.$lang['SHOWENTIREFILE'].'</a>'; | |
$vars["showcompactlink"] = ""; |
$vars["showcompactlink"] = ''; | |
} else { |
} else { | |
$vars["showcompactlink"] = "<a href=\"${url}rev=$rev&all=0\">${lang["SHOWCOMPACT"]}</a>"; |
$vars["showcompactlink"] = '<a href="'.$url.'rev='.$rev.'&all=0&ignorews='.($ignoreWhitespace ? '1' : '0').'">'.$lang['SHOWCOMPACT'].'</a>'; | |
$vars["showalllink"] = ""; |
$vars["showalllink"] = ''; | |
} | ||
if (!$ignoreWhitespace) { | ||
$vars['ignorewhitespacelink'] = '<a href="'.$url.'rev='.$rev.'&all='.($all ? '1' : '0').'&ignorews=1">'.$lang['IGNOREWHITESPACE'].'</a>'; | ||
$vars['regardwhitespacelink'] = ''; | ||
} else { | ||
$vars['regardwhitespacelink'] = '<a href="'.$url.'rev='.$rev.'&all='.($all ? '1' : '0').'&ignorews=0">'.$lang['REGARDWHITESPACE'].'</a>'; | ||
$vars['ignorewhitespacelink'] = ''; | ||
} |
} | |
|
| |
// Get the contents of the two files |
// Get the contents of the two files | |
$newtname = tempnam("temp", ""); |
$newtname = tempnam("temp", ""); | |
$svnrep->getFileContents($history->entries[0]->path, $newtname, $history->entries[0]->rev, "", true); |
$highlightedNew = $svnrep->getFileContents($history->entries[0]->path, $newtname, $history->entries[0]->rev, "", true); | |
|
| |
$oldtname = tempnam("temp", ""); |
$oldtname = tempnam("temp", ""); | |
$svnrep->getFileContents($history->entries[1]->path, $oldtname, $history->entries[1]->rev, "", true); |
$highlightedOld = $svnrep->getFileContents($history->entries[1]->path, $oldtname, $history->entries[1]->rev, "", true); | |
|
| |
$ent = true; |
$ent = (!$highlightedNew && !$highlightedOld); | |
$extension = strrchr(basename($path), "."); |
$listing = do_diff($all, $ignoreWhitespace, $rep, $ent, $newtname, $oldtname); | |
if (($extension && isset($extEnscript[$extension]) && ('php' == $extEnscript[$extension])) || ($config->useEnscript || $config->useGeshi)) { |
||
$ent = false; |
||
} |
||
|
||
if ($all) { |
||
// Setting the context to 0 makes diff generate the wrong line numbers! |
||
$context = 1; |
||
} |
||
|
||
// Open a pipe to the diff command with $context lines of context |
||
|
||
$cmd = quoteCommand($config->diff." -w -U $context \"$oldtname\" \"$newtname\""); |
||
|
||
if ($all) { |
||
$ofile = fopen($oldtname, "r"); |
||
$nfile = fopen($newtname, "r"); |
||
} |
||
|
||
$descriptorspec = array(0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w')); |
||
|
||
$resource = proc_open($cmd, $descriptorspec, $pipes); |
||
$error = ""; |
||
|
||
if (is_resource($resource)) { |
||
// We don't need to write |
||
fclose($pipes[0]); |
||
|
||
$diff = $pipes[1]; |
||
|
||
// Ignore the 3 header lines |
||
$line = fgets($diff); |
||
$line = fgets($diff); |
||
|
||
// Get the first real line |
||
$line = fgets($diff); |
||
|
||
$index = 0; |
||
$listing = array(); |
||
|
||
$curoline = 1; |
||
$curnline = 1; |
||
|
||
while (!feof($diff)) { |
||
// Get the first line of this range |
||
sscanf($line, "@@ -%d", $oline); |
||
|
||
$line = substr($line, strpos($line, "+")); |
||
sscanf($line, "+%d", $nline); |
||
|
||
if ($all) { |
||
while ($curoline < $oline || $curnline < $nline) { |
||
$listing[$index]["rev1diffclass"] = "diff"; |
||
$listing[$index]["rev2diffclass"] = "diff"; |
||
|
||
if ($curoline < $oline) { |
||
$nl = fgets($ofile); |
||
|
||
$line = rtrim($nl); |
||
if ($ent) $line = replaceEntities($line, $rep); |
||
|
||
$listing[$index]["rev1line"] = hardspace($line); |
||
|
||
$curoline++; |
||
} else { |
||
$listing[$index]["rev1line"] = " "; |
||
} |
||
|
||
if ($curnline < $nline) { |
||
$nl = fgets($nfile); |
||
|
||
$line = rtrim($nl); |
||
if ($ent) $line = replaceEntities($line, $rep); |
||
|
||
$listing[$index]["rev2line"] = hardspace($line); |
||
$curnline++; |
||
} else { |
||
$listing[$index]["rev2line"] = " "; |
||
} |
||
|
||
$listing[$index]["rev1lineno"] = 0; |
||
$listing[$index]["rev2lineno"] = 0; |
||
|
||
$index++; |
||
} |
||
|
||
} else { |
||
// Output the line numbers |
||
$listing[$index]["rev1lineno"] = $oline; |
||
$listing[$index]["rev2lineno"] = $nline; |
||
$index++; |
||
} |
||
|
||
$fin = false; |
||
while (!feof($diff) && !$fin) { |
||
$line = fgets($diff); |
||
if ($line === false || strncmp($line, "@@", 2) == 0) { |
||
$fin = true; |
||
} else { |
||
$listing[$index]["rev1lineno"] = 0; |
||
$listing[$index]["rev2lineno"] = 0; |
||
|
||
$mod = $line{0}; |
||
|
||
$line = rtrim(substr($line, 1)); |
||
if ($ent) $line = replaceEntities($line, $rep); |
||
|
||
if (strip_tags($line) == '') $line = ' '; |
||
$listing[$index]["rev1line"] = hardspace($line); |
||
|
||
$text = hardspace($line); |
||
|
||
switch ($mod) { |
||
case "-": |
||
$listing[$index]["rev1diffclass"] = "diffdeleted"; |
||
$listing[$index]["rev2diffclass"] = "diff"; |
||
|
||
$listing[$index]["rev1line"] = $text; |
||
$listing[$index]["rev2line"] = " "; |
||
|
||
if ($all) { |
||
fgets($ofile); |
||
$curoline++; |
||
} |
||
|
||
break; |
||
|
||
case "+": |
||
// Try to mark "changed" line sensibly |
||
if (!empty($listing[$index-1]) && empty($listing[$index-1]["rev1lineno"]) && @$listing[$index-1]["rev1diffclass"] == "diffdeleted" && @$listing[$index-1]["rev2diffclass"] == "diff") { |
||
$i = $index - 1; |
||
while (!empty($listing[$i-1]) && empty($listing[$i-1]["rev1lineno"]) && $listing[$i-1]["rev1diffclass"] == "diffdeleted" && $listing[$i-1]["rev2diffclass"] == "diff") { |
||
$i--; |
||
} |
||
|
||
$listing[$i]["rev1diffclass"] = "diffchanged"; |
||
$listing[$i]["rev2diffclass"] = "diffchanged"; |
||
$listing[$i]["rev2line"] = $text; |
||
|
||
if ($all) { |
||
fgets($nfile); |
||
$curnline++; |
||
} |
||
|
||
// Don't increment the current index count |
||
$index--; |
||
|
||
} else { |
||
$listing[$index]["rev1diffclass"] = "diff"; |
||
$listing[$index]["rev2diffclass"] = "diffadded"; |
||
|
||
$listing[$index]["rev1line"] = " "; |
||
$listing[$index]["rev2line"] = $text; |
||
|
||
if ($all) { |
||
fgets($nfile); |
||
$curnline++; |
||
} |
||
} |
||
break; |
||
|
||
default: |
||
$listing[$index]["rev1diffclass"] = "diff"; |
||
$listing[$index]["rev2diffclass"] = "diff"; |
||
|
||
$listing[$index]["rev1line"] = $text; |
||
$listing[$index]["rev2line"] = $text; |
||
|
||
if ($all) { |
||
fgets($ofile); |
||
fgets($nfile); |
||
$curoline++; |
||
$curnline++; |
||
} |
||
|
||
break; |
||
} |
||
} |
||
|
||
if (!$fin) { |
||
$index++; |
||
} |
||
} |
||
} |
||
|
||
// Output the rest of the files |
||
if ($all) { |
||
while (!feof($ofile) || !feof($nfile)) { |
||
$listing[$index]["rev1diffclass"] = "diff"; |
||
$listing[$index]["rev2diffclass"] = "diff"; |
||
|
||
$line = rtrim(fgets($ofile)); |
||
if ($ent) $line = replaceEntities($line, $rep); |
||
|
||
if (!feof($ofile)) { |
||
$listing[$index]["rev1line"] = hardspace($line); |
||
} else { |
||
$listing[$index]["rev1line"] = " "; |
||
} |
||
|
||
$line = rtrim(fgets($nfile)); |
||
if ($ent) $line = replaceEntities(rtrim(fgets($nfile)), $rep); |
||
|
||
if (!feof($nfile)) { |
||
$listing[$index]["rev2line"] = hardspace($line); |
||
} else { |
||
$listing[$index]["rev2line"] = " "; |
||
} |
||
|
||
$listing[$index]["rev1lineno"] = 0; |
||
$listing[$index]["rev2lineno"] = 0; |
||
|
||
$index++; |
||
} |
||
} |
||
|
||
fclose($pipes[1]); |
||
|
||
while (!feof($pipes[2])) { |
||
$error .= fgets($pipes[2]); |
||
} |
||
|
||
$error = toOutputEncoding(trim($error)); |
||
|
||
if (!empty($error)) $error = "<p>".$lang['BADCMD'].": <code>".$cmd."</code></p><p>".nl2br($error)."</p>"; |
||
|
||
fclose($pipes[2]); |
||
|
||
proc_close($resource); |
||
|
||
} else { |
||
$error = "<p>".$lang['BADCMD'].": <code>".$cmd."</code></p>"; |
||
} |
||
|
||
if (!empty($error)) { |
||
echo $error; |
||
|
||
if (is_resource($resource)) { |
||
fclose($pipes[0]); |
||
fclose($pipes[1]); |
||
fclose($pipes[2]); |
||
|
||
proc_close($resource); |
||
} |
||
exit; |
||
} |
||
|
||
if ($all) { |
||
fclose($ofile); |
||
fclose($nfile); |
||
} |
||
|
| |
// Remove our temporary files |
// Remove our temporary files | |
@unlink($oldtname); |
@unlink($oldtname); | |
@unlink($newtname); |
@unlink($newtname); | |
|
|