Line feeds fixed, not change in functionality

This commit is contained in:
Michael 2018-03-24 18:39:13 +00:00
parent 885d794958
commit 850d9b4c0b
20 changed files with 2256 additions and 2256 deletions

View file

@ -1,135 +1,135 @@
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace Friendica\Core\Console;
use Asika\SimpleConsole\CommandArgsException;
use dba;
use Friendica\Core;
require_once 'include/dba.php';
require_once 'include/text.php';
/**
* @brief tool to access the system config from the CLI
*
* With this script you can access the system configuration of your node from
* the CLI. You can do both, reading current values stored in the database and
* set new values to config variables.
*
* Usage:
* If you specify no parameters at the CLI, the script will list all config
* variables defined.
*
* If you specify one parameter, the script will list all config variables
* defined in this section of the configuration (e.g. "system").
*
* If you specify two parameters, the script will show you the current value
* of the named configuration setting. (e.g. "system loglevel")
*
* If you specify three parameters, the named configuration setting will be
* set to the value of the last parameter. (e.g. "system loglevel 0" will
* disable logging)
*
* @author Tobias Diekershoff
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class Config extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console config - Manage site configuration
Synopsis
bin/console config [-h|--help|-?] [-v]
bin/console config <category> [-h|--help|-?] [-v]
bin/console config <category> <key> [-h|--help|-?] [-v]
bin/console config <category> <key> <value> [-h|--help|-?] [-v]
Description
bin/console config
Lists all config values
bin/console config <category>
Lists all config values in the provided category
bin/console config <category> <key>
Shows the value of the provided key in the category
bin/console config <category> <key> <value>
Sets the value of the provided key in the category
Notes:
Setting config entries which are manually set in .htconfig.php may result in
conflict between database settings and the manual startup settings.
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Executable: ' . $this->executable);
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) > 3) {
throw new CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
if (count($this->args) == 3) {
Core\Config::set($this->getArgument(0), $this->getArgument(1), $this->getArgument(2));
$this->out("config[{$this->getArgument(0)}][{$this->getArgument(1)}] = " . Core\Config::get($this->getArgument(0),
$this->getArgument(1)));
}
if (count($this->args) == 2) {
$this->out("config[{$this->getArgument(0)}][{$this->getArgument(1)}] = " . Core\Config::get($this->getArgument(0),
$this->getArgument(1)));
}
if (count($this->args) == 1) {
Core\Config::load($this->getArgument(0));
$a = get_app();
if (!is_null($a->config[$this->getArgument(0)])) {
foreach ($a->config[$this->getArgument(0)] as $k => $x) {
$this->out("config[{$this->getArgument(0)}][{$k}] = " . $x);
}
} else {
$this->out('Config section ' . $this->getArgument(0) . ' returned nothing');
}
}
if (count($this->args) == 0) {
$configs = dba::select('config');
foreach ($configs as $config) {
$this->out("config[{$config['cat']}][{$config['k']}] = " . $config['v']);
}
}
return 0;
}
}
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace Friendica\Core\Console;
use Asika\SimpleConsole\CommandArgsException;
use dba;
use Friendica\Core;
require_once 'include/dba.php';
require_once 'include/text.php';
/**
* @brief tool to access the system config from the CLI
*
* With this script you can access the system configuration of your node from
* the CLI. You can do both, reading current values stored in the database and
* set new values to config variables.
*
* Usage:
* If you specify no parameters at the CLI, the script will list all config
* variables defined.
*
* If you specify one parameter, the script will list all config variables
* defined in this section of the configuration (e.g. "system").
*
* If you specify two parameters, the script will show you the current value
* of the named configuration setting. (e.g. "system loglevel")
*
* If you specify three parameters, the named configuration setting will be
* set to the value of the last parameter. (e.g. "system loglevel 0" will
* disable logging)
*
* @author Tobias Diekershoff
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class Config extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console config - Manage site configuration
Synopsis
bin/console config [-h|--help|-?] [-v]
bin/console config <category> [-h|--help|-?] [-v]
bin/console config <category> <key> [-h|--help|-?] [-v]
bin/console config <category> <key> <value> [-h|--help|-?] [-v]
Description
bin/console config
Lists all config values
bin/console config <category>
Lists all config values in the provided category
bin/console config <category> <key>
Shows the value of the provided key in the category
bin/console config <category> <key> <value>
Sets the value of the provided key in the category
Notes:
Setting config entries which are manually set in .htconfig.php may result in
conflict between database settings and the manual startup settings.
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Executable: ' . $this->executable);
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) > 3) {
throw new CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
if (count($this->args) == 3) {
Core\Config::set($this->getArgument(0), $this->getArgument(1), $this->getArgument(2));
$this->out("config[{$this->getArgument(0)}][{$this->getArgument(1)}] = " . Core\Config::get($this->getArgument(0),
$this->getArgument(1)));
}
if (count($this->args) == 2) {
$this->out("config[{$this->getArgument(0)}][{$this->getArgument(1)}] = " . Core\Config::get($this->getArgument(0),
$this->getArgument(1)));
}
if (count($this->args) == 1) {
Core\Config::load($this->getArgument(0));
$a = get_app();
if (!is_null($a->config[$this->getArgument(0)])) {
foreach ($a->config[$this->getArgument(0)] as $k => $x) {
$this->out("config[{$this->getArgument(0)}][{$k}] = " . $x);
}
} else {
$this->out('Config section ' . $this->getArgument(0) . ' returned nothing');
}
}
if (count($this->args) == 0) {
$configs = dba::select('config');
foreach ($configs as $config) {
$this->out("config[{$config['cat']}][{$config['k']}] = " . $config['v']);
}
}
return 0;
}
}

View file

@ -1,148 +1,148 @@
<?php
namespace Friendica\Core\Console;
/**
* Description of CreateDoxygen
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class CreateDoxygen extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console createdoxygen - Generate Doxygen headers
Usage
bin/console createdoxygen <file> [-h|--help|-?] [-v]
Description
Outputs the provided file with added Doxygen headers to functions
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$file = $this->getArgument(0);
if (!file_exists($file)) {
throw new \RuntimeException('Unable to find specified file.');
}
$data = file_get_contents($file);
$lines = explode("\n", $data);
$previous = "";
foreach ($lines AS $line) {
$line = rtrim(trim($line, "\r"));
if (strstr(strtolower($line), "function")) {
$detect = strtolower(trim($line));
$detect = implode(" ", explode(" ", $detect));
$found = false;
if (substr($detect, 0, 9) == "function ") {
$found = true;
}
if (substr($detect, 0, 19) == "protected function ") {
$found = true;
}
if (substr($detect, 0, 17) == "private function ") {
$found = true;
}
if (substr($detect, 0, 23) == "public static function ") {
$found = true;
}
if (substr($detect, 0, 24) == "private static function ") {
$found = true;
}
if (substr($detect, 0, 10) == "function (") {
$found = false;
}
if ($found && ( trim($previous) == "*/")) {
$found = false;
}
if ($found) {
$this->out($this->addDocumentation($line));
}
}
$this->out($line);
$previous = $line;
}
return 0;
}
/**
* @brief Adds a doxygen header
*
* @param string $line The current line of the document
*
* @return string added doxygen header
*/
private function addDocumentation($line)
{
$trimmed = ltrim($line);
$length = strlen($line) - strlen($trimmed);
$space = substr($line, 0, $length);
$block = $space . "/**\n" .
$space . " * @brief \n" .
$space . " *\n"; /**/
$left = strpos($line, "(");
$line = substr($line, $left + 1);
$right = strpos($line, ")");
$line = trim(substr($line, 0, $right));
if ($line != "") {
$parameters = explode(",", $line);
foreach ($parameters AS $parameter) {
$parameter = trim($parameter);
$splitted = explode("=", $parameter);
$block .= $space . " * @param " . trim($splitted[0], "& ") . "\n";
}
if (count($parameters) > 0) $block .= $space . " *\n";
}
$block .= $space . " * @return \n" .
$space . " */\n";
return $block;
}
}
<?php
namespace Friendica\Core\Console;
/**
* Description of CreateDoxygen
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class CreateDoxygen extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console createdoxygen - Generate Doxygen headers
Usage
bin/console createdoxygen <file> [-h|--help|-?] [-v]
Description
Outputs the provided file with added Doxygen headers to functions
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$file = $this->getArgument(0);
if (!file_exists($file)) {
throw new \RuntimeException('Unable to find specified file.');
}
$data = file_get_contents($file);
$lines = explode("\n", $data);
$previous = "";
foreach ($lines AS $line) {
$line = rtrim(trim($line, "\r"));
if (strstr(strtolower($line), "function")) {
$detect = strtolower(trim($line));
$detect = implode(" ", explode(" ", $detect));
$found = false;
if (substr($detect, 0, 9) == "function ") {
$found = true;
}
if (substr($detect, 0, 19) == "protected function ") {
$found = true;
}
if (substr($detect, 0, 17) == "private function ") {
$found = true;
}
if (substr($detect, 0, 23) == "public static function ") {
$found = true;
}
if (substr($detect, 0, 24) == "private static function ") {
$found = true;
}
if (substr($detect, 0, 10) == "function (") {
$found = false;
}
if ($found && ( trim($previous) == "*/")) {
$found = false;
}
if ($found) {
$this->out($this->addDocumentation($line));
}
}
$this->out($line);
$previous = $line;
}
return 0;
}
/**
* @brief Adds a doxygen header
*
* @param string $line The current line of the document
*
* @return string added doxygen header
*/
private function addDocumentation($line)
{
$trimmed = ltrim($line);
$length = strlen($line) - strlen($trimmed);
$space = substr($line, 0, $length);
$block = $space . "/**\n" .
$space . " * @brief \n" .
$space . " *\n"; /**/
$left = strpos($line, "(");
$line = substr($line, $left + 1);
$right = strpos($line, ")");
$line = trim(substr($line, 0, $right));
if ($line != "") {
$parameters = explode(",", $line);
foreach ($parameters AS $parameter) {
$parameter = trim($parameter);
$splitted = explode("=", $parameter);
$block .= $space . " * @param " . trim($splitted[0], "& ") . "\n";
}
if (count($parameters) > 0) $block .= $space . " *\n";
}
$block .= $space . " * @return \n" .
$space . " */\n";
return $block;
}
}

