Don't cache entire project object
[gitphp.git] / include / git / ProjectListDirectory.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
/**
 * GitPHP ProjectListDirectory
 *
 * Lists all projects in a given directory
 *
 * @author Christopher Han <xiphux@gmail.com>
 * @copyright Copyright (c) 2010 Christopher Han
 * @package GitPHP
 * @subpackage Git
 */
 
require_once(GITPHP_INCLUDEDIR . 'Config.class.php');
require_once(GITPHP_GITOBJECTDIR . 'ProjectListBase.class.php');
require_once(GITPHP_GITOBJECTDIR . 'Project.class.php');
 
/**
 * ProjectListDirectory class
 *
 * @package GitPHP
 * @subpackage Git
 */
class GitPHP_ProjectListDirectory extends GitPHP_ProjectListBase
{
        
        /**
         * projectDir
         *
         * Stores projectlist directory internally
         *
         * @access protected
         */
        protected $projectDir;
 
        /**
         * __construct
         *
         * constructor
         *
         * @param string $projectDir directory to search
         * @throws Exception if parameter is not a directory
         * @access public
         */
        public function __construct($projectDir)
        {
                if (!is_dir($projectDir)) {
                        throw new Exception(sprintf(__('%1$s is not a directory'), $projectDir));
                }
 
                $this->projectDir = GitPHP_Util::AddSlash($projectDir);
 
                parent::__construct();
        }
 
        /**
         * PopulateProjects
         *
         * Populates the internal list of projects
         *
         * @access protected
         */
        protected function PopulateProjects()
        {
                $key = 'projectdir|' . $this->projectDir . '|projectlist|directory';
                $cached = GitPHP_Cache::GetObjectCacheInstance()->Get($key);
                if ($cached && (count($cached) > 0)) {
                        foreach ($cached as $proj) {
                                $this->AddProject($proj);
                        }
                        GitPHP_Log::GetInstance()->Log('Loaded ' . count($this->projects) . ' projects from cache');
                        return;
                }
 
                $this->RecurseDir($this->projectDir);
 
                if (count($this->projects) > 0) {
                        $projects = array();
                        foreach ($this->projects as $proj) {
                                $projects[] = $proj->GetProject();;
                        }
                        GitPHP_Cache::GetObjectCacheInstance()->Set($key, $projects, GitPHP_Config::GetInstance()->GetValue('cachelifetime', 3600));
                }
        }
 
        /**
         * RecurseDir
         *
         * Recursively searches for projects
         *
         * @param string $dir directory to recurse into
         */
        private function RecurseDir($dir)
        {
                if (!is_dir($dir))
                        return;
 
                GitPHP_Log::GetInstance()->Log(sprintf('Searching directory %1$s', $dir));
 
                if ($dh = opendir($dir)) {
                        $trimlen = strlen($this->projectDir) + 1;
                        while (($file = readdir($dh)) !== false) {
                                $fullPath = $dir . '/' . $file;
                                if ((strpos($file, '.') !== 0) && is_dir($fullPath)) {
                                        if (is_file($fullPath . '/HEAD')) {
                                                GitPHP_Log::GetInstance()->Log(sprintf('Found project %1$s', $fullPath));
                                                $projectPath = substr($fullPath, $trimlen);
                                                $this->AddProject($projectPath);
                                        } else {
                                                $this->RecurseDir($fullPath);
                                        }
                                } else {
                                        GitPHP_Log::GetInstance()->Log(sprintf('Skipping %1$s', $fullPath));
                                }
                        }
                        closedir($dh);
                }
        }
 
        /**
         * AddProject
         *
         * Add project to collection
         *
         * @access private
         */
        private function AddProject($projectPath)
        {
                try {
                        $proj = new GitPHP_Project($this->projectDir, $projectPath);
                        $category = trim(dirname($projectPath));
                        if (!(empty($category) || (strpos($category, '.') === 0))) {
                                $proj->SetCategory($category);
                        }
                        if ((!GitPHP_Config::GetInstance()->GetValue('exportedonly', false)) || $proj->GetDaemonEnabled()) {
                                $this->projects[$projectPath] = $proj;
                        }
                } catch (Exception $e) {
                        GitPHP_Log::GetInstance()->Log($e->getMessage());
                }
        }
 
}
 
comments