2 /* shortlog.class.php - phpgitweb
3 * Copyright (C) 2011-2012 Philipp Kreil (pk910)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 require_once('lib/graph.class.php');
24 private $first_commit;
25 private $have_more = false;
27 public function generate_shortlog($project, $head, $max, $skip, $file = null, $pages = true, $next_page = 0) {
28 $this->project = $project;
29 if($head && strtolower($head) == 'all')
31 $content = new ContentProvider('shortlog', 'shortlog');
33 if(GitConfig::GITGRAPH_ENABLE) {
34 if($max+$skip >= 2000) { //only load the last 2k commits
35 $real_skip = ($max+$skip) - 2000;
44 $commits = GitCommand::get_commits($project['path'], $head, $max+$skip+1, $real_skip, $file);
46 if(GitConfig::GITGRAPH_ENABLE) {
47 $this->graph_data = new graph_data_generator();
49 //add all refs to the graph
50 $rhash = GitCommand::get_hash($project['path'], "HEAD");
52 $this->graph_data->add_branch($rhash, null);
54 foreach($this->project['refs'] as $ref => $rhash) {
55 if(preg_match('#^refs/heads/#i', $ref) && preg_match('/^[a-f0-9]*$/i', $rhash)) {
56 $this->graph_data->add_branch($rhash, $ref);
59 foreach($this->project['refs'] as $ref => $rhash) {
60 if(preg_match('#^refs/remotes/#i', $ref) && preg_match('/^[a-f0-9]*$/i', $rhash)) {
61 $this->graph_data->add_branch($rhash, $ref);
65 $this->graph_data->parse($commits);
66 $content->set('graph_data', $this->graph_data->get_header_graph());
70 $this->first_commit = $commits[0];
71 foreach($commits as $commit) {
73 if($commit_counter <= $skip)
75 if($commit_counter > $max+$skip) {
76 $this->have_more = true;
78 $content->append('entries', new ContentProvider('shortlog', 'shortlog_page', array("page" => $next_page)));
80 $content->append('entries', new ContentProvider('shortlog', 'shortlog_more'));
82 $content->append('entries', $this->shortlog_entry(($commit_counter % 2 ? 'dark' : 'light'), $commit));
88 public function get_first_commit() {
89 return $this->first_commit;
92 public function get_have_more() {
93 return $this->have_more;
96 private function shortlog_entry($class, $commit) {
97 $entry = new ContentProvider('shortlog', 'shortlog_entry');
98 $entry->set('class', $class);
99 $entry->set('hash', $commit['id']);
100 $entry->set('author', htmlentities($commit['author']));
101 $entry->set('message', htmlentities(Tools::chop_text($commit['text'], 50, 5)));
102 $age = time() - $commit['committer_time'];
103 $date_str = date("Y-m-d", ($commit['committer_time'] ? $commit['committer_time'] : $commit['author_time']));
104 $age_calc = Tools::age_calculate($commit['committer_time']);
105 $age_str = $age_calc['age_str'];
106 if($age > 60*60*24*7*2) {
107 $entry->set('date', $age_str);
108 $entry->set('age', $date_str);
110 $entry->set('date', $date_str);
111 $entry->set('age', $age_str);
113 if(GitConfig::GITGRAPH_ENABLE)
114 $entry->set('graph_data', $this->graph_data->get_graph($commit['id']));
116 $entry->set('refs', $this->shortlog_commit_refs($this->project, $commit['id']));
121 public function shortlog_commit_refs($project, $hash) {
122 if(!is_array($project['refs']))
124 $refs = new ContentProvider('shortlog', 'shortlog_refs');
126 foreach($project['refs'] as $ref => $rhash) {
127 if(strtolower($rhash) == strtolower($hash)) {
128 $refexp = explode('/', $ref, 3);
129 $reftype = $refexp[1];
130 if($reftype == 'heads')
132 else if($reftype == 'remotes')
134 else if($reftype == 'tags')
136 $refs->append('refs', new ContentProvider('shortlog', 'shortlog_ref_'.$reftype, array("name" => $refexp[2], "ref_link" => $ref)));
140 return ($found ? $refs : "");
146 class page_shortlog {
147 private $page, $phpgitweb;
149 public function main($phpgitweb, $project) {
150 $this->phpgitweb = $phpgitweb;
151 $this->project = $project;
153 return new ContentProvider('main', 'err400');
154 $project['refs'] = $phpgitweb->get_project_loader()->getProjectRefs($project);
155 $phpgitweb->append_header_nav("shortlog", null, true);
156 $phpgitweb->append_title("shortlog");
157 CommitLoader::parse(true);
159 $this->page = new ContentProvider('shortlog', 'main');
160 if(strtolower(CommitLoader::$commit_base_id) != 'all') {
161 $this->page->set('refname', ' - '.CommitLoader::$commit_base_id);
163 $this->page->set('refname', '');
166 if(array_key_exists('pg', $_GET)) {
170 $skip = $_GET['pg'] * 100;
171 $next_page = $_GET['pg'] + 1;
178 $subnav = new ContentProvider('shortlog', 'shortlog_subnav');
179 $phpgitweb->append_sub_nav($subnav);
182 $subnav->set('first', new ContentProvider('shortlog', 'shortlog_subnav_first_link'));
183 $subnav->set('prev', new ContentProvider('shortlog', 'shortlog_subnav_prev_link', array('page' => ($pg - 1))));
185 $subnav->set('first', new ContentProvider('shortlog', 'shortlog_subnav_first'));
186 $subnav->set('prev', new ContentProvider('shortlog', 'shortlog_subnav_prev'));
189 $shortlog = new shortlog();
190 $this->page->set('shortlog', $shortlog->generate_shortlog($project, CommitLoader::$commit_base_id, 100, $skip, null, true, $next_page));
192 if($shortlog->get_have_more())
193 $subnav->set('next', new ContentProvider('shortlog', 'shortlog_subnav_next_link', array('page' => ($pg + 1))));
195 $subnav->set('next', new ContentProvider('shortlog', 'shortlog_subnav_next'));