Merge pull request #10 from phantom94/patch-1
[gitphp.git] / include / controller / Controller_GraphData.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
/**
 * Controller for returning raw graph data
 *
 * @author Christopher Han <xiphux@gmail.com>
 * @copyright Copyright (c) 2012 Christopher Han
 * @package GitPHP
 * @subpackage Controller
 */
class GitPHP_Controller_GraphData extends GitPHP_ControllerBase
{
        /**
         * Initialize controller
         */
        public function Initialize()
        {
                parent::Initialize();
 
                if (!$this->config->GetValue('graphs')) {
                        throw new Exception('Graphing has been disabled');
                }
 
                $this->preserveWhitespace = true;
                $this->DisableLogging();
        }
 
        /**
         * Gets the template for this controller
         *
         * @return string template filename
         */
        protected function GetTemplate()
        {
                return 'graphdata.tpl';
        }
 
        /**
         * Gets the cache key for this controller
         *
         * @return string cache key
         */
        protected function GetCacheKey()
        {
                return isset($this->params['graphtype']) ? $this->params['graphtype'] : '';
        }
 
        /**
         * Gets the name of this controller's action
         *
         * @param boolean $local true if caller wants the localized action name
         * @return string action name
         */
        public function GetName($local = false)
        {
                return 'graphdata';
        }
 
        /**
         * Loads headers for this template
         */
        protected function LoadHeaders()
        {
                $this->headers[] = 'Content-Type: application/json';
        }
 
        /**
         * Loads data for this template
         */
        protected function LoadData()
        {
                $head = $this->GetProject()->GetHeadCommit();
 
                $data = null;
 
                if ($this->params['graphtype'] == 'commitactivity') {
 
                        $data = array();
 
                        $commits = explode("\n", $this->exe->Execute($this->GetProject()->GetPath(), 'rev-list', array('--format=format:"%H %ct"', $head->GetHash())));
                        foreach ($commits as $commit) {
                                if (preg_match('/^([0-9a-fA-F]{40}) ([0-9]+)$/', $commit, $regs)) {
                                        $data[] = array('CommitEpoch' => (int)$regs[2]);
                                }
                        }
 
                } else if ($this->params['graphtype'] == 'languagedist') {
 
                        $data = array();
 
                        include_once(GITPHP_GESHIDIR . "geshi.php");
                        $geshi = new GeSHi("",'php');
 
                        $files = explode("\n", $this->exe->Execute($this->GetProject()->GetPath(), 'ls-tree', array('-r', '--name-only', $head->GetTree()->GetHash())));
                        foreach ($files as $file) {
                                $filename = GitPHP_Util::BaseName($file);
                                $lang = GitPHP_Util::GeshiFilenameToLanguage($filename);
                                if (empty($lang)) {
                                        $lang = $geshi->get_language_name_from_extension(substr(strrchr($filename, '.'), 1));
                                        if (empty($lang)) {
                                                $lang = 'Other';
                                        }
                                }
 
                                if (!empty($lang) && ($lang !== 'Other')) {
                                        $fulllang = $geshi->get_language_fullname($lang);
                                        if (!empty($fulllang))
                                                $lang = $fulllang;
                                }
 
                                if (isset($data[$lang])) {
                                        $data[$lang]++;
                                } else {
                                        $data[$lang] = 1;
                                }
                        }
 
                }
 
                $this->tpl->assign('data', json_encode($data));
        }
 
}
 
comments