Make GeSHi autoloading really work
[phorkie.git] / src / phorkie / SetupCheck.php
index 53e4fd036d739552c84c4ce8e3fe5e317ed1268f..36d66c07328f9b952e897099d8c907c2a2b98892 100644 (file)
@@ -18,12 +18,15 @@ class SetupCheck
     protected $writableDirs;
     protected $elasticsearch;
 
+    public $messages = array();
+
     public function __construct()
     {
         $cfg = $GLOBALS['phorkie']['cfg'];
         $this->writableDirs = array(
-            'gitdir' => $cfg['gitdir'],
-            'workdir' => $cfg['workdir'],
+            'gitdir'  => Tools::foldPath($cfg['gitdir']),
+            'workdir' => Tools::foldPath($cfg['workdir']),
+            'cachedir' => Tools::foldPath($cfg['cachedir']),
         );
         $this->elasticsearch = $cfg['elasticsearch'];
     }
@@ -31,11 +34,36 @@ class SetupCheck
     public static function run()
     {
         $sc = new self();
+        $sc->checkConfigFiles();
         $sc->checkDeps();
         $sc->checkDirs();
         $sc->checkGit();
         $sc->checkDatabase();
         $sc->checkMimeTypeDetection();
+        $sc->checkRemoteForking();
+
+        return $sc->messages;
+    }
+
+    public function checkConfigFiles()
+    {
+        if (!isset($GLOBALS['phorkie']['cfgfiles'])
+            || count($GLOBALS['phorkie']['cfgfiles']) == 0
+        ) {
+            $this->info('No config files registered');
+            return;
+        }
+
+        foreach ($GLOBALS['phorkie']['cfgfiles'] as $file => $loaded) {
+            if ($loaded) {
+                $this->ok('Loaded config file: ' . Tools::foldPath($file));
+            } else {
+                $this->info(
+                    'Possible config file: ' . Tools::foldPath($file)
+                    . ' (not loaded)'
+                );
+            }
+        }
     }
 
     public function checkDeps()
@@ -69,8 +97,7 @@ class SetupCheck
         foreach ($this->writableDirs as $name => $dir) {
             if (!is_dir($dir)) {
                 $this->fail($name . ' directory does not exist at ' . $dir);
-            }
-            if (!is_writable($dir)) {
+            } else if (!is_writable($dir)) {
                 $this->fail($name . ' directory is not writable at ' . $dir);
             }
         }
@@ -82,8 +109,9 @@ class SetupCheck
         if ($retval !== 0) {
             $this->fail('Running git executable failed.');
         }
-        if (!preg_match('#^git version ([0-9.]+(rc[0-9]+)?)$#', $line, $matches)) {
+        if (!preg_match('#^git version ([0-9.]+(rc[0-9]+)?)(?: \(Apple Git-\d+\))?$#', $line, $matches)) {
             $this->fail('git version output format unexpected: ' . $line);
+            return;
         }
         if (version_compare($matches[1], '1.7.5') < 0) {
             $this->fail(
@@ -113,14 +141,41 @@ class SetupCheck
     public function checkMimeTypeDetection()
     {
         $rp = new Repository_Post();
-        if ($rp->getType('<?php echo "foo"; ?>') != 'php') {
-            $this->fail('MIME type detection fails');
+        $type = $rp->getType('<?php echo "foo"; ?>', true);
+        if ($type != 'php') {
+            $msg = 'MIME type detection fails';
+            if ($type instanceof \PEAR_Error) {
+                $msg .= '. Error: ' . $type->getMessage();
+            }
+            $this->fail($msg);
+        }
+    }
+
+    public function checkRemoteForking()
+    {
+        if (!isset($GLOBALS['phorkie']['cfg']['git']['public'])
+            || $GLOBALS['phorkie']['cfg']['git']['public'] == ''
+        ) {
+            $this->fail(
+                'No public git URL prefix configured.'
+                . ' Remote forking will not work'
+            );
         }
     }
 
     public function fail($msg)
     {
-        throw new Exception($msg);
+        $this->messages[] = array('error', $msg);
+    }
+
+    public function info($msg)
+    {
+        $this->messages[] = array('info', $msg);
+    }
+
+    public function ok($msg)
+    {
+        $this->messages[] = array('ok', $msg);
     }
 }