View file

@ -1,110 +1,110 @@
<?php
namespace Friendica\Core\Console;
use Friendica\Core;
use Friendica\Database\DBStructure;
require_once 'boot.php';
require_once 'include/dba.php';
/**
* @brief Does database updates from the command line
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class DatabaseStructure extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console dbstructure - Does database updates
Usage
bin/console dbstructure <command> [-h|--help|-?] [-v]
Commands
dryrun Show database update schema queries without running them
update Update database schema
dumpsql Dump database schema
toinnodb Convert all tables from MyISAM to InnoDB
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
Core\Config::load();
switch ($this->getArgument(0)) {
case "dryrun":
$output = DBStructure::update(true, false);
break;
case "update":
$output = DBStructure::update(true, true);
$build = Core\Config::get('system', 'build');
if (empty($build)) {
Core\Config::set('system', 'build', DB_UPDATE_VERSION);
$build = DB_UPDATE_VERSION;
}
$stored = intval($build);
$current = intval(DB_UPDATE_VERSION);
// run any left update_nnnn functions in update.php
for ($x = $stored; $x < $current; $x ++) {
$r = run_update_function($x);
if (!$r) {
break;
}
}
Core\Config::set('system', 'build', DB_UPDATE_VERSION);
break;
case "dumpsql":
ob_start();
DBStructure::printStructure();
$output = ob_get_clean();
break;
case "toinnodb":
ob_start();
DBStructure::convertToInnoDB();
$output = ob_get_clean();
break;
}
$this->out($output);
return 0;
}
}
<?php
namespace Friendica\Core\Console;
use Friendica\Core;
use Friendica\Database\DBStructure;
require_once 'boot.php';
require_once 'include/dba.php';
/**
* @brief Does database updates from the command line
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class DatabaseStructure extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console dbstructure - Does database updates
Usage
bin/console dbstructure <command> [-h|--help|-?] [-v]
Commands
dryrun Show database update schema queries without running them
update Update database schema
dumpsql Dump database schema
toinnodb Convert all tables from MyISAM to InnoDB
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
Core\Config::load();
switch ($this->getArgument(0)) {
case "dryrun":
$output = DBStructure::update(true, false);
break;
case "update":
$output = DBStructure::update(true, true);
$build = Core\Config::get('system', 'build');
if (empty($build)) {
Core\Config::set('system', 'build', DB_UPDATE_VERSION);
$build = DB_UPDATE_VERSION;
}
$stored = intval($build);
$current = intval(DB_UPDATE_VERSION);
// run any left update_nnnn functions in update.php
for ($x = $stored; $x < $current; $x ++) {
$r = run_update_function($x);
if (!$r) {
break;
}
}
Core\Config::set('system', 'build', DB_UPDATE_VERSION);
break;
case "dumpsql":
ob_start();
DBStructure::printStructure();
$output = ob_get_clean();
break;
case "toinnodb":
ob_start();
DBStructure::convertToInnoDB();
$output = ob_get_clean();
break;
}
$this->out($output);
return 0;
}
}

View file

@ -1,192 +1,192 @@
<?php
namespace Friendica\Core\Console;
/**
* When I installed docblox, I had the experience that it does not generate any output at all.
* This script may be used to find that kind of problems with the documentation build process.
* If docblox generates output, use another approach for debugging.
*
* Basically, docblox takes a list of files to build documentation from. This script assumes there is a file or set of files
* breaking the build when it is included in that list. It tries to calculate the smallest list containing these files.
* Unfortunatly, the original problem is NP-complete, so what the script does is a best guess only.
*
* So it starts with a list of all files in the project.
* If that list can't be build, it cuts it in two parts and tries both parts independently. If only one of them breaks,
* it takes that one and tries the same independently. If both break, it assumes this is the smallest set. This assumption
* is not necessarily true. Maybe the smallest set consists of two files and both of them were in different parts when
* the list was divided, but by now it is my best guess. To make this assumption better, the list is shuffled after every step.
*
* After that, the script tries to remove a file from the list. It tests if the list breaks and if so, it
* assumes that the file it removed belongs to the set of erroneous files.
* This is done for all files, so, in the end removing one file leads to a working doc build.
*
* @author Alexander Kampmann
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class DocBloxErrorChecker extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console docbloxerrorchecker - Checks the file tree for docblox errors
Usage
bin/console docbloxerrorchecker [-h|--help|-?] [-v]
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) > 0) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
if (!$this->commandExists('docblox')) {
throw new \RuntimeException('DocBlox isn\'t available.');
}
//return from util folder to frindica base dir
$dir = get_app()->get_basepath();
//stack for dirs to search
$dirstack = [];
//list of source files
$filelist = [];
//loop over all files in $dir
while ($dh = opendir($dir)) {
while ($file = readdir($dh)) {
if (is_dir($dir . "/" . $file)) {
//add to directory stack
if (strpos($file, '.') !== 0) {
array_push($dirstack, $dir . "/" . $file);
$this->out('dir ' . $dir . '/' . $file);
}
} else {
//test if it is a source file and add to filelist
if (substr($file, strlen($file) - 4) == ".php") {
array_push($filelist, $dir . "/" . $file);
$this->out($dir . '/' . $file);
}
}
}
//look at the next dir
$dir = array_pop($dirstack);
}
//check the entire set
if ($this->runs($filelist)) {
throw new \RuntimeException("I can not detect a problem.");
}
//check half of the set and discard if that half is okay
$res = $filelist;
$i = count($res);
do {
$this->out($i . '/' . count($filelist) . ' elements remaining.');
$res = $this->reduce($res, count($res) / 2);
shuffle($res);
$i = count($res);
} while (count($res) < $i);
//check one file after another
$needed = [];
while (count($res) != 0) {
$file = array_pop($res);
if ($this->runs(array_merge($res, $needed))) {
$this->out('needs: ' . $file . ' and file count ' . count($needed));
array_push($needed, $file);
}
}
$this->out('Smallest Set is: ' . $this->namesList($needed) . ' with ' . count($needed) . ' files. ');
return 0;
}
private function commandExists($command)
{
$prefix = strpos(strtolower(PHP_OS),'win') > -1 ? 'where' : 'which';
exec("{$prefix} {$command}", $output, $returnVal);
return $returnVal === 0;
}
/**
* This function generates a comma separated list of file names.
*
* @package util
*
* @param array $fileset Set of file names
*
* @return string comma-separated list of the file names
*/
private function namesList($fileset)
{
return implode(',', $fileset);
}
/**
* This functions runs phpdoc on the provided list of files
* @package util
*
* @param array $fileset Set of filenames
*
* @return bool true, if that set can be built
*/
private function runs($fileset)
{
$fsParam = $this->namesList($fileset);
$this->exec('docblox -t phpdoc_out -f ' . $fsParam);
if (file_exists("phpdoc_out/index.html")) {
$this->out('Subset ' . $fsParam . ' is okay.');
$this->exec('rm -r phpdoc_out');
return true;
} else {
$this->out('Subset ' . $fsParam . ' failed.');
return false;
}
}
/**
* This functions cuts down a fileset by removing files until it finally works.
* it was meant to be recursive, but php's maximum stack size is to small. So it just simulates recursion.
*
* In that version, it does not necessarily generate the smallest set, because it may not alter the elements order enough.
*
* @package util
*
* @param array $fileset set of filenames
* @param int $ps number of files in subsets
*
* @return array a part of $fileset, that crashes
*/
private function reduce($fileset, $ps)
{
//split array...
$parts = array_chunk($fileset, $ps);
//filter working subsets...
$parts = array_filter($parts, [$this, 'runs']);
//melt remaining parts together
if (is_array($parts)) {
return array_reduce($parts, "array_merge", []);
}
return [];
}
}
<?php
namespace Friendica\Core\Console;
/**
* When I installed docblox, I had the experience that it does not generate any output at all.
* This script may be used to find that kind of problems with the documentation build process.
* If docblox generates output, use another approach for debugging.
*
* Basically, docblox takes a list of files to build documentation from. This script assumes there is a file or set of files
* breaking the build when it is included in that list. It tries to calculate the smallest list containing these files.
* Unfortunatly, the original problem is NP-complete, so what the script does is a best guess only.
*
* So it starts with a list of all files in the project.
* If that list can't be build, it cuts it in two parts and tries both parts independently. If only one of them breaks,
* it takes that one and tries the same independently. If both break, it assumes this is the smallest set. This assumption
* is not necessarily true. Maybe the smallest set consists of two files and both of them were in different parts when
* the list was divided, but by now it is my best guess. To make this assumption better, the list is shuffled after every step.
*
* After that, the script tries to remove a file from the list. It tests if the list breaks and if so, it
* assumes that the file it removed belongs to the set of erroneous files.
* This is done for all files, so, in the end removing one file leads to a working doc build.
*
* @author Alexander Kampmann
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class DocBloxErrorChecker extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console docbloxerrorchecker - Checks the file tree for docblox errors
Usage
bin/console docbloxerrorchecker [-h|--help|-?] [-v]
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) > 0) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
if (!$this->commandExists('docblox')) {
throw new \RuntimeException('DocBlox isn\'t available.');
}
//return from util folder to frindica base dir
$dir = get_app()->get_basepath();
//stack for dirs to search
$dirstack = [];
//list of source files
$filelist = [];
//loop over all files in $dir
while ($dh = opendir($dir)) {
while ($file = readdir($dh)) {
if (is_dir($dir . "/" . $file)) {
//add to directory stack
if (strpos($file, '.') !== 0) {
array_push($dirstack, $dir . "/" . $file);
$this->out('dir ' . $dir . '/' . $file);
}
} else {
//test if it is a source file and add to filelist
if (substr($file, strlen($file) - 4) == ".php") {
array_push($filelist, $dir . "/" . $file);
$this->out($dir . '/' . $file);
}
}
}
//look at the next dir
$dir = array_pop($dirstack);
}
//check the entire set
if ($this->runs($filelist)) {
throw new \RuntimeException("I can not detect a problem.");
}
//check half of the set and discard if that half is okay
$res = $filelist;
$i = count($res);
do {
$this->out($i . '/' . count($filelist) . ' elements remaining.');
$res = $this->reduce($res, count($res) / 2);
shuffle($res);
$i = count($res);
} while (count($res) < $i);
//check one file after another
$needed = [];
while (count($res) != 0) {
$file = array_pop($res);
if ($this->runs(array_merge($res, $needed))) {
$this->out('needs: ' . $file . ' and file count ' . count($needed));
array_push($needed, $file);
}
}
$this->out('Smallest Set is: ' . $this->namesList($needed) . ' with ' . count($needed) . ' files. ');
return 0;
}
private function commandExists($command)
{
$prefix = strpos(strtolower(PHP_OS),'win') > -1 ? 'where' : 'which';
exec("{$prefix} {$command}", $output, $returnVal);
return $returnVal === 0;
}
/**
* This function generates a comma separated list of file names.
*
* @package util
*
* @param array $fileset Set of file names
*
* @return string comma-separated list of the file names
*/
private function namesList($fileset)
{
return implode(',', $fileset);
}
/**
* This functions runs phpdoc on the provided list of files
* @package util
*
* @param array $fileset Set of filenames
*
* @return bool true, if that set can be built
*/
private function runs($fileset)
{
$fsParam = $this->namesList($fileset);
$this->exec('docblox -t phpdoc_out -f ' . $fsParam);
if (file_exists("phpdoc_out/index.html")) {
$this->out('Subset ' . $fsParam . ' is okay.');
$this->exec('rm -r phpdoc_out');
return true;
} else {
$this->out('Subset ' . $fsParam . ' failed.');
return false;
}
}
/**
* This functions cuts down a fileset by removing files until it finally works.
* it was meant to be recursive, but php's maximum stack size is to small. So it just simulates recursion.
*
* In that version, it does not necessarily generate the smallest set, because it may not alter the elements order enough.
*
* @package util
*
* @param array $fileset set of filenames
* @param int $ps number of files in subsets
*
* @return array a part of $fileset, that crashes
*/
private function reduce($fileset, $ps)
{
//split array...
$parts = array_chunk($fileset, $ps);
//filter working subsets...
$parts = array_filter($parts, [$this, 'runs']);
//melt remaining parts together
if (is_array($parts)) {
return array_reduce($parts, "array_merge", []);
}
return [];
}
}

