check git version in setupcheck
[phorkie.git] / src / phorkie / SetupCheck.php
1 <?php
2 namespace phorkie;
3
4 class SetupCheck
5 {
6     protected $deps = array(
7         'pear.php.net/VersionControl_Git' => 'VersionControl_Git',
8         'pear.twig-project.org/Twig'      => 'Twig_Autoloader',
9         'pear.php.net/Date_HumanDiff'     => 'Date_HumanDiff',
10     );
11
12     protected $writableDirs;
13
14
15     public function __construct()
16     {
17         $cfg = $GLOBALS['phorkie']['cfg'];
18         $this->writableDirs = array(
19             'gitdir' => $cfg['gitdir'],
20             'workdir' => $cfg['workdir'],
21         );
22     }
23
24     public static function run()
25     {
26         $sc = new self();
27         $sc->checkDeps();
28         $sc->checkDirs();
29         $sc->checkGit();
30     }
31
32     public function checkDeps()
33     {
34         foreach ($this->deps as $package => $class) {
35             if (!class_exists($class, true)) {
36                 $this->fail('PEAR package not installed: ' . $package);
37             }
38         }
39     }
40
41     public function checkDirs()
42     {
43         foreach ($this->writableDirs as $name => $dir) {
44             if (!is_dir($dir)) {
45                 $this->fail($name . ' directory does not exist at ' . $dir);
46             }
47             if (!is_writable($dir)) {
48                 $this->fail($name . ' directory is not writable at ' . $dir);
49             }
50         }
51     }
52
53     public function checkGit()
54     {
55         $line = exec('git --version', $lines, $retval);
56         if ($retval !== 0) {
57             $this->fail('Running git executable failed.');
58         }
59         if (!preg_match('#^git version ([0-9.]+)$#', $line, $matches)) {
60             $this->fail('git version output format unexpected: ' . $line);
61         }
62         if (version_compare($matches[1], '1.7.5') < 0) {
63             $this->fail(
64                 'git version needs to be at least 1.7.5, got: ' . $matches[1]
65             );
66         }
67     }
68
69     public function fail($msg)
70     {
71         throw new Exception($msg);
72     }
73 }
74
75 ?>