assign_var('STYLESHEET', $stylesheet); foreach($icons as $action => $image) $template->assign_var('ICON_' . $action, $image); $dev_delimiter = '-'; $cl_keys = array_keys($changelogs); $defaults = array(); $clv = array(); // Initialize all settings... // (set defaults where needed while validating input) $defaults['t'] = $cl_keys[0]; // First available $defaults['p'] = 1; $defaults['c'] = CHANGELOG_MIN_PER_PAGE; $defaults['s'] = 1; // Update below if changed. $defaults['q'] = ''; $defaults['r'] = 2; // Search logs by default $defaults['d'] = array(); $clv['t'] = $defaults['t']; if(isset($_GET['t'])) { $clv['t'] = (int)$_GET['t']; if(!isset($changelogs[$clv['t']])) $clv['t'] = $defaults['t']; } $changelog = $changelogs[$clv['t']]; $template->assign_var('TYPE', $changelog['title']); $template->assign_var('TYPENUM', $clv['t']); $devs = array(); $result = mysql_query("SELECT * FROM ${changelog['authors_table']} WHERE username != '' ORDER BY commits DESC"); while($row = mysql_fetch_assoc($result)) { $devs[$row['username']] = array( 'name' => stripslashes(htmlspecialchars($row['fullname'])), 'changes' => $row['commits'], 'active' => $row['active'] ); if($row['fullname'] == '') $devs[$row['username']]['name'] = "User: " . $row['username']; } $clv['r'] = $defaults['r']; if(isset($_GET['r'])) { $numeric = (int)$_GET['r']; if(1 <= $numeric && $numeric <= 4) $clv['r'] = $numeric; } $clv['s'] = $defaults['s']; if(isset($_GET['s']) && $_GET['s'] == 0) $clv['s'] = 0; $clv['q'] = $defaults['q']; if(isset($_GET['q'])) { $searchq = $_GET['q']; if(get_magic_quotes_gpc()) { if(ini_get('magic_quotes_sybase')) $searchq = str_replace("''", "'", $searchq); else $searchq = stripslashes($searchq); } $clv['q'] = mysql_real_escape_string($searchq); } $clv['d'] = $defaults['d']; if(isset($_GET['d'])) { $new = array(); $values = explode($dev_delimiter, $_GET['d']); if($values !== false) { foreach($values as $entry) { if(isset($devs[$entry]) && !in_array($entry, $new)) $new[] = $entry; } } if(count($new) > 0) $clv['d'] = $new; } $clv['c'] = $defaults['c']; if(isset($_GET['c'])) { $clv['c'] = (int)$_GET['c']; if($clv['c'] < CHANGELOG_MIN_PER_PAGE) $clv['c'] = CHANGELOG_MIN_PER_PAGE; else if($clv['c'] > CHANGELOG_MAX_PER_PAGE) $clv['c'] = CHANGELOG_MAX_PER_PAGE; } // We'll first get a quick and dirty upper limit on the page count so // we can save a few CPU cycles in case the page request was higher // than the max page on a default view with nothing filtered. $row = mysql_fetch_row(mysql_query( "SELECT COUNT(revision) FROM ${changelog['commits_table']}")); $total_revisions = $row[0]; $pagecount = ceil($total_revisions / $clv['c']); $clv['p'] = $defaults['p']; if(isset($_GET['p'])) { $clv['p'] = (int)$_GET['p']; if($clv['p'] < 1) $clv['p'] = 1; if($clv['p'] > $pagecount) $clv['p'] = $pagecount; } // Do the actual query for the revisions requested and adjust the revision count. $num_revisions = 0; $db_where_expr = ''; $db_join_expr = ''; // Filter developers as necessary if(count($clv['d']) > 0) { if(count($clv['d']) > 1) $db_where_expr .= "("; for($x = 0; $x < count($clv['d']); $x++) { $db_where_expr .= "author = '{$clv['d'][$x]}'"; if($x + 1 != count($clv['d'])) $db_where_expr .= " OR "; } if(count($clv['d']) > 1) $db_where_expr .= ")"; $dev_filter_active = true; } // Run search if requested if($clv['q'] != '') { if($dev_filter_active) $db_where_expr .= " AND"; $files = "MATCH(path, copy_path) AGAINST('{$clv['q']}' IN BOOLEAN MODE)"; $logs = "MATCH(message) AGAINST('{$clv['q']}' IN BOOLEAN MODE)"; $join = "RIGHT JOIN ${changelog['changes_table']} ON " . "${changelog['changes_table']}.revision = ${changelog['commits_table']}.revision"; $groupby = " GROUP BY ${changelog['commits_table']}.revision "; switch($clv['r']) { case 1: $db_join_expr = $join; $db_where_expr .= " " . $files . $groupby; break; case 2: $db_where_expr .= " " .$logs; break; case 3: $db_join_expr = $join; $db_where_expr .= " ($files OR $logs)"; break; case 4: $db_join_expr = $join; $db_where_expr .= " ($files AND $logs)"; break; } } $db_offset = ($clv['p'] - 1) * $clv['c']; if($db_where_expr != '') $db_where_expr = "WHERE $db_where_expr"; $db_query = "SELECT SQL_CALC_FOUND_ROWS ${changelog['commits_table']}.* " . "FROM ${changelog['commits_table']} $db_join_expr $db_where_expr " . /*"GROUP BY ${changelog['commits_table']}.revision " . */ "ORDER BY ${changelog['commits_table']}.revision DESC"; $db_limit = " LIMIT $db_offset, {$clv['c']}"; //echo "Query: $db_query$db_limit\n\n"; $db_commits = mysql_query($db_query . $db_limit); if($db_commits !== false) $num_revisions = mysql_num_rows($db_commits); //else // echo mysql_error(); // Grab the total revision count for our real query. $result = mysql_query("SELECT FOUND_ROWS()"); $row = mysql_fetch_row($result); $total_revisions = $row[0]; // Re-adjust page count based on real query this time. $pagecount = ceil($total_revisions / $clv['c']); if(!$pagecount) $pagecount = 1; if($clv['p'] > $pagecount) { // Somehow a request still came through beyond the range of available pages, // but still low enough for the default view with nothing filtered. // We'll want to cap the page and re-run the query for the last available page. $clv['p'] = $pagecount; $db_offset = ($clv['p'] - 1) * $clv['c']; // So much for saving CPU cycles this run, but this should rarely happen. $db_commits = mysql_query($db_query . " LIMIT $db_offset, {$clv['c']}"); } $template->assign_var('LINECOUNT', number_format($total_revisions)); $output = "
\n"; while($commit = mysql_fetch_assoc($db_commits)) { $output .= "
"; $output .= "r{$commit['revision']}: {$commit['date']}"; if($commit['author'] != '') $output .= ' [' . $commit['author'] . '] ' . $devs[$commit['author']]['name']; $output .= "
\n"; $output .= "
\n"; $changes = mysql_query("SELECT * FROM ${changelog['changes_table']} " . "WHERE revision = {$commit['revision']} ORDER BY path"); if($changes === false) $output .= "

