. */ require_once('lib/graph.class.php'); class shortlog { private $project; private $graph_data; private $first_commit; private $have_more = false; public function generate_shortlog($project, $head, $max, $skip, $file = null, $pages = true, $next_page = 0) { $this->project = $project; if($head && strtolower($head) == 'all') $head = null; $content = new ContentProvider('shortlog', 'shortlog'); if(GitConfig::GITGRAPH_ENABLE) { if($max+$skip >= 2000) { //only load the last 2k commits $real_skip = ($max+$skip) - 2000; $skip -= $real_skip; } else $real_skip = 0; } else { $real_skip = $skip; $skip = 0; } $commits = GitCommand::get_commits($project['path'], $head, $max+$skip+1, $real_skip, $file); if(GitConfig::GITGRAPH_ENABLE) { $this->graph_data = new graph_data_generator(); if($head == null) { //add all refs to the graph $rhash = GitCommand::get_hash($project['path'], "HEAD"); if($rhash) $this->graph_data->add_branch($rhash, null); foreach($this->project['refs'] as $ref => $rhash) { if(preg_match('#^refs/heads/#i', $ref) && preg_match('/^[a-f0-9]*$/i', $rhash)) { $this->graph_data->add_branch($rhash, $ref); } } foreach($this->project['refs'] as $ref => $rhash) { if(preg_match('#^refs/remotes/#i', $ref) && preg_match('/^[a-f0-9]*$/i', $rhash)) { $this->graph_data->add_branch($rhash, $ref); } } } $this->graph_data->parse($commits); $content->set('graph_data', $this->graph_data->get_header_graph()); } $commit_counter = 0; $this->first_commit = $commits[0]; foreach($commits as $commit) { $commit_counter++; if($commit_counter <= $skip) continue; if($commit_counter > $max+$skip) { $this->have_more = true; if($pages) { $content->append('entries', new ContentProvider('shortlog', 'shortlog_page', array("page" => $next_page))); } else $content->append('entries', new ContentProvider('shortlog', 'shortlog_more')); } else $content->append('entries', $this->shortlog_entry(($commit_counter % 2 ? 'dark' : 'light'), $commit)); } return $content; } public function get_first_commit() { return $this->first_commit; } public function get_have_more() { return $this->have_more; } private function shortlog_entry($class, $commit) { $entry = new ContentProvider('shortlog', 'shortlog_entry'); $entry->set('class', $class); $entry->set('hash', $commit['id']); $entry->set('author', htmlentities($commit['author'])); $entry->set('message', htmlentities(Tools::chop_text($commit['text'], 50, 5))); $age = time() - $commit['committer_time']; $date_str = date("Y-m-d", ($commit['committer_time'] ? $commit['committer_time'] : $commit['author_time'])); $age_calc = Tools::age_calculate($commit['committer_time']); $age_str = $age_calc['age_str']; if($age > 60*60*24*7*2) { $entry->set('date', $age_str); $entry->set('age', $date_str); } else { $entry->set('date', $date_str); $entry->set('age', $age_str); } if(GitConfig::GITGRAPH_ENABLE) $entry->set('graph_data', $this->graph_data->get_graph($commit['id'])); $entry->set('refs', $this->shortlog_commit_refs($this->project, $commit['id'])); return $entry; } public function shortlog_commit_refs($project, $hash) { if(!is_array($project['refs'])) return ""; $refs = new ContentProvider('shortlog', 'shortlog_refs'); $found = false; foreach($project['refs'] as $ref => $rhash) { if(strtolower($rhash) == strtolower($hash)) { $refexp = explode('/', $ref, 3); $reftype = $refexp[1]; if($reftype == 'heads') $reftype = 'head'; else if($reftype == 'remotes') $reftype = 'remote'; else if($reftype == 'tags') $reftype = 'tag'; $refs->append('refs', new ContentProvider('shortlog', 'shortlog_ref_'.$reftype, array("name" => $refexp[2], "ref_link" => $ref))); $found = true; } } return ($found ? $refs : ""); } } class page_shortlog { private $page, $phpgitweb; public function main($phpgitweb, $project) { $this->phpgitweb = $phpgitweb; $this->project = $project; if(!$this->project) return new ContentProvider('main', 'err400'); $project['refs'] = $phpgitweb->get_project_loader()->getProjectRefs($project); $phpgitweb->append_header_nav("shortlog", null, true); $phpgitweb->append_title("shortlog"); CommitLoader::parse(true); $this->page = new ContentProvider('shortlog', 'main'); if(strtolower(CommitLoader::$commit_base_id) != 'all') { $this->page->set('refname', ' - '.CommitLoader::$commit_base_id); } else $this->page->set('refname', ''); //pages if(array_key_exists('pg', $_GET)) { $pg = $_GET['pg']; if($pg < 0) $pg = 0; $skip = $_GET['pg'] * 100; $next_page = $_GET['pg'] + 1; } else { $pg = 0; $skip = 0; $next_page = 1; } $subnav = new ContentProvider('shortlog', 'shortlog_subnav'); $phpgitweb->append_sub_nav($subnav); if($pg) { $subnav->set('first', new ContentProvider('shortlog', 'shortlog_subnav_first_link')); $subnav->set('prev', new ContentProvider('shortlog', 'shortlog_subnav_prev_link', array('page' => ($pg - 1)))); } else { $subnav->set('first', new ContentProvider('shortlog', 'shortlog_subnav_first')); $subnav->set('prev', new ContentProvider('shortlog', 'shortlog_subnav_prev')); } $shortlog = new shortlog(); $this->page->set('shortlog', $shortlog->generate_shortlog($project, CommitLoader::$commit_base_id, 100, $skip, null, true, $next_page)); if($shortlog->get_have_more()) $subnav->set('next', new ContentProvider('shortlog', 'shortlog_subnav_next_link', array('page' => ($pg + 1)))); else $subnav->set('next', new ContentProvider('shortlog', 'shortlog_subnav_next')); return $this->page; } } ?>