From fc689e05bc12b3957b491aae917273ff0c592641 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 05:10:35 -0400 Subject: [PATCH 01/27] [Composer] Add asika/simple-console --- composer.json | 1 + composer.lock | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e064a0a6a..3f3151e5e 100644 --- a/composer.json +++ b/composer.json @@ -24,6 +24,7 @@ "pear/Text_LanguageDetect": "1.*", "pear/Text_Highlighter": "dev-master", "smarty/smarty": "^3.1", + "asika/simple-console": "^1.0", "fxp/composer-asset-plugin": "~1.3", "bower-asset/base64": "^1.0", "bower-asset/Chart-js": "^2.7", diff --git a/composer.lock b/composer.lock index 1bf931ce3..8dd857fac 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,41 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "3ff4187b4f7167583a3b8caa5f7c2a8a", + "content-hash": "6a87e56bade65fa14f5f74e74109b66f", "packages": [ + { + "name": "asika/simple-console", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/asika32764/php-simple-console.git", + "reference": "0b624c1a999849dc6481a47182e58d593bf65068" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/asika32764/php-simple-console/zipball/0b624c1a999849dc6481a47182e58d593bf65068", + "reference": "0b624c1a999849dc6481a47182e58d593bf65068", + "shasum": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Asika\\SimpleConsole\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Simon Asika", + "email": "asika32764@gmail.com" + } + ], + "description": "One file console framework to help you write build scripts.", + "time": "2018-03-08T12:05:40+00:00" + }, { "name": "bower-asset/Chart-js", "version": "v2.7.1", From 9b8fb1d550e3902d3b69e7a3477c4a22a5fe0386 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 05:11:15 -0400 Subject: [PATCH 02/27] Add Console classes --- src/Core/Console.php | 111 +++++++++++++ src/Core/Console/Config.php | 131 +++++++++++++++ src/Core/Console/CreateDoxygen.php | 148 +++++++++++++++++ src/Core/Console/DocBloxErrorChecker.php | 192 ++++++++++++++++++++++ src/Core/Console/GlobalCommunityBlock.php | 70 ++++++++ 5 files changed, 652 insertions(+) create mode 100644 src/Core/Console.php create mode 100644 src/Core/Console/Config.php create mode 100644 src/Core/Console/CreateDoxygen.php create mode 100644 src/Core/Console/DocBloxErrorChecker.php create mode 100644 src/Core/Console/GlobalCommunityBlock.php diff --git a/src/Core/Console.php b/src/Core/Console.php new file mode 100644 index 000000000..f9c37dde1 --- /dev/null +++ b/src/Core/Console.php @@ -0,0 +1,111 @@ + + */ +class Console extends \Asika\SimpleConsole\Console +{ + // Disables the default help handling + protected $helpOptions = []; + protected $customHelpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + + + $help = << [] [-v] + +Commands: + config Edit site config + createdoxygen Generate Doxygen headers + docbloxerrorchecker Checks the file tree for DocBlox errors + globalcommunityblock Silence remote profile from global community page + help Show help about a command, e.g (bin/console help config) + +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('Arguments: ' . var_export($this->args, true)); + $this->out('Options: ' . var_export($this->options, true)); + } + + $showHelp = false; + $subHelp = false; + $command = null; + + if ($this->getOption('version')) { + $this->out('Friendica Console version ' . FRIENDICA_VERSION); + + return 0; + } elseif ((count($this->options) === 0 || $this->getOption($this->customHelpOptions) === true || $this->getOption($this->customHelpOptions) === 1) && count($this->args) === 0 + ) { + $showHelp = true; + } elseif (count($this->args) >= 2 && $this->getArgument(0) == 'help') { + $command = $this->getArgument(1); + $subHelp = true; + array_shift($this->args); + array_shift($this->args); + } elseif (count($this->args) >= 1) { + $command = $this->getArgument(0); + array_shift($this->args); + } + + if (is_null($command)) { + $this->out($this->getHelp()); + return 0; + } + + $console = $this->getSubConsole($command); + + if ($subHelp) { + $console->setOption($this->customHelpOptions, true); + } + + return $console->execute(); + } + + private function getSubConsole($command) + { + if ($this->getOption('v')) { + $this->out('Command: ' . $command); + } + + $subargs = $this->args; + array_unshift($subargs, $this->executable); + + $subconsole = null; + + switch ($command) { + case 'config' : $subconsole = new Console\Config($subargs); + break; + case 'createdoxygen' : $subconsole = new Console\CreateDoxygen($subargs); + break; + case 'docbloxerrorchecker' : $subconsole = new Console\DocBloxErrorChecker($subargs); + break; + case 'globalcommunityblock': $subconsole = new Console\GlobalCommunityBlock($subargs); + break; + default: + throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); + } + + foreach ($this->options as $name => $value) { + $subconsole->setOption($name, $value); + } + + return $subconsole; + } + +} diff --git a/src/Core/Console/Config.php b/src/Core/Console/Config.php new file mode 100644 index 000000000..3b77d5400 --- /dev/null +++ b/src/Core/Console/Config.php @@ -0,0 +1,131 @@ + + */ +class Config extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-h|--help|-?] [-v] + bin/console config [-h|--help|-?] [-v] + bin/console config [-h|--help|-?] [-v] + +Description + bin/console config + Lists all config values + + bin/console config + Lists all config values in the provided category + + bin/console config + Shows the value of the provided key in the category + + bin/console config + Set the value of the provided key in the category + +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; + } + +} diff --git a/src/Core/Console/CreateDoxygen.php b/src/Core/Console/CreateDoxygen.php new file mode 100644 index 000000000..17da9922e --- /dev/null +++ b/src/Core/Console/CreateDoxygen.php @@ -0,0 +1,148 @@ + + */ +class CreateDoxygen extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-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; + } + +} diff --git a/src/Core/Console/DocBloxErrorChecker.php b/src/Core/Console/DocBloxErrorChecker.php new file mode 100644 index 000000000..2a9aa024f --- /dev/null +++ b/src/Core/Console/DocBloxErrorChecker.php @@ -0,0 +1,192 @@ + + */ +class DocBloxErrorChecker extends \Asika\SimpleConsole\Console +{ + + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = <<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 = 0); + 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 []; + } + +} diff --git a/src/Core/Console/GlobalCommunityBlock.php b/src/Core/Console/GlobalCommunityBlock.php new file mode 100644 index 000000000..569bd7816 --- /dev/null +++ b/src/Core/Console/GlobalCommunityBlock.php @@ -0,0 +1,70 @@ + + */ +class GlobalCommunityBlock extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-h|--help|-?] [-v] + +Description + bin/console globalcommunityblock + Silences the provided remote profile URL from the global community page + +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($argv[1]); + if (!$contact_id) { + throw new \RuntimeException(L10n::t('Could not find any contact entry for this URL (%s)', $nurl)); + } + Contact::block($contact_id); + $this->out(L10n::t('The contact has been blocked from the node')); + + return 0; + } + +} From dcf2ed26bb19f908f5b9268f938e70d9396d6ccf Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 05:12:39 -0400 Subject: [PATCH 03/27] Add console executables --- bin/console | 10 ++++++++++ bin/console.bat | 4 ++++ bin/console.php | 9 +++++++++ 3 files changed, 23 insertions(+) create mode 100644 bin/console create mode 100644 bin/console.bat create mode 100644 bin/console.php diff --git a/bin/console b/bin/console new file mode 100644 index 000000000..bd0ea97a3 --- /dev/null +++ b/bin/console @@ -0,0 +1,10 @@ +#!/bin/sh + +dir=$(cd "${0%[/\\]*}" > /dev/null; pwd) + +if [[ -d /proc/cygdrive && $(which php) == $(readlink -n /proc/cygdrive)/* ]]; then + # We are in Cgywin using Windows php, so the path must be translated + dir=$(cygpath -m "$dir"); +fi + +php "${dir}/console.php" "$@" diff --git a/bin/console.bat b/bin/console.bat new file mode 100644 index 000000000..06c41a03e --- /dev/null +++ b/bin/console.bat @@ -0,0 +1,4 @@ +@echo OFF +:: in case DelayedExpansion is on and a path contains ! +setlocal DISABLEDELAYEDEXPANSION +php "%~dp0console.php" %* diff --git a/bin/console.php b/bin/console.php new file mode 100644 index 000000000..9ce327f9a --- /dev/null +++ b/bin/console.php @@ -0,0 +1,9 @@ +#!/bin/env php +execute(); From 881c7ccfc11aab542f42d5c6a555722aa5eb5c75 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 05:15:14 -0400 Subject: [PATCH 04/27] Add meaningful return value to dba::connect - Move System::unavailable call to index --- include/dba.php | 12 ++---------- index.php | 6 +++++- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/include/dba.php b/include/dba.php index af571f245..586fc092f 100644 --- a/include/dba.php +++ b/include/dba.php @@ -13,7 +13,7 @@ use Friendica\Util\DateTimeFormat; */ class dba { - public static $connected = true; + public static $connected = false; private static $_server_info = ''; private static $db; @@ -48,8 +48,6 @@ class dba { $db = trim($db); if (!(strlen($server) && strlen($user))) { - self::$connected = false; - self::$db = null; return false; } @@ -57,8 +55,6 @@ class dba { if (strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) { if (! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) { self::$error = L10n::t('Cannot locate DNS info for database server \'%s\'', $server); - self::$connected = false; - self::$db = null; return false; } } @@ -79,7 +75,6 @@ class dba { self::$db = @new PDO($connect, $user, $pass); self::$connected = true; } catch (PDOException $e) { - self::$connected = false; } } @@ -98,13 +93,10 @@ class dba { // No suitable SQL driver was found. if (!self::$connected) { self::$db = null; - if (!$install) { - System::unavailable(); - } } $a->save_timestamp($stamp1, "network"); - return true; + return self::$connected; } /** diff --git a/index.php b/index.php index fba16263a..a76057101 100644 --- a/index.php +++ b/index.php @@ -51,9 +51,13 @@ if (!$install) { require_once "include/dba.php"; if (!$install) { - dba::connect($db_host, $db_user, $db_pass, $db_data, $install); + $result = dba::connect($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); + if (!$result) { + System::unavailable(); + } + /** * Load configs from db. Overwrite configs from .htconfig.php */ From bba12da167ee376752f531dfad2a6177962d557c Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 13:25:47 -0400 Subject: [PATCH 05/27] Improve Console\GlobalCommunityBlock - Add description comment block - Fix usage description - Actually use argument --- src/Core/Console/GlobalCommunityBlock.php | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Core/Console/GlobalCommunityBlock.php b/src/Core/Console/GlobalCommunityBlock.php index 569bd7816..1516a8325 100644 --- a/src/Core/Console/GlobalCommunityBlock.php +++ b/src/Core/Console/GlobalCommunityBlock.php @@ -6,8 +6,14 @@ use Friendica\Core\L10n; use Friendica\Model\Contact; /** - * Description of GlobalCommunityBlock + * @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 * @author Hypolite Petovan */ class GlobalCommunityBlock extends \Asika\SimpleConsole\Console @@ -17,13 +23,12 @@ class GlobalCommunityBlock extends \Asika\SimpleConsole\Console protected function getHelp() { $help = << [-h|--help|-?] [-v] Description - bin/console globalcommunityblock - Silences the provided remote profile URL from the global community page + 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 @@ -57,14 +62,16 @@ HELP; throw new \RuntimeException('Unable to connect to database'); } - $contact_id = Contact::getIdForURL($argv[1]); + $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)); } - Contact::block($contact_id); - $this->out(L10n::t('The contact has been blocked from the node')); + 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; } - } From 52e07a9e6d4274634ea6a2923ae5380106663ab1 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 13:26:14 -0400 Subject: [PATCH 06/27] Remove wrong by reference variable init in Console\DocBloxErrorChecker --- src/Core/Console/DocBloxErrorChecker.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Console/DocBloxErrorChecker.php b/src/Core/Console/DocBloxErrorChecker.php index 2a9aa024f..922a5ed05 100644 --- a/src/Core/Console/DocBloxErrorChecker.php +++ b/src/Core/Console/DocBloxErrorChecker.php @@ -123,7 +123,7 @@ HELP; private function commandExists($command) { $prefix = strpos(strtolower(PHP_OS),'win') > -1 ? 'where' : 'which'; - exec("{$prefix} {$command}", $output = [], $returnVal = 0); + exec("{$prefix} {$command}", $output, $returnVal); return $returnVal === 0; } From da6635898c26d35597d1aed1e5951ae7f4efa261 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 13:26:36 -0400 Subject: [PATCH 07/27] Add more sub consoles --- src/Core/Console.php | 8 + src/Core/Console/Extract.php | 140 ++++++++++++ src/Core/Console/GlobalCommunitySilence.php | 94 ++++++++ src/Core/Console/Maintenance.php | 121 ++++++++++ src/Core/Console/PhpToPo.php | 241 ++++++++++++++++++++ 5 files changed, 604 insertions(+) create mode 100644 src/Core/Console/Extract.php create mode 100644 src/Core/Console/GlobalCommunitySilence.php create mode 100644 src/Core/Console/Maintenance.php create mode 100644 src/Core/Console/PhpToPo.php diff --git a/src/Core/Console.php b/src/Core/Console.php index f9c37dde1..39e2941a3 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -95,8 +95,16 @@ HELP; break; case 'docbloxerrorchecker' : $subconsole = new Console\DocBloxErrorChecker($subargs); break; + case 'extract' : $subconsole = new Console\Extract($subargs); + break; case 'globalcommunityblock': $subconsole = new Console\GlobalCommunityBlock($subargs); break; + case 'globalcommunitysilence': $subconsole = new Console\GlobalCommunitySilence($subargs); + break; + case 'maintenance': $subconsole = new Console\Maintenance($subargs); + break; + case 'php2po': $subconsole = new Console\PhpToPo($subargs); + break; default: throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); } diff --git a/src/Core/Console/Extract.php b/src/Core/Console/Extract.php new file mode 100644 index 000000000..e6cab0654 --- /dev/null +++ b/src/Core/Console/Extract.php @@ -0,0 +1,140 @@ + + */ +class Extract extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = <<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 = '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; + } +} diff --git a/src/Core/Console/GlobalCommunitySilence.php b/src/Core/Console/GlobalCommunitySilence.php new file mode 100644 index 000000000..069750afc --- /dev/null +++ b/src/Core/Console/GlobalCommunitySilence.php @@ -0,0 +1,94 @@ + + */ +class GlobalCommunitySilence extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-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; + } +} diff --git a/src/Core/Console/Maintenance.php b/src/Core/Console/Maintenance.php new file mode 100644 index 000000000..f9a4f9d2d --- /dev/null +++ b/src/Core/Console/Maintenance.php @@ -0,0 +1,121 @@ + util/global_community_silence.php http://example.com/profile/bob + * + * will silence bob@example.com so that his postings won't appear at + * the global community page. + * + * License: AGPLv3 or later, same as Friendica + * + * @author Tobias Diekershoff + * @author Hypolite Petovan + */ +class Maintenance extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [] [-h|--help|-?] [-v] + +Description + cen be either 0 or 1 to disabled or enable the maintenance mode on this node. + + 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; + } + +} diff --git a/src/Core/Console/PhpToPo.php b/src/Core/Console/PhpToPo.php new file mode 100644 index 000000000..e26ea8892 --- /dev/null +++ b/src/Core/Console/PhpToPo.php @@ -0,0 +1,241 @@ + + */ +class PhpToPo extends \Asika\SimpleConsole\Console +{ + + protected $helpOptions = ['h', 'help', '?']; + + private $normBaseMsgIds = []; + const NORM_REGEXP = "|[\\\]|"; + + protected function getHelp() + { + $help = <<] [-h|--help|-?] [-v] + +Options: + -p Number of plural forms/ Default: 2 + +Description + Read a strings.php file and create the according messages.po 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(); + + $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) . '/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 = 2; + + $_idx = array_search('-p', $argv); + if ($_idx !== false) { + $lang_pnum = $argv[$_idx + 1]; + } + + $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"; + + $this->out('Loading base message.po...'); + + // load base messages.po and extract msgids + $base_msgids = []; + $base_f = file("util/messages.po"); + if (!$base_f) { + throw new \RuntimeException('The base util/messages.po file is missing.'); + } + + $_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('Done.'); + $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"; + } + + file_put_contents($pofile, $out); + + $this->out('Done.'); + + if ($warnings == "") { + $this->out('No warnings.'); + } else { + $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; + } + +} From 0b542d0654668299b8894f6a346161f8f13659a1 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 13:26:51 -0400 Subject: [PATCH 08/27] Fix hashbang line in bin/console --- bin/console.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/console.php b/bin/console.php index 9ce327f9a..90e4be392 100644 --- a/bin/console.php +++ b/bin/console.php @@ -1,4 +1,4 @@ -#!/bin/env php +#!/usr/bin/env php Date: Sun, 18 Mar 2018 19:07:24 -0400 Subject: [PATCH 09/27] Improve Console\PhpToPo - Add base option - Use DIRECTORY_SEPARATOR - Add error handling - Remove superfluous display --- src/Core/Console/PhpToPo.php | 41 +++++++++++++++--------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/src/Core/Console/PhpToPo.php b/src/Core/Console/PhpToPo.php index e26ea8892..105e6ea35 100644 --- a/src/Core/Console/PhpToPo.php +++ b/src/Core/Console/PhpToPo.php @@ -18,19 +18,18 @@ class PhpToPo extends \Asika\SimpleConsole\Console protected function getHelp() { $help = <<] [-h|--help|-?] [-v] - -Options: - -p Number of plural forms/ Default: 2 + bin/console php2po [-p ] [--base ] [-h|--help|-?] [-v] Description Read a strings.php file and create the according messages.po in the same directory Options - -h|--help|-? Show help information - -v Show more debug information. + -p Number of plural forms. Default: 2 + --base Path to base messages.po file. Default: util/messages.po + -h|--help|-? Show help information + -v Show more debug information. HELP; return $help; } @@ -64,7 +63,7 @@ HELP; throw new \RuntimeException('Supplied directory isn\'t writable.'); } - $pofile = dirname($phpfile) . '/messages.po'; + $pofile = dirname($phpfile) . DIRECTORY_SEPARATOR . 'messages.po'; // start ! include_once($phpfile); @@ -86,12 +85,7 @@ HELP; // search for plural info $lang = ""; $lang_logic = ""; - $lang_pnum = 2; - - $_idx = array_search('-p', $argv); - if ($_idx !== false) { - $lang_pnum = $argv[$_idx + 1]; - } + $lang_pnum = $this->getOption('p', 2); $infile = file($phpfile); foreach ($infile as $l) { @@ -113,15 +107,17 @@ HELP; $out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) . "\n"; $out .= "\n"; - $this->out('Loading base message.po...'); + $base_path = $this->getOption('base', 'util' . DIRECTORY_SEPARATOR . 'messages.po'); // load base messages.po and extract msgids $base_msgids = []; - $base_f = file("util/messages.po"); + $base_f = file($base_path); if (!$base_f) { - throw new \RuntimeException('The base util/messages.po file is missing.'); + 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 = []; @@ -158,7 +154,6 @@ HELP; } } - $this->out('Done.'); $this->out('Creating ' . $pofile . '...'); // create msgid and msgstr @@ -189,13 +184,11 @@ HELP; $out .= "\n"; } - file_put_contents($pofile, $out); + if (!file_put_contents($pofile, $out)) { + throw new \RuntimeException('Unable to write to ' . $pofile); + } - $this->out('Done.'); - - if ($warnings == "") { - $this->out('No warnings.'); - } else { + if ($warnings != '') { $this->out($warnings); } From 608b477b77b831a62b320b6abb3f5b8abc0f99b1 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 19:07:40 -0400 Subject: [PATCH 10/27] Add new commands to base console help text --- src/Core/Console.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Core/Console.php b/src/Core/Console.php index 39e2941a3..d315c10a2 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -21,11 +21,15 @@ class Console extends \Asika\SimpleConsole\Console Usage: bin/console [--version] [-h|--help|-?] [] [-v] Commands: - config Edit site config - createdoxygen Generate Doxygen headers - docbloxerrorchecker Checks the file tree for DocBlox errors - globalcommunityblock Silence remote profile from global community page - help Show help about a command, e.g (bin/console help config) + config Edit site config + createdoxygen Generate Doxygen headers + docbloxerrorchecker Check the file tree for DocBlox errors + extract Generate translation string file for the Friendica project (deprecated) + globalcommunityblock Block remote profile from interacting with this node + globalcommunitysilence Silence remote profile from global community page + help Show help about a command, e.g (bin/console help config) + maintenance Set maintenance mode for this node + php2po Generate a messages.po file from a strings.php file Options: -h|--help|-? Show help information From 9a012ad3030b0e3a26a0ac83ad55a1fe3598799d Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 19:26:43 -0400 Subject: [PATCH 11/27] Add po2php console --- src/Core/Console.php | 3 + src/Core/Console/PoToPhp.php | 197 +++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 src/Core/Console/PoToPhp.php diff --git a/src/Core/Console.php b/src/Core/Console.php index d315c10a2..ebaa33f95 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -30,6 +30,7 @@ Commands: help Show help about a command, e.g (bin/console help config) maintenance Set maintenance mode for this node php2po Generate a messages.po file from a strings.php file + po2php Generate a strings.php file from a messages.po file Options: -h|--help|-? Show help information @@ -109,6 +110,8 @@ HELP; break; case 'php2po': $subconsole = new Console\PhpToPo($subargs); break; + case 'po2php': $subconsole = new Console\PoToPhp($subargs); + break; default: throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); } diff --git a/src/Core/Console/PoToPhp.php b/src/Core/Console/PoToPhp.php new file mode 100644 index 000000000..3a58d9fed --- /dev/null +++ b/src/Core/Console/PoToPhp.php @@ -0,0 +1,197 @@ + + */ +class PoToPhp extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + const DQ_ESCAPE = "__DQ__"; + + protected function getHelp() + { + $help = << [-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 = "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]); + } +} From 620e9842e109530ec2cc88218ddc2f73e1bbad0c Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 19:45:35 -0400 Subject: [PATCH 12/27] Add Typo Console --- src/Core/Console.php | 2 + src/Core/Console/Typo.php | 119 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 src/Core/Console/Typo.php diff --git a/src/Core/Console.php b/src/Core/Console.php index ebaa33f95..6f4ec64a0 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -112,6 +112,8 @@ HELP; break; case 'po2php': $subconsole = new Console\PoToPhp($subargs); break; + case 'typo': $subconsole = new Console\Typo($subargs); + break; default: throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); } diff --git a/src/Core/Console/Typo.php b/src/Core/Console/Typo.php new file mode 100644 index 000000000..4213fc832 --- /dev/null +++ b/src/Core/Console/Typo.php @@ -0,0 +1,119 @@ + + */ +class Typo extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = <<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.'); + } + } +} From c5c60d3d050ce2630197027a4b4375c00e270d95 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 19:51:22 -0400 Subject: [PATCH 13/27] Make bin/console executable --- bin/console | 0 bin/console.bat | 0 bin/console.php | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/console mode change 100644 => 100755 bin/console.bat mode change 100644 => 100755 bin/console.php diff --git a/bin/console b/bin/console old mode 100644 new mode 100755 diff --git a/bin/console.bat b/bin/console.bat old mode 100644 new mode 100755 diff --git a/bin/console.php b/bin/console.php old mode 100644 new mode 100755 From 02c9fd6c2452382253e8da4a40fa4a839c69f9d7 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 19:52:00 -0400 Subject: [PATCH 14/27] Add typo to main console help --- src/Core/Console.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Core/Console.php b/src/Core/Console.php index 6f4ec64a0..620149937 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -31,6 +31,7 @@ Commands: maintenance Set maintenance mode for this node php2po Generate a messages.po file from a strings.php file po2php Generate a strings.php file from a messages.po file + typo Checks for parse errors in Friendica files Options: -h|--help|-? Show help information From 2f1a1debf44b430d3e86e584580e70625af7c335 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:10:56 -0400 Subject: [PATCH 15/27] Add DBStructure Console - Refactor subConsole instantiation --- src/Core/Console.php | 48 +++++------ src/Core/Console/DatabaseStructure.php | 110 +++++++++++++++++++++++++ 2 files changed, 131 insertions(+), 27 deletions(-) create mode 100644 src/Core/Console/DatabaseStructure.php diff --git a/src/Core/Console.php b/src/Core/Console.php index 620149937..63aca9301 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -13,16 +13,29 @@ class Console extends \Asika\SimpleConsole\Console protected $helpOptions = []; protected $customHelpOptions = ['h', 'help', '?']; + protected $subConsoles = [ + 'config' => __NAMESPACE__ . '\Console\Config', + 'createdoxygen' => __NAMESPACE__ . '\Console\CreateDoxygen', + 'docbloxerrorchecker' => __NAMESPACE__ . '\Console\DocBloxErrorChecker', + 'dbstructure' => __NAMESPACE__ . '\Console\DatabaseStructure', + 'extract' => __NAMESPACE__ . '\Console\Extract', + 'globalcommunityblock' => __NAMESPACE__ . '\Console\GlobalCommunityBlock', + 'globalcommunitysilence' => __NAMESPACE__ . '\Console\GlobalCommunitySilence', + 'maintenance' => __NAMESPACE__ . '\Console\Maintenance', + 'php2po' => __NAMESPACE__ . '\Console\PhpToPo', + 'po2php' => __NAMESPACE__ . '\Console\PoToPhp', + 'typo' => __NAMESPACE__ . '\Console\Typo', + ]; + protected function getHelp() { - - $help = << [] [-v] Commands: config Edit site config createdoxygen Generate Doxygen headers + dbstructure Do database updates docbloxerrorchecker Check the file tree for DocBlox errors extract Generate translation string file for the Friendica project (deprecated) globalcommunityblock Block remote profile from interacting with this node @@ -89,35 +102,16 @@ HELP; $this->out('Command: ' . $command); } + if (!isset($this->subConsoles[$command])) { + throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); + } + $subargs = $this->args; array_unshift($subargs, $this->executable); - $subconsole = null; + $className = $this->subConsoles[$command]; - switch ($command) { - case 'config' : $subconsole = new Console\Config($subargs); - break; - case 'createdoxygen' : $subconsole = new Console\CreateDoxygen($subargs); - break; - case 'docbloxerrorchecker' : $subconsole = new Console\DocBloxErrorChecker($subargs); - break; - case 'extract' : $subconsole = new Console\Extract($subargs); - break; - case 'globalcommunityblock': $subconsole = new Console\GlobalCommunityBlock($subargs); - break; - case 'globalcommunitysilence': $subconsole = new Console\GlobalCommunitySilence($subargs); - break; - case 'maintenance': $subconsole = new Console\Maintenance($subargs); - break; - case 'php2po': $subconsole = new Console\PhpToPo($subargs); - break; - case 'po2php': $subconsole = new Console\PoToPhp($subargs); - break; - case 'typo': $subconsole = new Console\Typo($subargs); - break; - default: - throw new \Asika\SimpleConsole\CommandArgsException('Command ' . $command . ' doesn\'t exist'); - } + $subconsole = new $className($subargs); foreach ($this->options as $name => $value) { $subconsole->setOption($name, $value); diff --git a/src/Core/Console/DatabaseStructure.php b/src/Core/Console/DatabaseStructure.php new file mode 100644 index 000000000..709b9724e --- /dev/null +++ b/src/Core/Console/DatabaseStructure.php @@ -0,0 +1,110 @@ + + */ +class DatabaseStructure extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + protected function getHelp() + { + $help = << [-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; + } + +} From 3b75ea00280643f2eefc43a68f9cbf4e12ba60c0 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:36:24 -0400 Subject: [PATCH 16/27] Remove util/config* - Update Console\Config help text --- src/Core/Console/Config.php | 6 +++- util/config | 65 ------------------------------------- util/config.md | 26 --------------- 3 files changed, 5 insertions(+), 92 deletions(-) delete mode 100755 util/config delete mode 100644 util/config.md diff --git a/src/Core/Console/Config.php b/src/Core/Console/Config.php index 3b77d5400..a199fb3af 100644 --- a/src/Core/Console/Config.php +++ b/src/Core/Console/Config.php @@ -64,7 +64,11 @@ Description Shows the value of the provided key in the category bin/console config - Set the value of the provided key in the category + 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 diff --git a/util/config b/util/config deleted file mode 100755 index 7774fb602..000000000 --- a/util/config +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env php - 3) { - Config::set($argv[1],$argv[2],$argv[3]); - echo "config[{$argv[1]}][{$argv[2]}] = " . Config::get($argv[1],$argv[2]) . "\n"; -} - -if($argc == 3) { - echo "config[{$argv[1]}][{$argv[2]}] = " . Config::get($argv[1],$argv[2]) . "\n"; -} - -if($argc == 2) { - Config::load($argv[1]); - if (!is_null($a->config[$argv[1]])) { - foreach($a->config[$argv[1]] as $k => $x) { - echo "config[{$argv[1]}][{$k}] = " . $x . "\n"; - } - } else { - echo "config section '$argv[1]' returned nothing.\n"; - } -} - -if($argc == 1) { - $r = q("select * from config where 1"); - if($r) { - foreach($r as $rr) { - echo "config[{$rr['cat']}][{$rr['k']}] = " . $rr['v'] . "\n"; - } - } -} - diff --git a/util/config.md b/util/config.md deleted file mode 100644 index 3b834fe01..000000000 --- a/util/config.md +++ /dev/null @@ -1,26 +0,0 @@ -CLI config utility -================== - -Usage: - - -config - displays all config entries - - -config family - displays all config entries for family (system, database, etc) - - -config family key - displays single config entry for specified family and key - -config family key value - set config entry for specified family and key to value and display result - - - -Notes: - Setting config entries which are manually set in .htconfig.php may result in -conflict between database settings and the manual startup settings. - From db013ce6ee7d30da3870d548187172cab0a79537 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:37:22 -0400 Subject: [PATCH 17/27] Remove util/createdoxygen --- util/createdoxygen.php | 93 ------------------------------------------ 1 file changed, 93 deletions(-) delete mode 100755 util/createdoxygen.php diff --git a/util/createdoxygen.php b/util/createdoxygen.php deleted file mode 100755 index 798c81474..000000000 --- a/util/createdoxygen.php +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/php - 0) - $block .= $space." *\n"; - } - - $block .= $space." * @return \n". - $space." */\n"; - - return $block; -} From 11e6b6358b6ff7c0de19b23d41b19a7cf481c757 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:37:45 -0400 Subject: [PATCH 18/27] Remove util/docblox_errorchecker --- util/docblox_errorchecker.php | 145 ---------------------------------- 1 file changed, 145 deletions(-) delete mode 100644 util/docblox_errorchecker.php diff --git a/util/docblox_errorchecker.php b/util/docblox_errorchecker.php deleted file mode 100644 index a67be69ce..000000000 --- a/util/docblox_errorchecker.php +++ /dev/null @@ -1,145 +0,0 @@ - Date: Sun, 18 Mar 2018 23:39:26 -0400 Subject: [PATCH 19/27] Remove util/global_community_block --- util/global_community_block.php | 55 --------------------------------- 1 file changed, 55 deletions(-) delete mode 100755 util/global_community_block.php diff --git a/util/global_community_block.php b/util/global_community_block.php deleted file mode 100755 index 02f0c53ec..000000000 --- a/util/global_community_block.php +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env php - util/global_community_block.php http://example.com/profile/bob - * - * will block bob@example.com. - * - * Author: Tobias Diekershoff - * - * License: AGPLv3 or later, same as Friendica - */ -if ($argc != 2 || $argv[1] == "-h" || $argv[1] == "--help" || $argv[1] == "-?") { - echo "Usage: " . $argv[0] . " [-h|profile_url]\r\n"; - echo " -h, -?, --help ... show this help\r\n"; - echo " profile_url ...... The URL of the profile you want to silence\r\n"; - echo "\r\n"; - echo "Example: block bob@example.com\r\n"; - echo "$> " . $argv[0] . " https://example.com/profiles/bob\r\n"; - echo "\r\n"; - exit(0); -} - -use Friendica\BaseObject; -use Friendica\Core\L10n; -use Friendica\Model\Contact; - -require_once 'boot.php'; -require_once 'include/dba.php'; -require_once 'include/text.php'; - -$a = get_app(); -BaseObject::setApp($a); - -require_once '.htconfig.php'; -dba::connect($db_host, $db_user, $db_pass, $db_data); -unset($db_host, $db_user, $db_pass, $db_data); - -$contact_id = Contact::getIdForURL($argv[1]); -if (!$contact_id) { - echo L10n::t('Could not find any contact entry for this URL (%s)', $nurl); - echo "\r\n"; - exit(1); -} -Contact::block($contact_id); -echo L10n::t('The contact has been blocked from the node'); -echo "\r\n"; -exit(0); From d83491ae59b183d89d722bfdcf27142907463cf6 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:40:06 -0400 Subject: [PATCH 20/27] Remove util/global_community_silence - Update wrong comment block for Console\Maintenance --- src/Core/Console/Maintenance.php | 18 +------- util/global_community_silence.php | 68 ------------------------------- 2 files changed, 1 insertion(+), 85 deletions(-) delete mode 100755 util/global_community_silence.php diff --git a/src/Core/Console/Maintenance.php b/src/Core/Console/Maintenance.php index f9a4f9d2d..19067940d 100644 --- a/src/Core/Console/Maintenance.php +++ b/src/Core/Console/Maintenance.php @@ -8,24 +8,8 @@ require_once 'boot.php'; require_once 'include/dba.php'; /** - * @brief tool to silence accounts on the global community page + * @brief Sets maintenance mode for this node * - * 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. - * - * Usage: pass the URL of the profile to be silenced account as only parameter - * at the command line when running this tool. E.g. - * - * $> util/global_community_silence.php http://example.com/profile/bob - * - * will silence bob@example.com so that his postings won't appear at - * the global community page. - * - * License: AGPLv3 or later, same as Friendica - * - * @author Tobias Diekershoff * @author Hypolite Petovan */ class Maintenance extends \Asika\SimpleConsole\Console diff --git a/util/global_community_silence.php b/util/global_community_silence.php deleted file mode 100755 index 2eb76a47f..000000000 --- a/util/global_community_silence.php +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env php - util/global_community_silence.php http://example.com/profile/bob - * - * will silence bob@example.com so that his postings won't appear at - * the global community page. - * - * Author: Tobias Diekershoff - * - * License: AGPLv3 or later, same as Friendica - **/ - -if ($argc != 2 || $argv[1] == "-h" || $argv[1] == "--help" || $argv[1] == "-?") { - echo "Usage: ".$argv[0]." [-h|profile_url]\r\n"; - echo " -h, -?, --help ... show this help\r\n"; - echo " profile_url ...... The URL of the profile you want to silence\r\n"; - echo "\r\n"; - echo "Example: Silence bob@example.com\r\n"; - echo "$> ".$argv[0]." https://example.com/profiles/bob\r\n"; - echo "\r\n"; - exit(0); -} - -use Friendica\Database\DBM; -use Friendica\Network\Probe; - -require_once 'boot.php'; -require_once 'include/dba.php'; -require_once 'include/text.php'; -$a = get_app(); -require_once '.htconfig.php'; - -dba::connect($db_host, $db_user, $db_pass, $db_data); -unset($db_host, $db_user, $db_pass, $db_data); - -/** - * 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($argv[1]); -if (in_array($net['network'], [NETWORK_PHANTOM, NETWORK_MAIL])) { - echo "This account seems not to exist."; - echo "\r\n"; - exit(1); -} -$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"]]); - echo "NOTICE: The account should be silenced from the global community page\r\n"; -} else { - echo "NOTICE: Could not find any entry for this URL (".$nurl.")\r\n"; -} - -?> From f6fcda278166096b9bf1df41469defe8a721ece5 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:40:56 -0400 Subject: [PATCH 21/27] Remove util/maintenance --- util/maintenance.php | 70 -------------------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 util/maintenance.php diff --git a/util/maintenance.php b/util/maintenance.php deleted file mode 100644 index f0d777776..000000000 --- a/util/maintenance.php +++ /dev/null @@ -1,70 +0,0 @@ - 1) { - $maint_mode = intval($argv[1]); -} - -Config::set('system', 'maintenance', $maint_mode); - -if ($maint_mode && ($argc > 2)) { - $reason_arr = $argv; - array_shift($reason_arr); - array_shift($reason_arr); - - $reason = implode(' ', $reason_arr); - Config::set('system', 'maintenance_reason', $reason); -} else { - Config::set('system', 'maintenance_reason', ''); -} - -if ($maint_mode) { - $mode_str = "maintenance mode"; -} else { - $mode_str = "normal mode"; -} - -echo "\n\tSystem set in $mode_str\n"; - -if ($reason != '') { - echo "\tMaintenance reason: $reason\n\n"; -} else { - echo "\n"; -} - -echo "Usage:\n\n"; -echo "\tphp {$argv[0]} [1] [Maintenance reason|redirection url]\n"; -echo "\t\tSet the system in maintenance mode\n\n"; -echo "\t\tIf the optionally entered maintenance reason is an url\n"; -echo "\t\tthe visitor is redirected to that page.\n"; -echo "\n"; -echo "\t\tExamples:\n"; -echo "\t\t\tphp {$argv[0]} 1 System upgrade\n"; -echo "\t\t\tphp {$argv[0]} 1 http://domain.tld/downtime\n"; -echo "\n"; -echo "\tphp {$argv[0]} 0\n"; -echo "\t\tSet the system in normal mode\n\n"; From 2b2c676eca3b45a09fb24333dfe0eee77aa04559 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:44:27 -0400 Subject: [PATCH 22/27] Remove util/php2po - Updated util/README --- util/README | 10 +-- util/php2po.php | 204 ------------------------------------------------ 2 files changed, 2 insertions(+), 212 deletions(-) delete mode 100755 util/php2po.php diff --git a/util/README b/util/README index 83a49cd22..5808194ec 100644 --- a/util/README +++ b/util/README @@ -72,7 +72,7 @@ $a->string["%d message sent"] = Array( The function string_plural_select($n) defined in strings.php, return the string index to use, related to the numbers of item (value of $n). -This is modelled after ngettext function of GNU gettext. +This is modeled after ngettext function of GNU gettext. More info at http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html @@ -117,10 +117,4 @@ When strings are added or modified in source, you could run If you already translated Friendica using strings.php, you could import your old translation to messages.po. Run: -$ php util/php2po.php view/lang//strings.php - - -You may also use the util/string_translator.php web interface to translate the string file, but it is disabled for website security reasons. The web server will need write permission to your language directories and the "Deny ..." line in util/.htaccess will need to be modified or commented to use the utility. - - - +$ php bin/console php2po view/lang//strings.php diff --git a/util/php2po.php b/util/php2po.php deleted file mode 100755 index e28c91daf..000000000 --- a/util/php2po.php +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/env php - - * - * Output to - */ - -DEFINE("NORM_REGEXP", "|[\\\]|"); - -$a = new stdClass(); - -if ($argc<2 || in_array('-h', $argv) || in_array('--h', $argv)) { - print "Usage: ".$argv[0]." [-p ] \n\n"; - print "Options:\n"; - print "p\tNumber of plural forms. Default: 2\n"; - print "\n"; - return; -} - -$phpfile = $argv[1]; -$pofile = dirname($phpfile)."/messages.po"; - -if (!file_exists($phpfile)){ - print "Unable to find '$phpfile'\n"; - return; -} - -// utility functions -function startsWith($haystack, $needle) { - // search backwards starting from haystack length characters from the end - return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE; -} - - -// 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 = 2; - -$_idx = array_search('-p', $argv); -if ($_idx !== false) { - $lang_pnum = $argv[$_idx+1]; -} - -$infile = file($phpfile); -foreach($infile as $l) { - $l = trim($l); - if (startsWith($l, 'function string_plural_select_')) { - $lang = str_replace( 'function string_plural_select_' , '', str_replace( '($n){','', $l) ); - } - if (startsWith($l, 'return')) { - $lang_logic = str_replace( '$', '', trim( str_replace( 'return ' , '', $l) , ';') ); - break; - } -} - -echo "Language: $lang\n"; -echo "Plural forms: $lang_pnum\n"; -echo "Plural logic: $lang_logic;\n"; - -$out .= sprintf('"Language: %s\n"', $lang) ."\n"; -$out .= sprintf('"Plural-Forms: nplurals=%s; plural=%s;\n"', $lang_pnum, $lang_logic) ."\n"; -$out .= "\n"; - -print "\nLoading base message.po..."; - -// load base messages.po and extract msgids -$base_msgids = []; -$norm_base_msgids = []; -$base_f = file("util/messages.po"); -if (!$base_f) { - die("No base messages.po\n"); -} - -$_f = 0; -$_mid = ""; -$_mids = []; -foreach( $base_f as $l) { - $l = trim($l); - //~ print $l."\n"; - - if (startsWith($l, 'msgstr')) { - if ($_mid != '""') { - $base_msgids[$_mid] = $_mids; - $norm_base_msgids[preg_replace(NORM_REGEXP, "", $_mid)] = $_mid; - //~ print "\t\t\t".$_mid. print_r($base_msgids[$_mid], true); - } - - $_f = 0; - $_mid = ""; - $_mids = []; - - } - - if (startsWith($l, '"') && $_f==2) { - $_mids[count($_mids)-1] .= "\n".$l; - //~ print "\t\t+mids: ".print_t($_mids, true); - } - if (startsWith($l, 'msgid_plural ')) { - $_f = 2; - $_mids[] = str_replace('msgid_plural ', '' , $l); - //~ print "\t\t mids: ".print_r($_mids, true); - } - - if (startsWith($l, '"') && $_f==1) { - $_mid .= "\n".$l; - $_mids[count($_mids)-1] .= "\n".$l; - //~ print "\t+mid: $_mid \n"; - } - if (startsWith($l, 'msgid ')) { - $_f = 1; - $_mid = str_replace('msgid ', '' , $l); - $_mids = [$_mid]; - //~ print "\t mid: $_mid \n"; - } - //~ print "\t\t\t\t$_f\n\n"; -} - -print " done\n"; -print "Creating '$pofile'..."; -// create msgid and msgstr - -/** - * Get a string and retun a message.po ready text - * - replace " with \" - * - replace tab char with \t - * - manage multiline strings - */ -function massage_string($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); -} - -function find_original_msgid($str) { - global $norm_base_msgids; - $norm_str = preg_replace(NORM_REGEXP, "", $str); - if (array_key_exists($norm_str, $norm_base_msgids)) { - return $norm_base_msgids[$norm_str]; - } - return $str; -} - -$warnings = ""; -foreach($a->strings as $key=>$str) { - $msgid = massage_string($key); - - if (preg_match("|%[sd0-9](\$[sn])*|", $msgid)) { - $out .= "#, php-format\n"; - } - $msgid = find_original_msgid($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.'] '. massage_string($msgstr) . "\n"; - } - } else { - $out .= 'msgstr '. massage_string($str) . "\n"; - } - - $out .= "\n"; - -} - -file_put_contents($pofile, $out); - -print " done\n"; - -if ($warnings=="") { - print "No warnings.\n"; -} else { - print $warnings; -} From 2226ed2949d9e22672edbfa897be1aae1f33b549 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:47:38 -0400 Subject: [PATCH 23/27] Remove util/po2php - Updated documentation --- README.translate.md | 12 ++-- doc/translations.md | 12 ++-- util/README | 2 +- util/po2php.php | 151 -------------------------------------------- 4 files changed, 13 insertions(+), 164 deletions(-) delete mode 100755 util/po2php.php diff --git a/README.translate.md b/README.translate.md index 83c24e054..8396c9a19 100644 --- a/README.translate.md +++ b/README.translate.md @@ -27,17 +27,17 @@ The location of the translated files in the source tree is /view/lang/LNG-CODE/ where LNG-CODE is the language code used, e.g. de for German or fr for French. The translated strings come as a "message.po" file from transifex which needs to be translated into the PHP file friendica uses. -To do so, place the file in the directory mentioned above and use the "po2php" utility from the util directory of your friendica installation. +To do so, place the file in the directory mentioned above and use the "po2php" command from the console. Assuming you want to convert the German localization which is placed in view/lang/de/message.po you would do the following. 1. Navigate at the command prompt to the base directory of your friendica installation - 2. Execute the po2php script, which will place the translation + 2. Execute the po2php command, which will place the translation in the strings.php file that is used by friendica. - $> php util/po2php.php view/lang/de/messages.po + $> php bin/console po2php view/lang/de/messages.po The output of the script will be placed at view/lang/de/strings.php where friendica is expecting it, so you can test your translation immediately. @@ -62,7 +62,7 @@ Otherwise your work might get lost, when the translation from Transifex is inclu Utilities --------- -Additional to the po2php script there are some more utilities for translation in the "util" directory of the friendica source tree. +Additional to the po2php command there are some more utilities for translation in the console. If you only want to translate friendica into another language you wont need any of these tools most likely but it gives you an idea how the translation process of friendica works. For further information see the utils/README file. @@ -90,9 +90,9 @@ To update the translation files after you have translated strings of e.g. Espera $> tx pull -l eo -And then use the `po2php` utility described above to convert the `messages.po` file to the `strings.php` file Friendica is loading. +And then use the `po2php` command described above to convert the `messages.po` file to the `strings.php` file Friendica is loading. - $> php util/po2php.php view/lang/eo/messages.po + $> php bin/console po2php view/lang/eo/messages.po Afterwards, just commit the two changed files to a feature branch of your Friendica repository, push the changes to github and open a pull request for your changes. diff --git a/doc/translations.md b/doc/translations.md index d6b48d9ea..02c1a23ea 100644 --- a/doc/translations.md +++ b/doc/translations.md @@ -29,17 +29,17 @@ The location of the translated files in the source tree is /view/lang/LNG-CODE/ where LNG-CODE is the language code used, e.g. de for German or fr for French. The translated strings come as a "message.po" file from transifex which needs to be translated into the PHP file friendica uses. -To do so, place the file in the directory mentioned above and use the "po2php" utility from the util directory of your friendica installation. +To do so, place the file in the directory mentioned above and use the "po2php" command from the Friendica Console. Assuming you want to convert the German localization which is placed in view/lang/de/message.po you would do the following. 1. Navigate at the command prompt to the base directory of your friendica installation - 2. Execute the po2php script, which will place the translation + 2. Execute the po2php command, which will place the translation in the strings.php file that is used by friendica. - $> php util/po2php.php view/lang/de/messages.po + $> php bin/console po2php view/lang/de/messages.po The output of the script will be placed at view/lang/de/strings.php where friendica is expecting it, so you can test your translation immediately. @@ -64,7 +64,7 @@ Otherwise your work might get lost, when the translation from Transifex is inclu Utilities --------- -Additional to the po2php script there are some more utilities for translation in the "util" directory of the friendica source tree. +Additional to the po2php command there are some more utilities for translation in the console. If you only want to translate friendica into another language you wont need any of these tools most likely but it gives you an idea how the translation process of friendica works. For further information see the utils/README file. @@ -92,9 +92,9 @@ To update the translation files after you have translated strings of e.g. Espera $> tx pull -l eo -And then use the `po2php` utility described above to convert the `messages.po` file to the `strings.php` file Friendica is loading. +And then use the `po2php` command described above to convert the `messages.po` file to the `strings.php` file Friendica is loading. - $> php util/po2php.php view/lang/eo/messages.po + $> php bin/console po2php view/lang/eo/messages.po Afterwards, just commit the two changed files to a feature branch of your Friendica repository, push the changes to github and open a pull request for your changes. diff --git a/util/README b/util/README index 5808194ec..725bef452 100644 --- a/util/README +++ b/util/README @@ -107,7 +107,7 @@ Xgettext and .po workflow of the many .po editors out there, like QtLinguist 5. run - $ php util/po2php.php view/lang//messages.po + $ php bin/console po2php view/lang//messages.po to create the strings.php file When strings are added or modified in source, you could run diff --git a/util/po2php.php b/util/po2php.php deleted file mode 100755 index 819f99b80..000000000 --- a/util/po2php.php +++ /dev/null @@ -1,151 +0,0 @@ -#!/usr/bin/env php -\n\n"; - return; - } - - $pofile = $argv[1]; - $outfile = dirname($pofile)."/strings.php"; - - if (strstr($outfile, 'util')) { - $lang = 'en'; - } else { - $lang = str_replace('-','_',basename(dirname($pofile))); - } - - if (!file_exists($pofile)) { - print "Unable to find '$pofile'\n"; - return; - } - - print "Out to '$outfile'\n"; - - $out = "strings["' . $k . '"] = '; - } - if ($inv) { - $inv = false; - $out .= '"' . $v . '"'; - } - - $v = substr($l, 8, $len - 10); - $v = preg_replace_callback($escape_s_exp, 'escape_s', $v); - $inv = true; - //$out .= $v; - } - 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, 'escape_s', $match[1]) - . " => " - . preg_replace_callback($escape_s_exp, 'escape_s', $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, 'escape_s', $k); - //$out .= '$a->strings['.$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, 'escape_s', $k); - $ink = true; - } - - if ($inv && substr($l, 0, 6) != "msgstr") { - $v .= trim($l, "\"\r\n"); - $v = preg_replace_callback($escape_s_exp, 'escape_s', $v); - //$out .= '$a->strings['.$k.'] = '; - } - - - } - - if ($inv) { - $inv = false; - $out .= '"' . $v . '"'; - } - if ($k != "") { - $out .= ($arr ? "];\n" : ";\n"); - } - - $out = str_replace(DQ_ESCAPE, '\"', $out); - file_put_contents($outfile, $out); - -} - -if (array_search(__FILE__, get_included_files()) === 0) { - po2php_run($_SERVER["argv"],$_SERVER["argc"]); -} From 05b6cf75596e465f3475426a9df6833d8a6515bc Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:49:45 -0400 Subject: [PATCH 24/27] Remove util/extract - Updated documentation --- util/README | 4 +- util/extract.php | 100 ----------------------------------------------- 2 files changed, 2 insertions(+), 102 deletions(-) delete mode 100755 util/extract.php diff --git a/util/README b/util/README index 725bef452..0f0a169b3 100644 --- a/util/README +++ b/util/README @@ -8,7 +8,7 @@ cmdline and see if any parsing errors are reported. Internationalisation -extract.php - extracts translatable strings from our project files. It +php bin/console extract - extracts translatable strings from our project files. It currently doesn't pick up strings in other libraries we might be using such as the HTML parsers. @@ -61,7 +61,7 @@ e.g. Plural -The L10n::tt() function supports plural form. Script extract.php write this in +The L10n::tt() function supports plural form. The extract command writes this in strings.php as an array, one string for every plural form language supports: $a->string["%d message sent"] = Array( diff --git a/util/extract.php b/util/extract.php deleted file mode 100755 index 18fbb9df0..000000000 --- a/util/extract.php +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env php -strings[' . $match . '] = ' . $match . ';' . "\n"; - } - } - } - if (count($matchestt)) { - 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"; -} - -echo $s; - -function glob_recursive($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; -} From 4622f42b1d84b1bd626d2273253843eda03f6893 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:52:07 -0400 Subject: [PATCH 25/27] Remove util/typo - Updated documentation - Fixed typo in documenation --- CHANGELOG | 20 +++--- doc/Developer-How-To-Move-Classes-to-src.md | 2 +- doc/Github.md | 4 +- util/README | 2 +- util/typo.php | 78 --------------------- 5 files changed, 15 insertions(+), 91 deletions(-) delete mode 100755 util/typo.php diff --git a/CHANGELOG b/CHANGELOG index 9ad913771..b3e3059ff 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -72,7 +72,7 @@ Version 3.5.3 (2017-10-05) Fixes to buffer, diaspora, libertree, pumpio, gnu social, tumblr, twitter and wppost bridges to redistribute remote_self content [annando] Fixed a bug in securemail settings form [FuzzJunket] external poller addons are deprecated, as this is now a core functionality [annando] - + Friendica Directory: Fix a problem with the Vagrant config [tobiasd] Fix not working node health page [Hypolite] @@ -82,7 +82,7 @@ Version 3.5.3 (2017-10-05) 1257, 2786, 2864, 2872, 2998, 3013, 3018, 3131, 3180, 3234, 3248, 3309, 3313, 3360, 3362, 3391, 3482, 3511, 3512, 3515, 3516, 3529, 3531, 3536, 3545, 3552, 3553, 3560, 3571, 3589, 3592, 3599, 3615, - 3616, 3621, 3624, 3636, 3645, 3661, 3684, 3685, 3691, 3696, 3699, + 3616, 3621, 3624, 3636, 3645, 3661, 3684, 3685, 3691, 3696, 3699, 3700, 3732 Version 3.5.2 (2017-06-06) @@ -199,8 +199,8 @@ Version 3.5.1 (2017-03-12) Twitter-bridge now supports quotes and long posts when importing tweets [annando] Closed Issues - 1019, 1163, 1612, 1613, 2103, 2177, 2252, 2260, 2403, 2991, 2614, - 2751, 2752, 2772, 2791, 2800, 2804, 2813, 2814, 2816, 2817, 2823, + 1019, 1163, 1612, 1613, 2103, 2177, 2252, 2260, 2403, 2991, 2614, + 2751, 2752, 2772, 2791, 2800, 2804, 2813, 2814, 2816, 2817, 2823, 2850, 2858, 2865, 2892, 2894, 2895, 2907, 2908, 2914, 2015, 2926, 2948, 2955, 2958, 2963, 2964, 2968, 2987, 2993, 3020, 3052, 3062, 3066, 3091, 3108, 3113, 3116, 3117, 3118, 3126, 3130, 3135, 3155, @@ -304,7 +304,7 @@ Version 3.4.3 (2015-12-22) Diaspora and OStatus can be enabled only if requirements are satisfied (annando) Support for additional passwords for ejabberd (annando) Use proxy for profile photos (annando) - 'Reload active themes' in theme admin page (fabrixxm) + 'Reload active themes' in theme admin page (fabrixxm) Install routine checks for ImageMagick and GIF support (fabrixxm) Install routine checks for availability of "mcrypt_create_iv()" function, needed for RINO2 (fabrixxm) Only suported themes are shown in admin page (annando) @@ -315,7 +315,7 @@ Version 3.4.3 (2015-12-22) Show an info message if an empty contact group is shown (issue #1871) (annando) User setting to disable network page autoupdate (issue #1921) (annando) Settings to limit or permit access to crawler to search page (annando) - What's new for developers: + What's new for developers: Themes can show Events entry in navbar (annando) Themes can now override colorbox (fabrixxm) Updated Vagrant development VM (silke, hauke) @@ -343,7 +343,7 @@ Version 3.4.3 (2015-12-22) Fix mention completition popup with TinyMCE (issue #1920) (fabrixxm) Fix photo cache and proxy when installed in subfolder (ddorian1) Fix bbcode conversion of the about text for the profile (issue #1607) (annando) - + Version 3.4.2 (2015-09-29) @@ -388,8 +388,8 @@ Version 3.4.2 (2015-09-29) Checks for mcrypt availability before enable or use RINO2 (fabrixm) Fix following email contacts (issue #1896) (annando) Parse BBCode in contact request notification email (annando) - - + + Version 3.4.1 (2015-07-06) Implement server-to-server encryption (RINO) using php-encryption library as "RINO 2", deprecate "RINO 1" (issue #1655) (fabrixxm) @@ -485,7 +485,7 @@ Version 3.3.3 (2015-02-24) Share-it button support (annando) More reliable reshare from Diaspora (annando) Load more images via proxy (annando) - util/typo.php uses "php -l" insead of "eval()" to validate code (fabrixxm) + typo console command uses "php -l" insead of "eval()" to validate code (fabrixxm) Use $_SERVER array in cli script instead of $argv/$argc (issue #1218) (annando) Updated vagrant setup script (silke) API: support to star/unstar items (fabrixxm) diff --git a/doc/Developer-How-To-Move-Classes-to-src.md b/doc/Developer-How-To-Move-Classes-to-src.md index 134c2a1f5..69e17e9c9 100644 --- a/doc/Developer-How-To-Move-Classes-to-src.md +++ b/doc/Developer-How-To-Move-Classes-to-src.md @@ -94,7 +94,7 @@ Please remove all the `require_once` mentions of the former file, as they will p ## Miscellaneous tips -When you are done with moving the class, please run `php util/typo.php` from the Friendica base directory to check for obvious mistakes. +When you are done with moving the class, please run `php bin/console typo` from the Friendica base directory to check for obvious mistakes. Howevever, this tool isn't bullet-proof, and a staging install of Friendica is recommended to test your class move without impairing your production server if you host one. Most of Friendica processes are run in the background, so make sure to turn on your debug log to check for errors that wouldn't show up while simply browsing Friendica. diff --git a/doc/Github.md b/doc/Github.md index a34855bf7..0145a85f8 100644 --- a/doc/Github.md +++ b/doc/Github.md @@ -68,7 +68,9 @@ If possible get an experienced Friendica developer to review the code. Don't hesitate to ask us in case of doubt. 3. Check your code for typos. -There is a PHP script in the *util* directory called *typos.php* for this. +There is a console command called *typo* for this. + + $> php bin/console typo Check out how to work with [our Vagrant](help/Vagrant) to save a lot of setup time! diff --git a/util/README b/util/README index 0f0a169b3..33bfb9e11 100644 --- a/util/README +++ b/util/README @@ -1,6 +1,6 @@ Utilities -typo.php - is a crude syntax checker to avoid checking in files with simple +php bin/console typo - is a crude syntax checker to avoid checking in files with simple typos. It basically just loads each of our project files at once. Run from cmdline and see if any parsing errors are reported. diff --git a/util/typo.php b/util/typo.php deleted file mode 100755 index fba761e81..000000000 --- a/util/typo.php +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env php -getConfigValue('config', 'php_path', 'php'); - -echo 'Directory: src' . PHP_EOL; -$Iterator = new RecursiveDirectoryIterator('src'); - -foreach (new RecursiveIteratorIterator($Iterator) as $file) { - if (substr($file, -4) === '.php') { - passthru("$phpath -l $file", $ret); - $ret === 0 || die(); - } -} - -echo "Directory: mod\n"; -$files = glob('mod/*.php'); -foreach ($files as $file) { - passthru("$phpath -l $file", $ret); - $ret === 0 || die(); -} - -echo "Directory: include\n"; -$files = glob('include/*.php'); -foreach ($files as $file) { - passthru("$phpath -l $file", $ret); - $ret === 0 || die(); -} - -echo "Directory: object\n"; -$files = glob('object/*.php'); -foreach ($files as $file) { - passthru("$phpath -l $file", $ret); - $ret === 0 || die(); -} - -echo "Directory: addon\n"; -$dirs = glob('addon/*'); - -foreach ($dirs as $dir) { - $addon = basename($dir); - $files = glob($dir . '/' . $addon . '.php'); - foreach ($files as $file) { - passthru("$phpath -l $file", $ret); - $ret === 0 || die(); - } -} - -echo "String files\n"; - -echo 'util/strings.php' . "\n"; -passthru("$phpath -l util/strings.php", $ret); -$ret === 0 || die(); - -$files = glob('view/lang/*/strings.php'); -foreach ($files as $file) { - passthru("$phpath -l $file", $ret); - $ret === 0 || die(); -} From 132456697c25250b5c9c221d2ee83dcd76c0e7a6 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 18 Mar 2018 23:53:53 -0400 Subject: [PATCH 26/27] Remove scripts/dbstructure - Updated documentation --- doc/FAQ.md | 26 ++++----- doc/de/FAQ.md | 120 ++++++++++++++++++++-------------------- mod/admin.php | 4 +- scripts/dbstructure.php | 67 ---------------------- 4 files changed, 75 insertions(+), 142 deletions(-) delete mode 100755 scripts/dbstructure.php diff --git a/doc/FAQ.md b/doc/FAQ.md index ccf81d8a9..eb422be2d 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -30,7 +30,7 @@ User SSL (Secure Socket Layer) is a technology to encrypt data transfer between computers. Sometimes your browser warns you about a missing or invalid certificate. -These warnings can have three reasons: +These warnings can have three reasons: 1. The server you are connected to doesn't offer SSL encryption. 2. The server has a self-signed certificate (not recommended). @@ -49,8 +49,8 @@ Generally, you can attach any kind of file to a post. This is possible by using the "paper-clip"-symbol in the editor. These files will be linked to your post and can be downloaded by your contacts. But it's not possible to get a preview for these items. -Because of this, this upload method is only recommended for office or zipped files. -If you want to share content from Dropbox, Owncloud or any other [filehoster](http://en.wikipedia.org/wiki/Comparison_of_file_hosting_services), use the "link"-button (chain-symbol). +Because of this, this upload method is only recommended for office or zipped files. +If you want to share content from Dropbox, Owncloud or any other [filehoster](http://en.wikipedia.org/wiki/Comparison_of_file_hosting_services), use the "link"-button (chain-symbol). When you're adding URLs of other webpages with the "link"-button, Friendica tries to create a small preview. If this doesn't work, try to add the link by typing: [url=http://example.com]*self-chosen name*[/url]. @@ -58,9 +58,9 @@ If this doesn't work, try to add the link by typing: [url=http://example.com]*se You can also add video and audio files to posts. However, instead of a direct upload you have to use one of the following methods: -1. Add the video or audio link of a hoster (Youtube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post. +1. Add the video or audio link of a hoster (Youtube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post. -2. If you have your own server, you can upload multimedia files via FTP and insert the URL. +2. If you have your own server, you can upload multimedia files via FTP and insert the URL. Friendica uses HTML5 for embedding content. Therefore, the supported files are dependent on your browser and operating system. @@ -130,16 +130,16 @@ If you want to share your public page via rss you can use one of the following l basic-url.com//feed/[nickname]/posts -Example: Friendica Support - +Example: Friendica Support + https://forum.friendi.ca/feed/helpers/posts #### RSS feed of the conversations at your site basic-url.com/feed/profilename/comments - -Example: Friendica Support - + +Example: Friendica Support + https://forum.friendi.ca/feed/helpers/comments @@ -192,7 +192,7 @@ There you will always find the current stable version of friendica. Addons are listed at [this page](https://github.com/friendica/friendica-addons). -If you are searching for new themes, you can find them at [Friendica-Themes.com](http://friendica-themes.com/) +If you are searching for new themes, you can find them at [Friendica-Themes.com](http://friendica-themes.com/) ### I've changed my email address now the admin panel is gone? @@ -213,8 +213,8 @@ The listed emails need to be separated by a comma. Please have a look at the Admin panel under [DB updates](/admin/dbsync/) and follow the link to *check database structure*. This will start a background process to check if the structure is up to the current definition. -You can manually execute the structure update from the CLI in the base directory of your Friendica installation by running the following script: +You can manually execute the structure update from the CLI in the base directory of your Friendica installation by running the following command: - scripts/dbstructure.php update + bin/console dbstructure update if there occur any errors, please contact the [support forum](https://forum.friendi.ca/profile/helpers). diff --git a/doc/de/FAQ.md b/doc/de/FAQ.md index aa9d01b64..8ea9d7621 100644 --- a/doc/de/FAQ.md +++ b/doc/de/FAQ.md @@ -29,10 +29,10 @@ Nutzer ### Warum erhalte ich Warnungen über fehlende Zertifikate? -Manchmal erhältst Du eine Browser-Warnung über fehlende Zertifikate. +Manchmal erhältst Du eine Browser-Warnung über fehlende Zertifikate. Diese Warnungen können drei Gründe haben: -1. der Server, mit dem Du verbunden bist, nutzt kein SSL; +1. der Server, mit dem Du verbunden bist, nutzt kein SSL; 2. der Server hat ein selbst-signiertes Zertifikat (nicht empfohlen) @@ -40,39 +40,39 @@ Diese Warnungen können drei Gründe haben: *(SSL (Secure Socket Layer) ist eine Technologie, die Daten auf ihrem Weg zwischen zwei Computern verschlüsselt.)* -Wenn Du noch kein SSL-Zertifikat hast, dann gibt es drei Wege, eines zu erhalten: kauf Dir eines, hole Dir ein kostenloses (z.B. bei StartSSL, WoSign, hoffentlich bald auch letsencrypt) oder kreiere Dein eigenes (nicht empfohlen). +Wenn Du noch kein SSL-Zertifikat hast, dann gibt es drei Wege, eines zu erhalten: kauf Dir eines, hole Dir ein kostenloses (z.B. bei StartSSL, WoSign, hoffentlich bald auch letsencrypt) oder kreiere Dein eigenes (nicht empfohlen). [Weitere Informationen über die Einrichtung von SSL und warum es schlecht ist, selbst-signierte Zertifikate zu nutzen, findest Du hier.](help/SSL) -Sei Dir bewusst, dass Browser-Warnungen über Sicherheitslücken etwas sind, wodurch neue Nutzer schnell das Vertrauen in das gesamte Friendica-Projekt verlieren können. -Aus diesem Grund wird Friendica Red nur SSL-Zertifikate eines anerkannten Anbieters (CA, certificate authority) akzeptieren und nicht zu Seiten verbinden, die kein SSL nutzen. -Unabhängig von den negativen Aspekten von SSL handelt es sich hierbei um eine notwendige Lösung, solange keine etablierte Alternative existiert. +Sei Dir bewusst, dass Browser-Warnungen über Sicherheitslücken etwas sind, wodurch neue Nutzer schnell das Vertrauen in das gesamte Friendica-Projekt verlieren können. +Aus diesem Grund wird Friendica Red nur SSL-Zertifikate eines anerkannten Anbieters (CA, certificate authority) akzeptieren und nicht zu Seiten verbinden, die kein SSL nutzen. +Unabhängig von den negativen Aspekten von SSL handelt es sich hierbei um eine notwendige Lösung, solange keine etablierte Alternative existiert. -Abgesehen davon kann es ohne SSL auch Probleme mit der Verbindung zu Diaspora geben, da einige Diaspora-Pods eine zertifizierte Verbindung benötigen. +Abgesehen davon kann es ohne SSL auch Probleme mit der Verbindung zu Diaspora geben, da einige Diaspora-Pods eine zertifizierte Verbindung benötigen. -Wenn Du Friendica nur für eine bestimmte Gruppe von Leuten auf einem einzelnen Server nutzt, bei dem keine Verbindung zum restlichen Netzwerk besteht, dann benötigst Du kein SSL. -Ebenso benötigst Du SSL nicht, wenn Du ausschließlich öffentliche Beiträge auf Deiner Seite veröffentlichst bzw. empfängst. +Wenn Du Friendica nur für eine bestimmte Gruppe von Leuten auf einem einzelnen Server nutzt, bei dem keine Verbindung zum restlichen Netzwerk besteht, dann benötigst Du kein SSL. +Ebenso benötigst Du SSL nicht, wenn Du ausschließlich öffentliche Beiträge auf Deiner Seite veröffentlichst bzw. empfängst. -Wenn Du zum jetzigen Zeitpunkt noch keinen Server aufgesetzt hast, ist es sinnvoll, die verschiedenen Anbieter in Bezug auf SSL zu vergleichen. -Einige erlauben die Nutzung von freien Zertifikaten oder lassen Dich ihre eigenen Zertifikate mitnutzen. -Andere erlauben nur kostenpflichtige Zertifikate als eigenes Angebot bzw. von anderen Anbietern. +Wenn Du zum jetzigen Zeitpunkt noch keinen Server aufgesetzt hast, ist es sinnvoll, die verschiedenen Anbieter in Bezug auf SSL zu vergleichen. +Einige erlauben die Nutzung von freien Zertifikaten oder lassen Dich ihre eigenen Zertifikate mitnutzen. +Andere erlauben nur kostenpflichtige Zertifikate als eigenes Angebot bzw. von anderen Anbietern. ### Wie kann ich Bilder, Dateien, Links, Video und Audio in Beiträge einfügen? -Bilder können direkt im [Beitragseditor](help/Text_editor) vom Computer hochgeladen werden. -Eine Übersicht aller Bilder, die auf Deinem Server liegen, findest Du unter deineSeite.de/photos/profilname. +Bilder können direkt im [Beitragseditor](help/Text_editor) vom Computer hochgeladen werden. +Eine Übersicht aller Bilder, die auf Deinem Server liegen, findest Du unter deineSeite.de/photos/profilname. Dort kannst Du auch direkt Bilder hochladen und festlegen, ob Deine Kontakte eine Nachricht über das neue Bild bekommen. -Alle Arten von Dateien können grundsätzlich als Anhang in Friendica hochgeladen werden. -Dafür verwendest Du das Büroklammersymbol im Editor. -Sie sind dann direkt an den Beitrag geknüpft, können von den Betrachtern heruntergeladen werden, aber werden nicht als Vorschau angezeigt. -Deshalb eignet sich diese Methode vor allem für Office-Dateien oder gepackte Dateien wie ZIPs, aber weniger für Multimediadateien. +Alle Arten von Dateien können grundsätzlich als Anhang in Friendica hochgeladen werden. +Dafür verwendest Du das Büroklammersymbol im Editor. +Sie sind dann direkt an den Beitrag geknüpft, können von den Betrachtern heruntergeladen werden, aber werden nicht als Vorschau angezeigt. +Deshalb eignet sich diese Methode vor allem für Office-Dateien oder gepackte Dateien wie ZIPs, aber weniger für Multimediadateien. Wer hingegen Dateien über Dropbox, über eine auf dem eigenen Server installierte Owncloud oder über einen anderen [Filehoster](http://en.wikipedia.org/wiki/Comparison_of_file_hosting_services) einfügen will, verwendet den Link-Button. -Wenn Du mit dem Link-Button (Ketten-Symbol) URLs zu anderen Seiten einfügst, versucht Friendica eine kurze Zusammenfassung als Vorschau abzurufen. +Wenn Du mit dem Link-Button (Ketten-Symbol) URLs zu anderen Seiten einfügst, versucht Friendica eine kurze Zusammenfassung als Vorschau abzurufen. Manchmal klappts das nicht ... dann verlinke den Beitrag einfach per [url=http://example.com]freigewählter Name[/url] im Editor. -Video- und Audiodateien können zwar in Beiträge eingebunden werden, allerdings geht das nicht über einen direkten Upload im Editor wie bei Fotos. +Video- und Audiodateien können zwar in Beiträge eingebunden werden, allerdings geht das nicht über einen direkten Upload im Editor wie bei Fotos. Du hast zwei Möglichkeiten: 1. Du kannst bei dem Video- oder Audiobutton die URL von einem Hoster eingeben (Youtube, Vimeo, Soundcloud und alle anderen mit oembed/opengraph-Unterstützung). Bei Videos zeigt Friendica dann ein Vorschaubild in Deinem Beitrag an, nach einem Klick öffnet sich ein eingebetter Player. Bei Soundcloud wird der Player direkt eingebunden. @@ -84,57 +84,57 @@ Zum Konvertieren von Videos in das lizenfreie Videoformat WebM gibt es unter Win ### Ist es möglich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben? -Ja. -Auf Deiner ["Profile verwalten/editieren"-Seite](../profiles) wählst Du zunächst das gewünschte Profil aus. -Anschließend siehst Du eine Seite mit allen Infos zu diesem Profil. -Klicke nun oben auf den Link "Profilbild ändern" und lade im nächsten Fenster ein Bild von Deinem PC hoch. +Ja. +Auf Deiner ["Profile verwalten/editieren"-Seite](../profiles) wählst Du zunächst das gewünschte Profil aus. +Anschließend siehst Du eine Seite mit allen Infos zu diesem Profil. +Klicke nun oben auf den Link "Profilbild ändern" und lade im nächsten Fenster ein Bild von Deinem PC hoch. Um Deine privaten Daten zu schützen, wird in Beiträgen nur das Bild aus Deinem öffentlichen Profil angezeigt. ### Was ist der Unterschied zwischen blockierten|ignorierten|archivierten|versteckten Kontakten? -Wir verhindern direkte Kommunikation mit blockierten Kontakten. -Sie gehören nicht zu den Empfängern beim Versand von Beiträgen und deren Beiträge werden auch nicht importiert. -Trotzdem werden deren Unterhaltungen mit Deinen Freunden in Deinem Stream sichtbar sein. -Wenn Du einen Kontakt komplett löschst, können sie Dir eine neue Freundschaftsanfrage schicken. -Blockierte Kontakte können das nicht machen. -Sie können nicht mit Dir direkt kommunizieren, nur über Freunde. +Wir verhindern direkte Kommunikation mit blockierten Kontakten. +Sie gehören nicht zu den Empfängern beim Versand von Beiträgen und deren Beiträge werden auch nicht importiert. +Trotzdem werden deren Unterhaltungen mit Deinen Freunden in Deinem Stream sichtbar sein. +Wenn Du einen Kontakt komplett löschst, können sie Dir eine neue Freundschaftsanfrage schicken. +Blockierte Kontakte können das nicht machen. +Sie können nicht mit Dir direkt kommunizieren, nur über Freunde. -Ignorierte Kontakte können weiterhin Beiträge und private Nachrichten von Dir erhalten. -Deren Beiträge und private Nachrichten werden allerdings nicht importiert. -Wie bei blockierten Beiträgen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen Deiner Freunde. +Ignorierte Kontakte können weiterhin Beiträge und private Nachrichten von Dir erhalten. +Deren Beiträge und private Nachrichten werden allerdings nicht importiert. +Wie bei blockierten Beiträgen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen Deiner Freunde. -[Ein Erweiterung namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verkürzen. +[Ein Erweiterung namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verkürzen. Dabei werden auch Kommentare dieser Person in Beiträgen Deiner Freunde blockiert.] -Ein archivierter Kontakt bedeutet, dass Kommunikation nicht möglich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einem neuen Server gewechselt ist und das alte Profil gelöscht hat). +Ein archivierter Kontakt bedeutet, dass Kommunikation nicht möglich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einem neuen Server gewechselt ist und das alte Profil gelöscht hat). Anders als beim Blockieren werden existierende Beiträge, die vor der Archivierung erstellt wurden, weiterhin angezeigt. -Ein versteckter Kontakt wird in keiner "Freundeliste" erscheinen (außer für dich). -Trotzdem wird ein versteckter Kontakt normal in Unterhaltungen angezeigt - was für andere Kontakte ein Hinweis sein kann, dass diese Person als versteckter Kontakt in Deiner Liste ist. +Ein versteckter Kontakt wird in keiner "Freundeliste" erscheinen (außer für dich). +Trotzdem wird ein versteckter Kontakt normal in Unterhaltungen angezeigt - was für andere Kontakte ein Hinweis sein kann, dass diese Person als versteckter Kontakt in Deiner Liste ist. ### Was passiert, wenn ein Account gelöscht ist? Ist dieser richtig gelöscht? -Wenn Du Deinen Account löschst, wird sofort der gesamte Inhalt auf Deinem Server gelöscht und ein Löschbefehl an alle Deine Kontakte verschickt. -Dadurch wirst Du ebenfalls aus dem globalen Verzeichnis gelöscht. -Dieses Vorgehen setzt voraus, dass Dein Profil für 24 Stunden weiterhin "teilweise" verfügbar sein wird, um eine Verbindung zu allen Deinen Kontakten ermöglicht. +Wenn Du Deinen Account löschst, wird sofort der gesamte Inhalt auf Deinem Server gelöscht und ein Löschbefehl an alle Deine Kontakte verschickt. +Dadurch wirst Du ebenfalls aus dem globalen Verzeichnis gelöscht. +Dieses Vorgehen setzt voraus, dass Dein Profil für 24 Stunden weiterhin "teilweise" verfügbar sein wird, um eine Verbindung zu allen Deinen Kontakten ermöglicht. Wir können also Dein Profil blockieren und es so erscheinen lassen, als wären alle Daten sofort gelöscht, allerdings warten wir 24 Stunden (bzw. bis alle Deine Kontakte informiert wurden), bevor wir die Daten auch physikalisch löschen. ### Kann ich einem hashtag folgen? -Nein. -Die Möglichkeit, einem hashtag zu folgen, ist eine interessante Technik, führt aber zu einigen Schwierigkeiten. +Nein. +Die Möglichkeit, einem hashtag zu folgen, ist eine interessante Technik, führt aber zu einigen Schwierigkeiten. -1.) Alle Beiträge, die diesen tag nutzen, müssten zu allen Seiten im Netzwerk kopiert werden. Das erhöht den Speicherbedarf und beeinträchtigt kleine Seiten. Die Nutzung von geteilten Hosting-Angeboten (Shared Hosting) wäre praktisch unmöglich. +1.) Alle Beiträge, die diesen tag nutzen, müssten zu allen Seiten im Netzwerk kopiert werden. Das erhöht den Speicherbedarf und beeinträchtigt kleine Seiten. Die Nutzung von geteilten Hosting-Angeboten (Shared Hosting) wäre praktisch unmöglich. 2.) Die Verbreitung von Spam wäre vereinfacht (tag-Spam ist z.B. bei Twitter ein schwerwiegendes Problem) -3.) Der wichtigste Grund der gegen diese Technik spricht ist, dass sie eine natürliche Ausrichtung auf größere Seiten mit mehr getaggten Inhalten zur Folge hat. Dies kann z.B. aufkommen, wenn Dein Netzwerk tags anstelle von anderen Kommunikationsmitteln wie Gruppen oder Foren nutzt. +3.) Der wichtigste Grund der gegen diese Technik spricht ist, dass sie eine natürliche Ausrichtung auf größere Seiten mit mehr getaggten Inhalten zur Folge hat. Dies kann z.B. aufkommen, wenn Dein Netzwerk tags anstelle von anderen Kommunikationsmitteln wie Gruppen oder Foren nutzt. -Stattdessen bieten wir andere Mechanismen, um globale Unterhaltungen zu erreichen, dabei aber eine angemesse Basis für kleine und große Seiten zu bieten. -Hierzu gehören Foren, Gruppen und geteilte tags. +Stattdessen bieten wir andere Mechanismen, um globale Unterhaltungen zu erreichen, dabei aber eine angemesse Basis für kleine und große Seiten zu bieten. +Hierzu gehören Foren, Gruppen und geteilte tags. ### Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen? @@ -145,16 +145,16 @@ Wenn Du die Beiträge Deines Accounts mit RSS teilen willst, dann kannst Du eine deineSeite.de/feed/[profilname]/posts -Beispiel: Friendica Support - +Beispiel: Friendica Support + https://forum.friendi.ca/feed/helpers/posts #### RSS-Feed all deiner Beiträge und Antworten deineSeite.de/dfrn_poll/feed/[profilname]/comments - -Beispiel: Friendica Support - + +Beispiel: Friendica Support + https://forum.friendi.ca/feeds/helpers/comments #### RSS-Feed all deiner Aktivitäten @@ -188,8 +188,8 @@ Hier ist eine Liste von Clients bei denen dies möglich ist, bzw. die speziell f ### Wo finde ich Hilfe? -Wenn Du Probleme mit Deiner Friendica-Seite hast, dann kannst Du die Community in der [Friendica-Support-Gruppe](https://forum.friendi.ca/profile/helpers) oder im [deutschen Friendica-Support-Forum](http://toktan.org/profile/wiki) fragen oder Dir das [deutsche Wiki](http://wiki.toktan.org/doku.php) anschauen. -Wenn Du Deinen Account nicht nutzen kannst, kannst Du entweder einen [Testaccount](https://tryfriendica.de) bzw. einen Account auf einer öffentlichen Seite ([Liste](https://dir.friendica.social/servers)) nutzen, oder Du wählst die Librelist-mailing-Liste. +Wenn Du Probleme mit Deiner Friendica-Seite hast, dann kannst Du die Community in der [Friendica-Support-Gruppe](https://forum.friendi.ca/profile/helpers) oder im [deutschen Friendica-Support-Forum](http://toktan.org/profile/wiki) fragen oder Dir das [deutsche Wiki](http://wiki.toktan.org/doku.php) anschauen. +Wenn Du Deinen Account nicht nutzen kannst, kannst Du entweder einen [Testaccount](https://tryfriendica.de) bzw. einen Account auf einer öffentlichen Seite ([Liste](https://dir.friendica.social/servers)) nutzen, oder Du wählst die Librelist-mailing-Liste. Wenn Du die Mailing-Liste nutzen willst, schicke eine Mail an friendica AT librelist PUNKT com. Wenn Du ein Theme-Entwickler bist, wirst Du in diesem Forum Hilfe finden: [Friendica Theme Developers](https://friendica.eu/profile/ftdevs). @@ -200,16 +200,16 @@ Admin ### Kann ich mehrere Domains mit den selben Dateien aufsetzen? -Ja, das ist möglich. -Es ist allerdings nicht möglich, eine Datenbank durch zwei Domains zu nutzen. -Solange Du Deine .htconfig.php allerdings so einrichtest, dass das System nicht versucht, eine Installation durchzuführen, kannst Du die richtige Config-Datei in include/$hostname/.htconfig.php hinterlegen. +Ja, das ist möglich. +Es ist allerdings nicht möglich, eine Datenbank durch zwei Domains zu nutzen. +Solange Du Deine .htconfig.php allerdings so einrichtest, dass das System nicht versucht, eine Installation durchzuführen, kannst Du die richtige Config-Datei in include/$hostname/.htconfig.php hinterlegen. Alle Cache-Aspekte und der Zugriffsschutz können pro Instanz konfiguriert werden. ### Wo kann ich den Quellcode von Friendica, Addons und Themes finden? -Du kannst den Friendica-Quellcode [hier](https://github.com/friendica/friendica) finden. -Dort findest Du immer die aktuellste stabile Version von Friendica. +Du kannst den Friendica-Quellcode [hier](https://github.com/friendica/friendica) finden. +Dort findest Du immer die aktuellste stabile Version von Friendica. Der Quellcode von Friendica Red ist [hier](https://github.com/friendica/red) zu finden. Addons findest Du auf [dieser Seite](https://github.com/friendica/friendica-addons). @@ -235,8 +235,8 @@ Rufe bitte im Admin Panel den Punkt [DB Updates](/admin/dbsync/) auf und folge d Damit wird ein Hintergrundprozess gestartet der die Struktur deiner Datenbank überprüft und gegebenenfalls aktualisiert. Du kannst das Struktur Updatee auch manuell auf der Kommandoeingabe ausführen. -Starte dazu bitte vom Grundverzeichnis deiner Friendica Instanz folgendes Skript: +Starte dazu bitte vom Grundverzeichnis deiner Friendica Instanz folgendes Kommand: - scripts/dbstructure.php update + bin/console dbstructure update sollten bei der Ausführung Fehler auftreten, kontaktiere bitte das [Support Forum](https://forum.friendi.ca/profile/helpers). diff --git a/mod/admin.php b/mod/admin.php index 967893e97..e266d29d7 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -718,7 +718,7 @@ function admin_page_summary(App $a) $warningtext = []; if (DBM::is_result($r)) { $showwarning = true; - $warningtext[] = L10n::t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php scripts/dbstructure.php toinnodb of your Friendica installation for an automatic conversion.
', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); + $warningtext[] = L10n::t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php bin/console dbstructure toinnodb of your Friendica installation for an automatic conversion.
', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); } // Check if github.com/friendica/master/VERSION is higher then // the local version of Friendica. Check is opt-in, source may be master or devel branch @@ -735,7 +735,7 @@ function admin_page_summary(App $a) } if (Config::get('system', 'dbupdate') == DB_UPDATE_FAILED) { $showwarning = true; - $warningtext[] = L10n::t('The database update failed. Please run "php scripts/dbstructure.php update" from the command line and have a look at the errors that might appear.'); + $warningtext[] = L10n::t('The database update failed. Please run "php bin/console dbstructure update" from the command line and have a look at the errors that might appear.'); } $last_worker_call = Config::get('system', 'last_poller_execution', false); diff --git a/scripts/dbstructure.php b/scripts/dbstructure.php deleted file mode 100755 index ff5b53c62..000000000 --- a/scripts/dbstructure.php +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env php -\n"; -echo "\n"; -echo "Commands:\n"; -echo "dryrun show database update schema queries without running them\n"; -echo "update update database schema\n"; -echo "dumpsql dump database schema\n"; -echo "toinnodb convert all tables from MyISAM to InnoDB\n"; -killme(); - From 2295d2aa8a0b1077cdbe8e1c70f88140fecd6eb6 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 19 Mar 2018 08:46:17 -0400 Subject: [PATCH 27/27] Revert changes to CHANGELOG --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index b3e3059ff..e77a46c71 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -485,7 +485,7 @@ Version 3.3.3 (2015-02-24) Share-it button support (annando) More reliable reshare from Diaspora (annando) Load more images via proxy (annando) - typo console command uses "php -l" insead of "eval()" to validate code (fabrixxm) + util/typo.php uses "php -l" insead of "eval()" to validate code (fabrixxm) Use $_SERVER array in cli script instead of $argv/$argc (issue #1218) (annando) Updated vagrant setup script (silke) API: support to star/unstar items (fabrixxm)