No changes found for this commit.

\n"; else { $output .= "

\n"; $num_changes = mysql_num_rows($changes); if($clv['s'] == 1 && $num_changes > $changelog['summary_limit']) { $output .= " " . anchor("javascript:;", "Click to show all " . number_format($num_changes) . " changes...", "this.className='hidden';document.getElementById('csi{$commit['revision']}').className='shown';showChanges({$commit['revision']});", "shown"); $output .= "" . image("loading.gif", "Loading") . "\n"; } else { while($row = mysql_fetch_assoc($changes)) { $output .= svnlog_format_change($commit['revision'], $row['action'], $row['path'], $row['copy_path'], $row['copy_revision']); } } $output .= "

\n"; } $message = svnlog_format_message($commit['message']); $output .= "

{$message}

\n"; $output .= "
\n"; } $output .= "
\n"; $template->assign_var('CHANGELOG', $output); // This will save us a lot of trouble generating links below. // It will also reduce average URL lengths by filtering default values. // Post returns the array of significant variables if true. function get_query($custom = array(), $post = false) { global $clv, $defaults, $dev_delimiter; $new = array_merge($clv, $custom); foreach($new as $key => $value) if(/*!array_key_exists($key, $custom) &&*/ $defaults[$key] == $value) unset($new[$key]); if(isset($new['d'])) $new['d'] = implode($dev_delimiter, $new['d']); if(isset($new['q'])) $new['q'] = stripslashes($new['q']); if($post) return $new; $query = http_build_query($new, '', '&'); if($query != '') $query = '?' . $query; else { $url = $_SERVER['REQUEST_URI']; $query = substr($url, 0, strpos($url, '?')); } return $query; } // Assign remaining template variables that require get_query()... $types = ''; while(list($key, $data) = each($changelogs)) { if($clv['t'] != $key) $types .= anchor(get_query(array('t' => $key)), $data['title']); else $types .= $data['title']; $types .= ', '; } $template->assign_var('TYPES', substr($types, 0, -2)); function get_pn_link($page) { return anchor(get_query(array('p' => $page)), $page) . " "; } $pagenav = ''; if($clv['p'] > 1) $pagenav .= anchor(get_query(array('p' => $clv['p'] - 1)), image($icons['page_previous'], "Previous Page", "Previous Page")); else $pagenav .= image($icons['page_previous'], "Previous Page", "Previous Page"); if($clv['p'] > 3) $pagenav .= get_pn_link(1); if($clv['p'] > 4) { $p1 = round(1 + ($clv['p'] - 3) / 3); $p2 = round(1 + ($clv['p'] - 3) / 3 * 2); $pagenav .= get_pn_link($p1); if($p1 != $p2) $pagenav .= get_pn_link($p2); } if($clv['p'] > 2) $pagenav .= get_pn_link($clv['p'] - 2); if($clv['p'] > 1) $pagenav .= get_pn_link($clv['p'] - 1); $pagenav .= $clv['p'] . ' '; if($clv['p'] < $pagecount) $pagenav .= get_pn_link($clv['p'] + 1); if($clv['p'] < ($pagecount - 1)) $pagenav .= get_pn_link($clv['p'] + 2); if($clv['p'] < ($pagecount - 3)) { $p1 = $pagecount - ceil(1 + ($pagecount - $clv['p'] - 4) / 3 * 2); $p2 = $pagecount - floor(1 + ($pagecount - $clv['p'] - 4) / 3); $pagenav .= get_pn_link($p1); if($p1 != $p2) $pagenav .= get_pn_link($p2); } if($clv['p'] < ($pagecount - 2)) $pagenav .= get_pn_link($pagecount); $pagenav = substr($pagenav, 0, -1); if($clv['p'] < $pagecount) $pagenav .= anchor(get_query(array('p' => $clv['p'] + 1)), image($icons['page_next'], "Next Page", "Next Page")); else $pagenav .= image($icons['page_next'], "Next Page", "Next Page"); $template->assign_var('PAGENAV', $pagenav); $changelinks = ''; $changesArray = array(25, 50, 100, 250); while(list(, $changes) = each($changesArray)) { $page = ceil((($clv['p'] - 1) * $clv['c'] + 1) / $changes); if($changes != $clv['c']) $changelinks .= anchor(get_query(array('p' => $page, 'c' => $changes)), $changes) . ' '; else $changelinks .= $changes . ' '; } $template->assign_var('CHANGES', $changelinks); $filesummary = ''; if($clv['s'] == 1) $filesummary = 'On | ' . anchor(get_query(array('s' => 0)), 'Off'); else $filesummary = anchor(get_query(array('s' => 1)), 'On') . ' | Off'; $template->assign_var('SUMMARIZE', $filesummary); $hiddenvars = ''; foreach(get_query(array('q' => $defaults['q'], 'r' => $defaults['r'], 'p' => 1), true) as $name => $value) $hiddenvars .= ''; $template->assign_var('SEARCHQV', $hiddenvars); $searchmethod = ''; $template->assign_var('SEARCHRANGE', $searchmethod); $template->assign_var('SEARCHQUERY', htmlspecialchars(stripslashes($clv['q']))); $devcontrol = ''; $devs_asort = array(); if($clv['d'] != $defaults['d']) $devcontrol .= '
' . anchor(get_query(array('d' => $defaults['d'], 'p' => 1)), 'Show All') . "
\n"; // Create dev filter sorted by commits $devcontrol .= '
' . "\n"; foreach($devs as $username => $details) { if(!$details['active']) $devcontrol .= '
'; else $devcontrol .= '
'; $num_changes = number_format($details['changes']); if(array_search($username, $clv['d']) !== false) $devcontrol .= $details['name'] . " ($num_changes)"; else $devcontrol .= anchor(get_query(array('d' => array($username), 'p' => 1)), $details['name']) . " ($num_changes)"; $devcontrol .= "
\n"; $devs_asort[$details['name'] . ':' . $username] = array('username' => $username, 'changes' => $details['changes'], 'active' => $details['active']); } $devcontrol .= "
\n"; // Create dev filter sorted alphabetically ksort($devs_asort); $devcontrol .= '
' . "\n"; foreach($devs_asort as $name => $info) { if(!$info['active']) $devcontrol .= '
'; else $devcontrol .= '
'; $num_changes = number_format($info['changes']); $fullname = substr($name, 0, strrpos($name, ':')); if(array_search($info['username'], $clv['d']) !== false) $devcontrol .= $fullname . " ($num_changes)"; else $devcontrol .= anchor(get_query(array( 'd' => array($info['username']), 'p' => 1)), $fullname) . " ($num_changes)"; $devcontrol .= "
\n"; } $devcontrol .= "
\n"; $template->assign_var('DEVCONTROL', $devcontrol); // Show any active filters $filters = ''; if($clv['q'] != $defaults['q']) { $filters .= '
  • "' . htmlspecialchars(stripslashes($clv['q'])) . '" ' . anchor(get_query(array('q' => $defaults['q'], 'r' => $defaults['r'])), 'Remove Filter') . "
  • "; } foreach($clv['d'] as $dev_filter) { $removed_dev = $clv['d']; unset($removed_dev[array_search($dev_filter, $removed_dev)]); $filters .= '
  • ' . $devs[$dev_filter]['name'] . ' ' . anchor(get_query(array('d' => $removed_dev)), 'Remove Filter') . "
  • "; } if($filters != '') { $filters = <<
    • Active Filters:
    • $filters
    FILTERS; } $template->assign_var('FILTERS', $filters); // Do the actual page output now... $time_end = microtime(true); $template->assign_var('PROCESSTIME', sprintf('%.5f', $time_end - $time_start)); $template->set_filenames(array('index' => $page_tpl)); //printf("Page Generation Time: %02.5f Seconds", $time_end - $time_start); $template->pparse('index'); ?>