View file

@ -1,140 +1,140 @@
<?php
namespace Friendica\Core\Console;
/**
* Extracts translation strings from the Friendica project's files to be exported
* to Transifex for translation.
*
* Outputs a PHP file with language strings used by Friendica
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class Extract extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console extract - Generate translation string file for the Friendica project (deprecated)
Usage
bin/console extract [-h|--help|-?] [-v]
Description
This script was used to generate the translation string file to be exported to Transifex,
please use bin/run_xgettext.sh instead
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) > 0) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$s = '<?php' . PHP_EOL;
$s .= '
function string_plural_select($n){
return ($n != 1);
}
';
$arr = [];
$files = array_merge(
['index.php', 'boot.php'],
glob('mod/*'),
glob('include/*'),
glob('addon/*/*'),
$this->globRecursive('src')
);
foreach ($files as $file) {
$str = file_get_contents($file);
$pat = '|L10n::t\(([^\)]*+)[\)]|';
$patt = '|L10n::tt\(([^\)]*+)[\)]|';
$matches = [];
$matchestt = [];
preg_match_all($pat, $str, $matches);
preg_match_all($patt, $str, $matchestt);
if (count($matches) || count($matchestt)) {
$s .= '// ' . $file . PHP_EOL;
}
if (!empty($matches[1])) {
foreach ($matches[1] as $long_match) {
$match_arr = preg_split('/(?<=[\'"])\s*,/', $long_match);
$match = $match_arr[0];
if (!in_array($match, $arr)) {
if (substr($match, 0, 1) == '$') {
continue;
}
$arr[] = $match;
$s .= '$a->strings[' . $match . '] = ' . $match . ';' . "\n";
}
}
}
if (!empty($matchestt[1])) {
foreach ($matchestt[1] as $match) {
$matchtkns = preg_split("|[ \t\r\n]*,[ \t\r\n]*|", $match);
if (count($matchtkns) == 3 && !in_array($matchtkns[0], $arr)) {
if (substr($matchtkns[1], 0, 1) == '$') {
continue;
}
$arr[] = $matchtkns[0];
$s .= '$a->strings[' . $matchtkns[0] . "] = array(\n";
$s .= "\t0 => " . $matchtkns[0] . ",\n";
$s .= "\t1 => " . $matchtkns[1] . ",\n";
$s .= ");\n";
}
}
}
}
$s .= '// Timezones' . PHP_EOL;
$zones = timezone_identifiers_list();
foreach ($zones as $zone) {
$s .= '$a->strings[\'' . $zone . '\'] = \'' . $zone . '\';' . "\n";
}
$this->out($s);
return 0;
}
private function globRecursive($path) {
$dir_iterator = new \RecursiveDirectoryIterator($path);
$iterator = new \RecursiveIteratorIterator($dir_iterator, \RecursiveIteratorIterator::SELF_FIRST);
$return = [];
foreach ($iterator as $file) {
if ($file->getBasename() != '.' && $file->getBasename() != '..') {
$return[] = $file->getPathname();
}
}
return $return;
}
}
<?php
namespace Friendica\Core\Console;
/**
* Extracts translation strings from the Friendica project's files to be exported
* to Transifex for translation.
*
* Outputs a PHP file with language strings used by Friendica
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class Extract extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console extract - Generate translation string file for the Friendica project (deprecated)
Usage
bin/console extract [-h|--help|-?] [-v]
Description
This script was used to generate the translation string file to be exported to Transifex,
please use bin/run_xgettext.sh instead
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) > 0) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$s = '<?php' . PHP_EOL;
$s .= '
function string_plural_select($n){
return ($n != 1);
}
';
$arr = [];
$files = array_merge(
['index.php', 'boot.php'],
glob('mod/*'),
glob('include/*'),
glob('addon/*/*'),
$this->globRecursive('src')
);
foreach ($files as $file) {
$str = file_get_contents($file);
$pat = '|L10n::t\(([^\)]*+)[\)]|';
$patt = '|L10n::tt\(([^\)]*+)[\)]|';
$matches = [];
$matchestt = [];
preg_match_all($pat, $str, $matches);
preg_match_all($patt, $str, $matchestt);
if (count($matches) || count($matchestt)) {
$s .= '// ' . $file . PHP_EOL;
}
if (!empty($matches[1])) {
foreach ($matches[1] as $long_match) {
$match_arr = preg_split('/(?<=[\'"])\s*,/', $long_match);
$match = $match_arr[0];
if (!in_array($match, $arr)) {
if (substr($match, 0, 1) == '$') {
continue;
}
$arr[] = $match;
$s .= '$a->strings[' . $match . '] = ' . $match . ';' . "\n";
}
}
}
if (!empty($matchestt[1])) {
foreach ($matchestt[1] as $match) {
$matchtkns = preg_split("|[ \t\r\n]*,[ \t\r\n]*|", $match);
if (count($matchtkns) == 3 && !in_array($matchtkns[0], $arr)) {
if (substr($matchtkns[1], 0, 1) == '$') {
continue;
}
$arr[] = $matchtkns[0];
$s .= '$a->strings[' . $matchtkns[0] . "] = array(\n";
$s .= "\t0 => " . $matchtkns[0] . ",\n";
$s .= "\t1 => " . $matchtkns[1] . ",\n";
$s .= ");\n";
}
}
}
}
$s .= '// Timezones' . PHP_EOL;
$zones = timezone_identifiers_list();
foreach ($zones as $zone) {
$s .= '$a->strings[\'' . $zone . '\'] = \'' . $zone . '\';' . "\n";
}
$this->out($s);
return 0;
}
private function globRecursive($path) {
$dir_iterator = new \RecursiveDirectoryIterator($path);
$iterator = new \RecursiveIteratorIterator($dir_iterator, \RecursiveIteratorIterator::SELF_FIRST);
$return = [];
foreach ($iterator as $file) {
if ($file->getBasename() != '.' && $file->getBasename() != '..') {
$return[] = $file->getPathname();
}
}
return $return;
}
}

