--- /dev/null
+<?php\r
+\r
+namespace Friendica\Core\Console;\r
+\r
+/**\r
+ * Tired of chasing typos and finding them after a commit.\r
+ * Run this and quickly see if we've got any parse errors in our application files.\r
+ *\r
+ * @author Hypolite Petovan <mrpetovan@gmail.com>\r
+ */\r
+class Typo extends \Asika\SimpleConsole\Console\r
+{\r
+ protected $helpOptions = ['h', 'help', '?'];\r
+\r
+ protected function getHelp()\r
+ {\r
+ $help = <<<HELP\r
+console typo - Checks for parse errors in Friendica files\r
+Usage\r
+ bin/console typo [-h|--help|-?] [-v]\r
+\r
+Description\r
+ Checks all PHP files in the Friendica file tree for parse errors\r
+\r
+Options\r
+ -h|--help|-? Show help information\r
+ -v Show more debug information.\r
+HELP;\r
+ return $help;\r
+ }\r
+\r
+ protected function doExecute()\r
+ {\r
+ if ($this->getOption('v')) {\r
+ $this->out('Class: ' . __CLASS__);\r
+ $this->out('Arguments: ' . var_export($this->args, true));\r
+ $this->out('Options: ' . var_export($this->options, true));\r
+ }\r
+\r
+ if (count($this->args) > 0) {\r
+ throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');\r
+ }\r
+\r
+ $a = get_app();\r
+\r
+ $php_path = $a->getConfigValue('config', 'php_path', 'php');\r
+\r
+ if ($this->getOption('v')) {\r
+ $this->out('Directory: src');\r
+ }\r
+\r
+ $Iterator = new \RecursiveDirectoryIterator('src');\r
+\r
+ foreach (new \RecursiveIteratorIterator($Iterator) as $file) {\r
+ if (substr($file, -4) === '.php') {\r
+ $this->checkFile($php_path, $file);\r
+ }\r
+ }\r
+\r
+ if ($this->getOption('v')) {\r
+ $this->out('Directory: mod');\r
+ }\r
+\r
+ $files = glob('mod/*.php');\r
+ $this->checkFiles($php_path, $files);\r
+\r
+ if ($this->getOption('v')) {\r
+ $this->out('Directory: include');\r
+ }\r
+\r
+ $files = glob('include/*.php');\r
+ $this->checkFiles($php_path, $files);\r
+\r
+ if ($this->getOption('v')) {\r
+ $this->out('Directory: addon');\r
+ }\r
+\r
+ $dirs = glob('addon/*');\r
+ foreach ($dirs as $dir) {\r
+ $addon = basename($dir);\r
+ $files = glob($dir . '/' . $addon . '.php');\r
+ $this->checkFiles($php_path, $files);\r
+ }\r
+\r
+ if ($this->getOption('v')) {\r
+ $this->out('String files');\r
+ }\r
+\r
+ $this->checkFile($php_path, 'util/strings.php');\r
+\r
+ $files = glob('view/lang/*/strings.php');\r
+ $this->checkFiles($php_path, $files);\r
+\r
+ $this->out('No errors.');\r
+\r
+ return 0;\r
+ }\r
+\r
+ private function checkFiles($php_path, array $files)\r
+ {\r
+ foreach ($files as $file) {\r
+ $this->checkFile($php_path, $file);\r
+ }\r
+ }\r
+\r
+ private function checkFile($php_path, $file)\r
+ {\r
+ if ($this->getOption('v')) {\r
+ $this->out('Checking ' . $file);\r
+ }\r
+\r
+ $output = [];\r
+ $ret = 0;\r
+ exec("$php_path -l $file", $output, $ret);\r
+ if ($ret !== 0) {\r
+ throw new \RuntimeException('Parse error found in ' . $file . ', scan stopped.');\r
+ }\r
+ }\r
+}\r