fixed shortlog entrycount & show refname / base commit on shortlog page
[phpgitweb.git] / htdocs / pages / shortlog.class.php
index 34cfa8042f35aa6a8108e6c900a979fda062501d..091e1d1140c2829766f7c2c85c4fa3044a9e2b8e 100644 (file)
@@ -22,9 +22,12 @@ 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) {
@@ -44,6 +47,10 @@ class shortlog {
                        $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);
@@ -63,9 +70,10 @@ class shortlog {
                $this->first_commit = $commits[0];
                foreach($commits as $commit) {
                        $commit_counter++;
-                       if($commit_counter < $skip)
+                       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
@@ -81,6 +89,10 @@ class shortlog {
                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);
@@ -101,17 +113,17 @@ class shortlog {
                if(GitConfig::GITGRAPH_ENABLE)
                        $entry->set('graph_data', $this->graph_data->get_graph($commit['id']));
                
-               $entry->set('refs', $this->shortlog_commit_refs($commit['id']));
+               $entry->set('refs', $this->shortlog_commit_refs($this->project, $commit['id']));
                
                return $entry;
        }
        
-       private function shortlog_commit_refs($hash) {
-               if(!is_array($this->project['refs']))
+       public function shortlog_commit_refs($project, $hash) {
+               if(!is_array($project['refs']))
                        return "";
                $refs = new ContentProvider('shortlog', 'shortlog_refs');
                $found = false;
-               foreach($this->project['refs'] as $ref => $rhash) {
+               foreach($project['refs'] as $ref => $rhash) {
                        if(strtolower($rhash) == strtolower($hash)) {
                                $refexp = explode('/', $ref, 3);
                                $reftype = $refexp[1];
@@ -138,23 +150,49 @@ class page_shortlog {
                $this->phpgitweb = $phpgitweb;
                $this->project = $project;
                if(!$this->project)
-                       return;
+                       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, null, 100, $skip, null, true, $next_page));
+               $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;
        }