View file

@ -1,77 +1,77 @@
<?php
namespace Friendica\Core\Console;
use Friendica\Core\L10n;
use Friendica\Model\Contact;
/**
* @brief tool to block an account from the node
*
* With this tool, you can block an account in such a way, that no postings
* or comments this account writes are accepted to the node.
*
* License: AGPLv3 or later, same as Friendica
*
* @author Tobias Diekershoff <mrpetovan@gmail.com>
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class GlobalCommunityBlock extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console globalcommunityblock - Block remote profile from interacting with this node
Usage
bin/console globalcommunityblock <profile_url> [-h|--help|-?] [-v]
Description
Blocks an account in such a way that no postings or comments this account writes are accepted to this node.
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
$contact_id = Contact::getIdForURL($this->getArgument(0));
if (!$contact_id) {
throw new \RuntimeException(L10n::t('Could not find any contact entry for this URL (%s)', $nurl));
}
if(Contact::block($contact_id)) {
$this->out(L10n::t('The contact has been blocked from the node'));
} else {
throw new \RuntimeException('The contact block failed.');
}
return 0;
}
}
<?php
namespace Friendica\Core\Console;
use Friendica\Core\L10n;
use Friendica\Model\Contact;
/**
* @brief tool to block an account from the node
*
* With this tool, you can block an account in such a way, that no postings
* or comments this account writes are accepted to the node.
*
* License: AGPLv3 or later, same as Friendica
*
* @author Tobias Diekershoff <mrpetovan@gmail.com>
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class GlobalCommunityBlock extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console globalcommunityblock - Block remote profile from interacting with this node
Usage
bin/console globalcommunityblock <profile_url> [-h|--help|-?] [-v]
Description
Blocks an account in such a way that no postings or comments this account writes are accepted to this node.
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
$contact_id = Contact::getIdForURL($this->getArgument(0));
if (!$contact_id) {
throw new \RuntimeException(L10n::t('Could not find any contact entry for this URL (%s)', $nurl));
}
if(Contact::block($contact_id)) {
$this->out(L10n::t('The contact has been blocked from the node'));
} else {
throw new \RuntimeException('The contact block failed.');
}
return 0;
}
}

View file

@ -1,94 +1,94 @@
<?php
namespace Friendica\Core\Console;
use Friendica\Core\Protocol;
use Friendica\Database\DBM;
use Friendica\Network\Probe;
require_once 'include/text.php';
/**
* @brief tool to silence accounts on the global community page
*
* With this tool, you can silence an account on the global community page.
* Postings from silenced accounts will not be displayed on the community
* page. This silencing does only affect the display on the community page,
* accounts following the silenced accounts will still get their postings.
*
* License: AGPLv3 or later, same as Friendica
*
* @author Tobias Diekershoff
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class GlobalCommunitySilence extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console globalcommunitysilence - Silence remote profile from global community page
Usage
bin/console globalcommunitysilence <profile_url> [-h|--help|-?] [-v]
Description
With this tool, you can silence an account on the global community page.
Postings from silenced accounts will not be displayed on the community page.
This silencing does only affect the display on the community page, accounts
following the silenced accounts will still get their postings.
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
/**
* 1. make nurl from last parameter
* 2. check DB (contact) if there is a contact with uid=0 and that nurl, get the ID
* 3. set the flag hidden=1 for the contact entry with the found ID
* */
$net = Probe::uri($this->getArgument(0));
if (in_array($net['network'], [Protocol::PHANTOM, Protocol::MAIL])) {
throw new \RuntimeException('This account seems not to exist.');
}
$nurl = normalise_link($net['url']);
$contact = \dba::selectFirst("contact", ["id"], ["nurl" => $nurl, "uid" => 0]);
if (DBM::is_result($contact)) {
\dba::update("contact", ["hidden" => true], ["id" => $contact["id"]]);
$this->out('NOTICE: The account should be silenced from the global community page');
} else {
throw new \RuntimeException('NOTICE: Could not find any entry for this URL (' . $nurl . ')');
}
return 0;
}
}
<?php
namespace Friendica\Core\Console;
use Friendica\Core\Protocol;
use Friendica\Database\DBM;
use Friendica\Network\Probe;
require_once 'include/text.php';
/**
* @brief tool to silence accounts on the global community page
*
* With this tool, you can silence an account on the global community page.
* Postings from silenced accounts will not be displayed on the community
* page. This silencing does only affect the display on the community page,
* accounts following the silenced accounts will still get their postings.
*
* License: AGPLv3 or later, same as Friendica
*
* @author Tobias Diekershoff
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class GlobalCommunitySilence extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console globalcommunitysilence - Silence remote profile from global community page
Usage
bin/console globalcommunitysilence <profile_url> [-h|--help|-?] [-v]
Description
With this tool, you can silence an account on the global community page.
Postings from silenced accounts will not be displayed on the community page.
This silencing does only affect the display on the community page, accounts
following the silenced accounts will still get their postings.
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
/**
* 1. make nurl from last parameter
* 2. check DB (contact) if there is a contact with uid=0 and that nurl, get the ID
* 3. set the flag hidden=1 for the contact entry with the found ID
* */
$net = Probe::uri($this->getArgument(0));
if (in_array($net['network'], [Protocol::PHANTOM, Protocol::MAIL])) {
throw new \RuntimeException('This account seems not to exist.');
}
$nurl = normalise_link($net['url']);
$contact = \dba::selectFirst("contact", ["id"], ["nurl" => $nurl, "uid" => 0]);
if (DBM::is_result($contact)) {
\dba::update("contact", ["hidden" => true], ["id" => $contact["id"]]);
$this->out('NOTICE: The account should be silenced from the global community page');
} else {
throw new \RuntimeException('NOTICE: Could not find any entry for this URL (' . $nurl . ')');
}
return 0;
}
}

View file

@ -1,105 +1,105 @@
<?php
namespace Friendica\Core\Console;
use Friendica\Core;
require_once 'boot.php';
require_once 'include/dba.php';
/**
* @brief Sets maintenance mode for this node
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class Maintenance extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console maintenance - Sets maintenance mode for this node
Usage
bin/console maintenance <enable> [<reason>] [-h|--help|-?] [-v]
Description
<enable> cen be either 0 or 1 to disabled or enable the maintenance mode on this node.
<reason> is a quote-enclosed string with the optional reason for the maintenance mode.
Examples
bin/console maintenance 1
Enables the maintenance mode without setting a reason message
bin/console maintenance 1 "SSL certification update"
Enables the maintenance mode with setting a reason message
bin/console maintenance 0
Disables the maintenance mode
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 2) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
Core\Config::load();
$lang = Core\L10n::getBrowserLanguage();
Core\L10n::loadTranslationTable($lang);
$enabled = intval($this->getArgument(0));
Core\Config::set('system', 'maintenance', $enabled);
$reason = $this->getArgument(1);
if ($enabled && $this->getArgument(1)) {
Core\Config::set('system', 'maintenance_reason', $this->getArgument(1));
} else {
Core\Config::set('system', 'maintenance_reason', '');
}
if ($enabled) {
$mode_str = "maintenance mode";
} else {
$mode_str = "normal mode";
}
$this->out('System set in ' . $mode_str);
if ($enabled && $reason != '') {
$this->out('Maintenance reason: ' . $reason);
}
return 0;
}
}
<?php
namespace Friendica\Core\Console;
use Friendica\Core;
require_once 'boot.php';
require_once 'include/dba.php';
/**
* @brief Sets maintenance mode for this node
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class Maintenance extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console maintenance - Sets maintenance mode for this node
Usage
bin/console maintenance <enable> [<reason>] [-h|--help|-?] [-v]
Description
<enable> cen be either 0 or 1 to disabled or enable the maintenance mode on this node.
<reason> is a quote-enclosed string with the optional reason for the maintenance mode.
Examples
bin/console maintenance 1
Enables the maintenance mode without setting a reason message
bin/console maintenance 1 "SSL certification update"
Enables the maintenance mode with setting a reason message
bin/console maintenance 0
Disables the maintenance mode
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 2) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
require_once '.htconfig.php';
$result = \dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
if (!$result) {
throw new \RuntimeException('Unable to connect to database');
}
Core\Config::load();
$lang = Core\L10n::getBrowserLanguage();
Core\L10n::loadTranslationTable($lang);
$enabled = intval($this->getArgument(0));
Core\Config::set('system', 'maintenance', $enabled);
$reason = $this->getArgument(1);
if ($enabled && $this->getArgument(1)) {
Core\Config::set('system', 'maintenance_reason', $this->getArgument(1));
} else {
Core\Config::set('system', 'maintenance_reason', '');
}
if ($enabled) {
$mode_str = "maintenance mode";
} else {
$mode_str = "normal mode";
}
$this->out('System set in ' . $mode_str);
if ($enabled && $reason != '') {
$this->out('Maintenance reason: ' . $reason);
}
return 0;
}
}

View file

@ -1,234 +1,234 @@
<?php
namespace Friendica\Core\Console;
/**
* Read a strings.php file and create messages.po in the same directory
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class PhpToPo extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
private $normBaseMsgIds = [];
const NORM_REGEXP = "|[\\\]|";
protected function getHelp()
{
$help = <<<HELP
console php2po - Generate a messages.po file from a strings.php file
Usage
bin/console php2po [-p <n>] [--base <file>] <path/to/strings.php> [-h|--help|-?] [-v]
Description
Read a strings.php file and create the according messages.po in the same directory
Options
-p <n> Number of plural forms. Default: 2
--base <file> Path to base messages.po file. Default: util/messages.po
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$a = get_app();
$phpfile = realpath($this->getArgument(0));
if (!file_exists($phpfile)) {
throw new \RuntimeException('Supplied file path doesn\'t exist.');
}
if (!is_writable(dirname($phpfile))) {
throw new \RuntimeException('Supplied directory isn\'t writable.');
}
$pofile = dirname($phpfile) . DIRECTORY_SEPARATOR . 'messages.po';
// start !
include_once($phpfile);
$out = '';
$out .= "# FRIENDICA Distributed Social Network\n";
$out .= "# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project\n";
$out .= "# This file is distributed under the same license as the Friendica package.\n";
$out .= "# \n";
$out .= 'msgid ""' . "\n";
$out .= 'msgstr ""' . "\n";
$out .= '"Project-Id-Version: friendica\n"' . "\n";
$out .= '"Report-Msgid-Bugs-To: \n"' . "\n";
$out .= '"POT-Creation-Date: ' . date("Y-m-d H:i:sO") . '\n"' . "\n";
$out .= '"MIME-Version: 1.0\n"' . "\n";
$out .= '"Content-Type: text/plain; charset=UTF-8\n"' . "\n";
$out .= '"Content-Transfer-Encoding: 8bit\n"' . "\n";
// search for plural info
$lang = "";
$lang_logic = "";
$lang_pnum = $this->getOption('p', 2);
$infile = file($phpfile);
foreach ($infile as $l) {
$l = trim($l);
if ($this->startsWith($l, 'function string_plural_select_')) {
$lang = str_replace('function string_plural_select_', '', str_replace('($n){', '', $l));
}
if ($this->startsWith($l, 'return')) {
$lang_logic = str_replace('$', '', trim(str_replace('return ', '', $l), ';'));
break;
}
}
$this->out('Language: ' . $lang);
$this->out('Plural forms: ' . $lang_pnum);
$this->out('Plural forms: ' . $lang_logic);
$out .= sprintf('"Language: %s\n"', $lang) . "\n";
$out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) . "\n";
$out .= "\n";
$base_path = $this->getOption('base', 'util' . DIRECTORY_SEPARATOR . 'messages.po');
// load base messages.po and extract msgids
$base_msgids = [];
$base_f = file($base_path);
if (!$base_f) {
throw new \RuntimeException('The base ' . $base_path . ' file is missing or unavailable to read.');
}
$this->out('Loading base file ' . $base_path . '...');
$_f = 0;
$_mid = "";
$_mids = [];
foreach ($base_f as $l) {
$l = trim($l);
if ($this->startsWith($l, 'msgstr')) {
if ($_mid != '""') {
$base_msgids[$_mid] = $_mids;
$this->normBaseMsgIds[preg_replace(self::NORM_REGEXP, "", $_mid)] = $_mid;
}
$_f = 0;
$_mid = "";
$_mids = [];
}
if ($this->startsWith($l, '"') && $_f == 2) {
$_mids[count($_mids) - 1] .= "\n" . $l;
}
if ($this->startsWith($l, 'msgid_plural ')) {
$_f = 2;
$_mids[] = str_replace('msgid_plural ', '', $l);
}
if ($this->startsWith($l, '"') && $_f == 1) {
$_mid .= "\n" . $l;
$_mids[count($_mids) - 1] .= "\n" . $l;
}
if ($this->startsWith($l, 'msgid ')) {
$_f = 1;
$_mid = str_replace('msgid ', '', $l);
$_mids = [$_mid];
}
}
$this->out('Creating ' . $pofile . '...');
// create msgid and msgstr
$warnings = "";
foreach ($a->strings as $key => $str) {
$msgid = $this->massageString($key);
if (preg_match("|%[sd0-9](\$[sn])*|", $msgid)) {
$out .= "#, php-format\n";
}
$msgid = $this->findOriginalMsgId($msgid);
$out .= 'msgid ' . $msgid . "\n";
if (is_array($str)) {
if (array_key_exists($msgid, $base_msgids) && isset($base_msgids[$msgid][1])) {
$out .= 'msgid_plural ' . $base_msgids[$msgid][1] . "\n";
} else {
$out .= 'msgid_plural ' . $msgid . "\n";
$warnings .= "[W] No source plural form for msgid:\n" . str_replace("\n", "\n\t", $msgid) . "\n\n";
}
foreach ($str as $n => $msgstr) {
$out .= 'msgstr[' . $n . '] ' . $this->massageString($msgstr) . "\n";
}
} else {
$out .= 'msgstr ' . $this->massageString($str) . "\n";
}
$out .= "\n";
}
if (!file_put_contents($pofile, $out)) {
throw new \RuntimeException('Unable to write to ' . $pofile);
}
if ($warnings != '') {
$this->out($warnings);
}
return 0;
}
private function startsWith($haystack, $needle)
{
// search backwards starting from haystack length characters from the end
return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
}
/**
* Get a string and retun a message.po ready text
* - replace " with \"
* - replace tab char with \t
* - manage multiline strings
*/
private function massageString($str)
{
$str = str_replace('\\', '\\\\', $str);
$str = str_replace('"', '\"', $str);
$str = str_replace("\t", '\t', $str);
$str = str_replace("\n", '\n"' . "\n" . '"', $str);
if (strpos($str, "\n") !== false && $str[0] !== '"') {
$str = '"' . "\n" . $str;
}
$str = preg_replace("|\n([^\"])|", "\n\"$1", $str);
return sprintf('"%s"', $str);
}
private function findOriginalMsgId($str)
{
$norm_str = preg_replace(self::NORM_REGEXP, "", $str);
if (array_key_exists($norm_str, $this->normBaseMsgIds)) {
return $this->normBaseMsgIds[$norm_str];
}
return $str;
}
}
<?php
namespace Friendica\Core\Console;
/**
* Read a strings.php file and create messages.po in the same directory
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class PhpToPo extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
private $normBaseMsgIds = [];
const NORM_REGEXP = "|[\\\]|";
protected function getHelp()
{
$help = <<<HELP
console php2po - Generate a messages.po file from a strings.php file
Usage
bin/console php2po [-p <n>] [--base <file>] <path/to/strings.php> [-h|--help|-?] [-v]
Description
Read a strings.php file and create the according messages.po in the same directory
Options
-p <n> Number of plural forms. Default: 2
--base <file> Path to base messages.po file. Default: util/messages.po
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$a = get_app();
$phpfile = realpath($this->getArgument(0));
if (!file_exists($phpfile)) {
throw new \RuntimeException('Supplied file path doesn\'t exist.');
}
if (!is_writable(dirname($phpfile))) {
throw new \RuntimeException('Supplied directory isn\'t writable.');
}
$pofile = dirname($phpfile) . DIRECTORY_SEPARATOR . 'messages.po';
// start !
include_once($phpfile);
$out = '';
$out .= "# FRIENDICA Distributed Social Network\n";
$out .= "# Copyright (C) 2010, 2011, 2012, 2013 the Friendica Project\n";
$out .= "# This file is distributed under the same license as the Friendica package.\n";
$out .= "# \n";
$out .= 'msgid ""' . "\n";
$out .= 'msgstr ""' . "\n";
$out .= '"Project-Id-Version: friendica\n"' . "\n";
$out .= '"Report-Msgid-Bugs-To: \n"' . "\n";
$out .= '"POT-Creation-Date: ' . date("Y-m-d H:i:sO") . '\n"' . "\n";
$out .= '"MIME-Version: 1.0\n"' . "\n";
$out .= '"Content-Type: text/plain; charset=UTF-8\n"' . "\n";
$out .= '"Content-Transfer-Encoding: 8bit\n"' . "\n";
// search for plural info
$lang = "";
$lang_logic = "";
$lang_pnum = $this->getOption('p', 2);
$infile = file($phpfile);
foreach ($infile as $l) {
$l = trim($l);
if ($this->startsWith($l, 'function string_plural_select_')) {
$lang = str_replace('function string_plural_select_', '', str_replace('($n){', '', $l));
}
if ($this->startsWith($l, 'return')) {
$lang_logic = str_replace('$', '', trim(str_replace('return ', '', $l), ';'));
break;
}
}
$this->out('Language: ' . $lang);
$this->out('Plural forms: ' . $lang_pnum);
$this->out('Plural forms: ' . $lang_logic);
$out .= sprintf('"Language: %s\n"', $lang) . "\n";
$out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) . "\n";
$out .= "\n";
$base_path = $this->getOption('base', 'util' . DIRECTORY_SEPARATOR . 'messages.po');
// load base messages.po and extract msgids
$base_msgids = [];
$base_f = file($base_path);
if (!$base_f) {
throw new \RuntimeException('The base ' . $base_path . ' file is missing or unavailable to read.');
}
$this->out('Loading base file ' . $base_path . '...');
$_f = 0;
$_mid = "";
$_mids = [];
foreach ($base_f as $l) {
$l = trim($l);
if ($this->startsWith($l, 'msgstr')) {
if ($_mid != '""') {
$base_msgids[$_mid] = $_mids;
$this->normBaseMsgIds[preg_replace(self::NORM_REGEXP, "", $_mid)] = $_mid;
}
$_f = 0;
$_mid = "";
$_mids = [];
}
if ($this->startsWith($l, '"') && $_f == 2) {
$_mids[count($_mids) - 1] .= "\n" . $l;
}
if ($this->startsWith($l, 'msgid_plural ')) {
$_f = 2;
$_mids[] = str_replace('msgid_plural ', '', $l);
}
if ($this->startsWith($l, '"') && $_f == 1) {
$_mid .= "\n" . $l;
$_mids[count($_mids) - 1] .= "\n" . $l;
}
if ($this->startsWith($l, 'msgid ')) {
$_f = 1;
$_mid = str_replace('msgid ', '', $l);
$_mids = [$_mid];
}
}
$this->out('Creating ' . $pofile . '...');
// create msgid and msgstr
$warnings = "";
foreach ($a->strings as $key => $str) {
$msgid = $this->massageString($key);
if (preg_match("|%[sd0-9](\$[sn])*|", $msgid)) {
$out .= "#, php-format\n";
}
$msgid = $this->findOriginalMsgId($msgid);
$out .= 'msgid ' . $msgid . "\n";
if (is_array($str)) {
if (array_key_exists($msgid, $base_msgids) && isset($base_msgids[$msgid][1])) {
$out .= 'msgid_plural ' . $base_msgids[$msgid][1] . "\n";
} else {
$out .= 'msgid_plural ' . $msgid . "\n";
$warnings .= "[W] No source plural form for msgid:\n" . str_replace("\n", "\n\t", $msgid) . "\n\n";
}
foreach ($str as $n => $msgstr) {
$out .= 'msgstr[' . $n . '] ' . $this->massageString($msgstr) . "\n";
}
} else {
$out .= 'msgstr ' . $this->massageString($str) . "\n";
}
$out .= "\n";
}
if (!file_put_contents($pofile, $out)) {
throw new \RuntimeException('Unable to write to ' . $pofile);
}
if ($warnings != '') {
$this->out($warnings);
}
return 0;
}
private function startsWith($haystack, $needle)
{
// search backwards starting from haystack length characters from the end
return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
}
/**
* Get a string and retun a message.po ready text
* - replace " with \"
* - replace tab char with \t
* - manage multiline strings
*/
private function massageString($str)
{
$str = str_replace('\\', '\\\\', $str);
$str = str_replace('"', '\"', $str);
$str = str_replace("\t", '\t', $str);
$str = str_replace("\n", '\n"' . "\n" . '"', $str);
if (strpos($str, "\n") !== false && $str[0] !== '"') {
$str = '"' . "\n" . $str;
}
$str = preg_replace("|\n([^\"])|", "\n\"$1", $str);
return sprintf('"%s"', $str);
}
private function findOriginalMsgId($str)
{
$norm_str = preg_replace(self::NORM_REGEXP, "", $str);
if (array_key_exists($norm_str, $this->normBaseMsgIds)) {
return $this->normBaseMsgIds[$norm_str];
}
return $str;
}
}

View file

@ -1,197 +1,197 @@
<?php
namespace Friendica\Core\Console;
/**
* Read a messages.po file and create strings.php in the same directory
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class PoToPhp extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
const DQ_ESCAPE = "__DQ__";
protected function getHelp()
{
$help = <<<HELP
console php2po - Generate a strings.php file from a messages.po file
Usage
bin/console php2po <path/to/messages.po> [-h|--help|-?] [-v]
Description
Read a messages.po file and create the according strings.php in the same directory
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$a = get_app();
$pofile = realpath($this->getArgument(0));
if (!file_exists($pofile)) {
throw new \RuntimeException('Supplied file path doesn\'t exist.');
}
if (!is_writable(dirname($pofile))) {
throw new \RuntimeException('Supplied directory isn\'t writable.');
}
$outfile = dirname($pofile) . DIRECTORY_SEPARATOR . 'strings.php';
if (strstr($outfile, 'util')) {
$lang = 'en';
} else {
$lang = str_replace('-', '_', basename(dirname($pofile)));
}
$this->out('Out to ' . $outfile);
$out = "<?php\n\n";
$infile = file($pofile);
$k = '';
$v = '';
$arr = false;
$ink = false;
$inv = false;
$escape_s_exp = '|[^\\\\]\$[a-z]|';
foreach ($infile as $l) {
$l = str_replace('\"', self::DQ_ESCAPE, $l);
$len = strlen($l);
if ($l[0] == "#") {
$l = "";
}
if (substr($l, 0, 15) == '"Plural-Forms: ') {
$match = [];
preg_match("|nplurals=([0-9]*); *plural=(.*)[;\\\\]|", $l, $match);
$cond = str_replace('n', '$n', $match[2]);
// define plural select function if not already defined
$fnname = 'string_plural_select_' . $lang;
$out .= 'if(! function_exists("' . $fnname . '")) {' . "\n";
$out .= 'function ' . $fnname . '($n){' . "\n";
$out .= ' return ' . $cond . ';' . "\n";
$out .= '}}' . "\n";
}
if ($k != "" && substr($l, 0, 7) == 'msgstr ') {
if ($ink) {
$ink = false;
$out .= '$a->strings["' . $k . '"] = ';
}
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
$v = substr($l, 8, $len - 11);
$v = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $v);
$inv = true;
}
if ($k != "" && substr($l, 0, 7) == 'msgstr[') {
if ($ink) {
$ink = false;
$out .= '$a->strings["' . $k . '"] = ';
}
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
if (!$arr) {
$arr = True;
$out .= "[\n";
}
$match = [];
preg_match("|\[([0-9]*)\] (.*)|", $l, $match);
$out .= "\t"
. preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $match[1])
. ' => '
. preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $match[2])
. ",\n";
}
if (substr($l, 0, 6) == 'msgid_') {
$ink = false;
$out .= '$a->strings["' . $k . '"] = ';
}
if ($ink) {
$k .= trim($l, "\"\r\n");
$k = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $k);
}
if (substr($l, 0, 6) == 'msgid ') {
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
if ($k != "") {
$out .= ($arr) ? "];\n" : ";\n";
}
$arr = false;
$k = str_replace("msgid ", "", $l);
if ($k != '""') {
$k = trim($k, "\"\r\n");
} else {
$k = '';
}
$k = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $k);
$ink = true;
}
if ($inv && substr($l, 0, 6) != "msgstr") {
$v .= trim($l, "\"\r\n");
$v = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $v);
}
}
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
if ($k != '') {
$out .= ($arr ? "];\n" : ";\n");
}
$out = str_replace(self::DQ_ESCAPE, '\"', $out);
if (!file_put_contents($outfile, $out)) {
throw new \RuntimeException('Unable to write to ' . $outfile);
}
return 0;
}
private function escapeDollar($match)
{
return str_replace('$', '\$', $match[0]);
}
}
<?php
namespace Friendica\Core\Console;
/**
* Read a messages.po file and create strings.php in the same directory
*
* @author Hypolite Petovan <mrpetovan@gmail.com>
*/
class PoToPhp extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
const DQ_ESCAPE = "__DQ__";
protected function getHelp()
{
$help = <<<HELP
console php2po - Generate a strings.php file from a messages.po file
Usage
bin/console php2po <path/to/messages.po> [-h|--help|-?] [-v]
Description
Read a messages.po file and create the according strings.php in the same directory
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
if (count($this->args) > 1) {
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
$a = get_app();
$pofile = realpath($this->getArgument(0));
if (!file_exists($pofile)) {
throw new \RuntimeException('Supplied file path doesn\'t exist.');
}
if (!is_writable(dirname($pofile))) {
throw new \RuntimeException('Supplied directory isn\'t writable.');
}
$outfile = dirname($pofile) . DIRECTORY_SEPARATOR . 'strings.php';
if (strstr($outfile, 'util')) {
$lang = 'en';
} else {
$lang = str_replace('-', '_', basename(dirname($pofile)));
}
$this->out('Out to ' . $outfile);
$out = "<?php\n\n";
$infile = file($pofile);
$k = '';
$v = '';
$arr = false;
$ink = false;
$inv = false;
$escape_s_exp = '|[^\\\\]\$[a-z]|';
foreach ($infile as $l) {
$l = str_replace('\"', self::DQ_ESCAPE, $l);
$len = strlen($l);
if ($l[0] == "#") {
$l = "";
}
if (substr($l, 0, 15) == '"Plural-Forms: ') {
$match = [];
preg_match("|nplurals=([0-9]*); *plural=(.*)[;\\\\]|", $l, $match);
$cond = str_replace('n', '$n', $match[2]);
// define plural select function if not already defined
$fnname = 'string_plural_select_' . $lang;
$out .= 'if(! function_exists("' . $fnname . '")) {' . "\n";
$out .= 'function ' . $fnname . '($n){' . "\n";
$out .= ' return ' . $cond . ';' . "\n";
$out .= '}}' . "\n";
}
if ($k != "" && substr($l, 0, 7) == 'msgstr ') {
if ($ink) {
$ink = false;
$out .= '$a->strings["' . $k . '"] = ';
}
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
$v = substr($l, 8, $len - 11);
$v = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $v);
$inv = true;
}
if ($k != "" && substr($l, 0, 7) == 'msgstr[') {
if ($ink) {
$ink = false;
$out .= '$a->strings["' . $k . '"] = ';
}
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
if (!$arr) {
$arr = True;
$out .= "[\n";
}
$match = [];
preg_match("|\[([0-9]*)\] (.*)|", $l, $match);
$out .= "\t"
. preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $match[1])
. ' => '
. preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $match[2])
. ",\n";
}
if (substr($l, 0, 6) == 'msgid_') {
$ink = false;
$out .= '$a->strings["' . $k . '"] = ';
}
if ($ink) {
$k .= trim($l, "\"\r\n");
$k = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $k);
}
if (substr($l, 0, 6) == 'msgid ') {
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
if ($k != "") {
$out .= ($arr) ? "];\n" : ";\n";
}
$arr = false;
$k = str_replace("msgid ", "", $l);
if ($k != '""') {
$k = trim($k, "\"\r\n");
} else {
$k = '';
}
$k = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $k);
$ink = true;
}
if ($inv && substr($l, 0, 6) != "msgstr") {
$v .= trim($l, "\"\r\n");
$v = preg_replace_callback($escape_s_exp, [$this, 'escapeDollar'], $v);
}
}
if ($inv) {
$inv = false;
$out .= '"' . $v . '"';
}
if ($k != '') {
$out .= ($arr ? "];\n" : ";\n");
}
$out = str_replace(self::DQ_ESCAPE, '\"', $out);
if (!file_put_contents($outfile, $out)) {
throw new \RuntimeException('Unable to write to ' . $outfile);
}
return 0;
}
private function escapeDollar($match)
{
return str_replace('$', '\$', $match[0]);
}
}

View file

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