[!!!][TASK] Remove all legacy CLI-related functionality 70/52470/6
authorBenni Mack <benni@typo3.org>
Mon, 17 Apr 2017 21:42:41 +0000 (23:42 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Tue, 18 Apr 2017 19:04:11 +0000 (21:04 +0200)
This patch removes the following the functionality from the TYPO3 Core, which
has been marked as deprecated in TYPO3 v8.

- entrypoint cli_dispatch.php
- Backend Application entrypoint class as well as the CliRequestHandler
- all functionality related to CLIkeys, registered functionaltiy and old command classes
- The CommandLineController and the CleanerCommand (based on that)

Releases: master
Resolves: #80700
Change-Id: I6d2a73b31e5b046ae93acdc1994a96320d3d2d79
Reviewed-on: https://review.typo3.org/52470
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
14 files changed:
typo3/cli_dispatch.phpsh [deleted file]
typo3/sysext/backend/Classes/Console/Application.php [deleted file]
typo3/sysext/backend/Classes/Console/CliRequestHandler.php [deleted file]
typo3/sysext/backend/Resources/Private/Php/cli.php [deleted file]
typo3/sysext/core/Classes/Console/CommandApplication.php
typo3/sysext/core/Classes/Console/CommandRequestHandler.php
typo3/sysext/core/Classes/Controller/CommandLineController.php [deleted file]
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-80700-DeprecatedFunctionalityRemoved.rst [new file with mode: 0644]
typo3/sysext/extbase/Classes/Mvc/Cli/RequestHandler.php
typo3/sysext/extbase/ext_localconf.php
typo3/sysext/lowlevel/Classes/CleanerCommand.php [deleted file]
typo3/sysext/lowlevel/ext_localconf.php [deleted file]
typo3/sysext/scheduler/ext_localconf.php

diff --git a/typo3/cli_dispatch.phpsh b/typo3/cli_dispatch.phpsh
deleted file mode 100755 (executable)
index 5781739..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env php
-<?php
-// This entry-point is deprecated since TYPO3 v8 and will be removed in TYPO3 v9
-// Use the binary located typo3/sysext/core/bin/typo3 instead.
-require 'sysext/backend/Resources/Private/Php/cli.php';
diff --git a/typo3/sysext/backend/Classes/Console/Application.php b/typo3/sysext/backend/Classes/Console/Application.php
deleted file mode 100644 (file)
index 070b54c..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-namespace TYPO3\CMS\Backend\Console;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-use TYPO3\CMS\Core\Core\ApplicationInterface;
-use TYPO3\CMS\Core\Core\Bootstrap;
-
-/**
- * Entry point for the TYPO3 Command Line for Backend calls
- *
- * This class is @deprecated in favor of the Core-based CommandApplication, which has a different
- * entry-point level, and has a different request handler out-of-the-box. This class will be removed
- * in TYPO3 v9.
- */
-class Application implements ApplicationInterface
-{
-    /**
-     * @var Bootstrap
-     */
-    protected $bootstrap;
-
-    /**
-     * Number of subdirectories where the entry script is located, relative to PATH_site
-     * @var int
-     */
-    protected $entryPointLevel = 1;
-
-    /**
-     * All available request handlers that can deal with a CLI Request
-     * @var array
-     */
-    protected $availableRequestHandlers = [
-        \TYPO3\CMS\Backend\Console\CliRequestHandler::class
-    ];
-
-    /**
-     * Constructor setting up legacy constants and register available Request Handlers
-     *
-     * @param \Composer\Autoload\ClassLoader $classLoader an instance of the class loader
-     */
-    public function __construct($classLoader)
-    {
-        $this->checkEnvironmentOrDie();
-
-        $this->defineLegacyConstants();
-
-        $this->bootstrap = Bootstrap::getInstance()
-            ->initializeClassLoader($classLoader)
-            ->setRequestType(TYPO3_REQUESTTYPE_BE | TYPO3_REQUESTTYPE_CLI)
-            ->baseSetup($this->entryPointLevel);
-
-        foreach ($this->availableRequestHandlers as $requestHandler) {
-            $this->bootstrap->registerRequestHandlerImplementation($requestHandler);
-        }
-
-        $this->bootstrap->configure();
-    }
-
-    /**
-     * Set up the application and shut it down afterwards
-     *
-     * @param callable $execute
-     */
-    public function run(callable $execute = null)
-    {
-        $this->bootstrap->handleRequest(new \Symfony\Component\Console\Input\ArgvInput());
-
-        if ($execute !== null) {
-            call_user_func($execute);
-        }
-
-        $this->bootstrap->shutdown();
-    }
-
-    /**
-     * Define constants and variables
-     */
-    protected function defineLegacyConstants()
-    {
-        define('TYPO3_MODE', 'BE');
-    }
-
-    /**
-     * Check the script is called from a cli environment.
-     */
-    protected function checkEnvironmentOrDie()
-    {
-        if (substr(php_sapi_name(), 0, 3) === 'cgi') {
-            $this->initializeCgiCompatibilityLayerOrDie();
-        } elseif (php_sapi_name() !== 'cli') {
-            die('Not called from a command line interface (e.g. a shell or scheduler).' . LF);
-        }
-    }
-
-    /**
-     * Set up cgi sapi as de facto cli, but check no HTTP
-     * environment variables are set.
-     */
-    protected function initializeCgiCompatibilityLayerOrDie()
-    {
-        // Sanity check: Ensure we're running in a shell or cronjob (and NOT via HTTP)
-        $checkEnvVars = ['HTTP_USER_AGENT', 'HTTP_HOST', 'SERVER_NAME', 'REMOTE_ADDR', 'REMOTE_PORT', 'SERVER_PROTOCOL'];
-        foreach ($checkEnvVars as $var) {
-            if (array_key_exists($var, $_SERVER)) {
-                echo 'SECURITY CHECK FAILED! This script cannot be used within your browser!' . LF;
-                echo 'If you are sure that we run in a shell or cronjob, please unset' . LF;
-                echo 'environment variable ' . $var . ' (usually using \'unset ' . $var . '\')' . LF;
-                echo 'before starting this script.' . LF;
-                die;
-            }
-        }
-
-        // Mimic CLI API in CGI API (you must use the -C/-no-chdir and the -q/--no-header switches!)
-        ini_set('html_errors', 0);
-        ini_set('implicit_flush', 1);
-        ini_set('max_execution_time', 0);
-        define('STDIN', fopen('php://stdin', 'r'));
-        define('STDOUT', fopen('php://stdout', 'w'));
-        define('STDERR', fopen('php://stderr', 'w'));
-    }
-}
diff --git a/typo3/sysext/backend/Classes/Console/CliRequestHandler.php b/typo3/sysext/backend/Classes/Console/CliRequestHandler.php
deleted file mode 100644 (file)
index 6f25a65..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-<?php
-namespace TYPO3\CMS\Backend\Console;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\ConsoleOutput;
-use TYPO3\CMS\Core\Authentication\CommandLineUserAuthentication;
-use TYPO3\CMS\Core\Console\RequestHandlerInterface;
-use TYPO3\CMS\Core\Core\Bootstrap;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-
-/**
- * Command Line Interface Request Handler dealing with "cliKey"-based Commands from the cli_dispatch.phpsh script.
- * Picks up requests only when coming from the CLI mode.
- * Resolves the "cliKey" which is registered inside $TYPO3_CONF_VARS[SC_OPTIONS][GLOBAL][cliKeys]
- * and includes the CLI-based script or exits if no valid "cliKey" is found.
- * Also logs into the system as a backend user which needs to be added to the database called _CLI_mymodule
- *
- * This class is deprecated in favor of the Core-based CommandRequestHandler, which uses Symfony Commands.
- */
-class CliRequestHandler implements RequestHandlerInterface
-{
-    /**
-     * Instance of the current TYPO3 bootstrap
-     * @var Bootstrap
-     */
-    protected $bootstrap;
-
-    /**
-     * Constructor handing over the bootstrap
-     *
-     * @param Bootstrap $bootstrap
-     */
-    public function __construct(Bootstrap $bootstrap)
-    {
-        $this->bootstrap = $bootstrap;
-    }
-
-    /**
-     * Handles any commandline request
-     *
-     * @param InputInterface $input
-     */
-    public function handleRequest(InputInterface $input)
-    {
-        GeneralUtility::deprecationLog('Using cli_dispatch.phpsh as entry point for CLI commands has been marked '
-        . 'as deprecated and will be removed in TYPO3 v9. Please use the new CLI entrypoint via /typo3/sysext/core/bin/typo3 instead.');
-        $output = GeneralUtility::makeInstance(ConsoleOutput::class);
-        $exitCode = 0;
-
-        try {
-            $command = $this->validateCommandLineKeyFromInput($input);
-
-            // try and look up if the CLI command exists
-            $commandLineScript = $this->getIncludeScriptByCommandLineKey($command);
-            $this->boot();
-
-            if (is_callable($commandLineScript)) {
-                call_user_func($commandLineScript, $input, $output);
-            } else {
-                // include the CLI script
-                include($commandLineScript);
-            }
-        } catch (\InvalidArgumentException $e) {
-            $output->writeln('<error>Oops, an error occurred: ' . $e->getMessage() . '</error>');
-            $output->writeln('');
-            $output->writeln('Valid keys are:');
-            $output->writeln('');
-            $cliKeys = array_keys($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']);
-            asort($cliKeys);
-            foreach ($cliKeys as $key => $value) {
-                $output->writeln('  ' . $value);
-            }
-            $exitCode = $e->getCode();
-        } catch (\RuntimeException $e) {
-            $output->writeln('<error>Oops, an error occurred: ' . $e->getMessage() . '</error>');
-            $exitCode = $e->getCode();
-        } catch (\Throwable $e) {
-            $output->writeln('<error>Oops, an error occurred: ' . $e->getMessage() . '</error>');
-            $exitCode = $e->getCode();
-        }
-
-        exit($exitCode);
-    }
-
-    /**
-     * Execute TYPO3 bootstrap
-     *
-     * @throws \RuntimeException when the _CLI_ user cannot be authenticated properly
-     */
-    protected function boot()
-    {
-        $this->bootstrap
-            ->loadBaseTca()
-            ->loadExtTables()
-            ->initializeBackendUser(CommandLineUserAuthentication::class);
-
-        // Checks for a user _CLI_, if non exists, will create one
-        $this->loadCommandLineBackendUser();
-
-        $this->bootstrap
-            ->initializeLanguageObject()
-            // Make sure output is not buffered, so command-line output and interaction can take place
-            ->endOutputBufferingAndCleanPreviousOutput();
-    }
-
-    /**
-     * Check CLI parameters.
-     * First argument is a key that points to the script configuration.
-     * If it is not set or not valid, the script exits with an error message.
-     *
-     * @param InputInterface $input an instance of the input given to the CLI call
-     * @return string the CLI key in use
-     * @throws \InvalidArgumentException
-     */
-    protected function validateCommandLineKeyFromInput(InputInterface $input)
-    {
-        $cliKey = $input->getFirstArgument();
-        if (empty($cliKey)) {
-            throw new \InvalidArgumentException('This script must have a command as first argument.', 1476107418);
-        } elseif (!is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][$cliKey])) {
-            throw new \InvalidArgumentException('This supplied command is not valid.', 1476107480);
-        }
-        return $cliKey;
-    }
-
-    /**
-     * Define cli-related parameters and return the include script.
-     *
-     * @param string $cliKey the CLI key
-     * @return string the absolute path to the include script
-     */
-    protected function getIncludeScriptByCommandLineKey($cliKey)
-    {
-        $commandLineScript = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][$cliKey][0];
-        if (!is_callable($commandLineScript)) {
-            $commandLineScript = GeneralUtility::getFileAbsFileName($commandLineScript);
-        }
-
-        // the CLI key (e.g. "extbase" or "lowlevel"), is removed from the argv, but the script path is kept
-        $cliScriptPath = array_shift($_SERVER['argv']);
-        array_shift($_SERVER['argv']);
-        array_unshift($_SERVER['argv'], $cliScriptPath);
-        return $commandLineScript;
-    }
-
-    /**
-     * If the backend script is in CLI mode, it will try to load a backend user named _cli_
-     *
-     * @throws \RuntimeException if a non-admin Backend user could not be loaded
-     */
-    protected function loadCommandLineBackendUser()
-    {
-        if ($GLOBALS['BE_USER']->user['uid']) {
-            throw new \RuntimeException('Another user was already loaded which is impossible in CLI mode!', 1476107444);
-        }
-        $GLOBALS['BE_USER']->authenticate();
-    }
-
-    /**
-     * This request handler can handle any CLI request.
-     *
-     * @param InputInterface $input
-     * @return bool Always TRUE
-     */
-    public function canHandleRequest(InputInterface $input)
-    {
-        return true;
-    }
-
-    /**
-     * Returns the priority - how eager the handler is to actually handle the request.
-     *
-     * @return int The priority of the request handler.
-     */
-    public function getPriority()
-    {
-        return 20;
-    }
-}
diff --git a/typo3/sysext/backend/Resources/Private/Php/cli.php b/typo3/sysext/backend/Resources/Private/Php/cli.php
deleted file mode 100644 (file)
index 925c6c6..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-// Exit early if php requirement is not satisfied.
-if (version_compare(PHP_VERSION, '7.0.0', '<')) {
-    die('This version of TYPO3 CMS requires PHP 7.0 or above');
-}
-
-/**
- * --------------------------------------------------------------------------------
- * NOTE: This entry-point is deprecated since TYPO3 v8 and will be removed in
- * TYPO3 v9. Use the binary located typo3/sysext/core/bin/typo3 instead.
- * --------------------------------------------------------------------------------
- * Command Line Interface module dispatcher
- *
- * This script takes a "cliKey" as first argument and uses that to dispatch
- * the call to a registered script with that key.
- * Valid cliKeys must be registered in
- * $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'].
- */
-call_user_func(function () {
-    $classLoader = require __DIR__ . '/../../../../../../vendor/autoload.php';
-
-    (new \TYPO3\CMS\Backend\Console\Application($classLoader))->run();
-});
index 1dd9c9e..8cf5e99 100644 (file)
@@ -41,7 +41,6 @@ class CommandApplication implements ApplicationInterface
      */
     protected $availableRequestHandlers = [
         \TYPO3\CMS\Core\Console\CommandRequestHandler::class,
-        \TYPO3\CMS\Backend\Console\CliRequestHandler::class
     ];
 
     /**
index f841fee..86bd569 100644 (file)
@@ -69,23 +69,6 @@ class CommandRequestHandler implements RequestHandlerInterface
             // Make sure output is not buffered, so command-line output and interaction can take place
             ->endOutputBufferingAndCleanPreviousOutput();
 
-        // Check if the command to run needs a backend user to be loaded
-        $command = $this->getCommandToRun($input);
-
-        if (!$command) {
-            // Using old "cliKeys" is marked as deprecated and will be removed in TYPO3 v9
-            $cliKeys = array_keys($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']);
-
-            $output->writeln('Using old "cliKeys" ($GLOBALS[TYPO3_CONF_VARS][SC_OPTIONS][GLOBAL][cliKeys]) is marked as deprecated and will be removed in TYPO3 v9:');
-            $output->writeln('Old entrypoint keys available:');
-            asort($cliKeys);
-            foreach ($cliKeys as $key => $value) {
-                $output->writeln('  ' . $value);
-            }
-            $output->writeln('');
-            $output->writeln('TYPO3 Console Commands:');
-        }
-
         $exitCode = $this->application->run($input, $output);
         exit($exitCode);
     }
@@ -113,20 +96,6 @@ class CommandRequestHandler implements RequestHandlerInterface
     }
 
     /**
-     * @param InputInterface $input
-     * @return bool|Command
-     */
-    protected function getCommandToRun(InputInterface $input)
-    {
-        $firstArgument = $input->getFirstArgument();
-        try {
-            return $this->application->find($firstArgument);
-        } catch (\InvalidArgumentException $e) {
-            return false;
-        }
-    }
-
-    /**
      * Put all available commands inside the application
      */
     protected function populateAvailableCommands()
diff --git a/typo3/sysext/core/Classes/Controller/CommandLineController.php b/typo3/sysext/core/Classes/Controller/CommandLineController.php
deleted file mode 100644 (file)
index a272720..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-<?php
-namespace TYPO3\CMS\Core\Controller;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-
-/**
- * TYPO3 cli script basis
- * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, use a custom Command instead
- */
-class CommandLineController
-{
-    /**
-     * Command line arguments, exploded into key => value-array pairs
-     *
-     * @var array
-     */
-    public $cli_args = [];
-
-    /**
-     * @var array
-     */
-    public $cli_options = [
-        ['-s', 'Silent operation, will only output errors and important messages.'],
-        ['--silent', 'Same as -s'],
-        ['-ss', 'Super silent, will not even output errors or important messages.']
-    ];
-
-    /**
-     * @var array
-     */
-    public $cli_help = [
-        'name' => 'CLI base class (overwrite this...)',
-        'synopsis' => '###OPTIONS###',
-        'description' => 'Class with basic functionality for CLI scripts (overwrite this...)',
-        'examples' => 'Give examples...',
-        'options' => '',
-        'license' => 'GNU GPL - free software!',
-        'author' => '[Author name]'
-    ];
-
-    /**
-     * @var resource
-     */
-    public $stdin = null;
-
-    /**
-     * Constructor
-     * Make sure child classes also call this!
-     *
-     * @deprecated the CommandLineController is deprecated since TYPO3 v8 and will be removed in TYPO3 v9, use a separate CLI Command instead
-     */
-    public function __construct()
-    {
-        GeneralUtility::logDeprecatedFunction();
-        // Loads the cli_args array with command line arguments
-        $this->cli_setArguments($_SERVER['argv']);
-    }
-
-    /**
-     * Finds the arg token (like "-s") in argv and returns the rest of argv from that point on.
-     * This should only be used in special cases since this->cli_args should already be prepared with an index of values!
-     *
-     * @param string $option Option string, eg. "-s
-     * @param array $argv Input argv array
-     * @return array Output argv array with all options AFTER the found option.
-     */
-    public function cli_getArgArray($option, $argv)
-    {
-        while (count($argv) && (string)$argv[0] !== (string)$option) {
-            array_shift($argv);
-        }
-        if ((string)$argv[0] === (string)$option) {
-            array_shift($argv);
-            return !empty($argv) ? $argv : [''];
-        }
-    }
-
-    /**
-     * Return TRUE if option is found
-     *
-     * @param string $option Option string, eg. "-s
-     * @return bool TRUE if option found
-     */
-    public function cli_isArg($option)
-    {
-        return isset($this->cli_args[$option]);
-    }
-
-    /**
-     * Return argument value
-     *
-     * @param string $option Option string, eg. "-s
-     * @param int $idx Value index, default is 0 (zero) = the first one...
-     * @return bool TRUE if option found
-     */
-    public function cli_argValue($option, $idx = 0)
-    {
-        return is_array($this->cli_args[$option]) ? $this->cli_args[$option][$idx] : '';
-    }
-
-    /**
-     * Will parse "_SERVER[argv]" into an index of options and values
-     * Argument names (eg. "-s") will be keys and values after (eg. "-s value1 value2 ..." or "-s=value1") will be in the array.
-     * Array is empty if no values
-     *
-     * @param array $argv Configuration options
-     * @return array
-     */
-    public function cli_getArgIndex(array $argv = [])
-    {
-        $cli_options = [];
-        $index = '_DEFAULT';
-        foreach ($argv as $token) {
-            // Options starting with a number is invalid - they could be negative values!
-            if ($token[0] === '-' && !\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($token[1])) {
-                list($index, $opt) = explode('=', $token, 2);
-                if (isset($cli_options[$index])) {
-                    echo 'ERROR: Option ' . $index . ' was used twice!' . LF;
-                    die;
-                }
-                $cli_options[$index] = [];
-                if (isset($opt)) {
-                    $cli_options[$index][] = $opt;
-                }
-            } else {
-                $cli_options[$index][] = $token;
-            }
-        }
-        return $cli_options;
-    }
-
-    /**
-     * Validates if the input arguments in this->cli_args are all listed in this->cli_options and if not,
-     * will exit with an error.
-     */
-    public function cli_validateArgs()
-    {
-        $cli_args_copy = $this->cli_args;
-        unset($cli_args_copy['_DEFAULT']);
-        $allOptions = [];
-        foreach ($this->cli_options as $cfg) {
-            $allOptions[] = $cfg[0];
-            $argSplit = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(' ', $cfg[0], true);
-            if (isset($cli_args_copy[$argSplit[0]])) {
-                $ii = 0;
-                foreach ($argSplit as $i => $v) {
-                    $ii = $i;
-                    if ($i > 0) {
-                        if (!isset($cli_args_copy[$argSplit[0]][$i - 1]) && $v[0] !== '[') {
-                            // Using "[]" around a parameter makes it optional
-                            echo 'ERROR: Option "' . $argSplit[0] . '" requires a value ("' . $v . '") on position ' . $i . LF;
-                            die;
-                        }
-                    }
-                }
-                $ii++;
-                if (isset($cli_args_copy[$argSplit[0]][$ii - 1])) {
-                    echo 'ERROR: Option "' . $argSplit[0] . '" does not support a value on position ' . $ii . LF;
-                    die;
-                }
-                unset($cli_args_copy[$argSplit[0]]);
-            }
-        }
-        if (!empty($cli_args_copy)) {
-            echo wordwrap('ERROR: Option ' . implode(',', array_keys($cli_args_copy)) . ' was unknown to this script!' . LF . '(Options are: ' . implode(', ', $allOptions) . ')' . LF);
-            die;
-        }
-    }
-
-    /**
-     * Set environment array to $cli_args
-     *
-     * @param array $argv Configuration options
-     */
-    public function cli_setArguments(array $argv = [])
-    {
-        $this->cli_args = $this->cli_getArgIndex($argv);
-    }
-
-    /**
-     * Asks stdin for keyboard input and returns the line (after enter is pressed)
-     *
-     * @return string
-     */
-    public function cli_keyboardInput()
-    {
-        // Have to open the stdin stream only ONCE! otherwise I cannot read multiple lines from it... :
-        if (!$this->stdin) {
-            $this->stdin = fopen('php://stdin', 'r');
-        }
-        while (false == ($line = fgets($this->stdin, 1000))) {
-        }
-        return trim($line);
-    }
-
-    /**
-     * Asks for Yes/No from shell and returns TRUE if "y" or "yes" is found as input.
-     *
-     * @param string $msg String to ask before...
-     * @return bool TRUE if "y" or "yes" is the input (case insensitive)
-     */
-    public function cli_keyboardInput_yes($msg = '')
-    {
-        // ONLY makes sense to echo it out since we are awaiting keyboard input - that cannot be silenced
-        echo $msg . ' (Yes/No + return): ';
-        $input = strtolower($this->cli_keyboardInput());
-        return $input === 'y' || $input === 'yes';
-    }
-
-    /**
-     * Echos strings to shell, but respective silent-modes
-     *
-     * @param string $string The string
-     * @param bool $force If string should be written even if -s is set (-ss will subdue it!)
-     * @return bool Returns TRUE if string was outputted.
-     */
-    public function cli_echo($string = '', $force = false)
-    {
-        if (isset($this->cli_args['-ss'])) {
-        } elseif (isset($this->cli_args['-s']) || isset($this->cli_args['--silent'])) {
-            if ($force) {
-                echo $string;
-                return true;
-            }
-        } else {
-            echo $string;
-            return true;
-        }
-        return false;
-    }
-
-    /**
-     * Prints help-output from ->cli_help array
-     */
-    public function cli_help()
-    {
-        foreach ($this->cli_help as $key => $value) {
-            $this->cli_echo(strtoupper($key) . ':
-');
-            switch ($key) {
-                case 'synopsis':
-                    $optStr = '';
-                    foreach ($this->cli_options as $v) {
-                        $optStr .= ' [' . $v[0] . ']';
-                    }
-                    $this->cli_echo($this->cli_indent(str_replace('###OPTIONS###', trim($optStr), $value), 4) . '
-
-');
-                    break;
-                case 'options':
-                    $this->cli_echo($this->cli_indent($value, 4) . LF);
-                    $maxLen = 0;
-                    foreach ($this->cli_options as $v) {
-                        if (strlen($v[0]) > $maxLen) {
-                            $maxLen = strlen($v[0]);
-                        }
-                    }
-                    foreach ($this->cli_options as $v) {
-                        $this->cli_echo($v[0] . substr($this->cli_indent(rtrim($v[1] . LF . $v[2]), $maxLen + 4), strlen($v[0])) . LF);
-                    }
-                    $this->cli_echo(LF);
-                    break;
-                default:
-                    $this->cli_echo($this->cli_indent($value, 4) . '
-
-');
-            }
-        }
-    }
-
-    /**
-     * Indentation function for 75 char wide lines.
-     *
-     * @param string $str String to break and indent.
-     * @param int $indent Number of space chars to indent.
-     * @return string Result
-     */
-    public function cli_indent($str, $indent)
-    {
-        $lines = explode(LF, wordwrap($str, 75 - $indent));
-        $indentStr = str_pad('', $indent, ' ');
-        foreach ($lines as $k => $v) {
-            $lines[$k] = $indentStr . $lines[$k];
-        }
-        return implode(LF, $lines);
-    }
-}
index ea4ffab..d530d1c 100644 (file)
@@ -1073,8 +1073,6 @@ return [
                 'email' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
                 'url' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
             ],
-            // cliKeys have been deprecated and will be removed in TYPO3 v9
-            'cliKeys' => []
         ],
     ],
     'SVCONF' => []
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-80700-DeprecatedFunctionalityRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-80700-DeprecatedFunctionalityRemoved.rst
new file mode 100644 (file)
index 0000000..ad03997
--- /dev/null
@@ -0,0 +1,33 @@
+.. include:: ../../Includes.txt
+
+===================================================
+Breaking: #80700 - Deprecated functionality removed
+===================================================
+
+See :issue:`80700`
+
+Description
+===========
+
+The following PHP classes that have been previously deprecated for v8 have been removed:
+
+* TYPO3\CMS\Backend\Console\Application
+* TYPO3\CMS\Backend\Console\CliRequestHandler
+* TYPO3\CMS\Core\Controller\CommandLineController
+* TYPO3\CMS\Lowlevel\CleanerCommand
+
+The following configuration options are not evaluated anymore:
+* $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']
+
+The following entrypoints have been removed
+* typo3/cli_dispatch.phpsh
+
+
+Impact
+======
+
+Instantiating or requiring the PHP classes, will result in PHP fatal errors.
+
+Calling the entrypoints via CLI will result in a file not found error.
+
+.. index:: PHP-API
\ No newline at end of file
index 01f4f7f..c7e84da 100644 (file)
@@ -86,10 +86,6 @@ class RequestHandler implements \TYPO3\CMS\Extbase\Mvc\RequestHandlerInterface
             $callingScript = $_SERVER['_'] . ' ' . $callingScript;
         }
 
-        // Add the "extbase" prefix for the cli_dispatch command line tool
-        if (strpos($callingScript, 'cli_dispatch') !== false) {
-            $callingScript .= ' extbase';
-        }
         $request = $this->requestBuilder->build($commandLine, $callingScript);
         /** @var $response \TYPO3\CMS\Extbase\Mvc\Cli\Response */
         $response = $this->objectManager->get(\TYPO3\CMS\Extbase\Mvc\Cli\Response::class);
index 048fa54..262a32e 100644 (file)
@@ -31,15 +31,5 @@ unset($extbaseObjectContainer);
 \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter(\TYPO3\CMS\Extbase\Property\TypeConverter\StaticFileCollectionConverter::class);
 \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerTypeConverter(\TYPO3\CMS\Extbase\Property\TypeConverter\FolderConverter::class);
 
-if (TYPO3_MODE === 'BE') {
-    // registers Extbase at the cli_dispatcher with key "extbase".
-    // Using cliKeys is deprecated as of TYPO3 v8 and will be removed in TYPO3 v9, use Configuration/Commands.php instead
-    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']['extbase'] = [
-        function () {
-            $bootstrap = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Core\Bootstrap::class);
-            echo $bootstrap->run('', []);
-        }
-    ];
-    // register help command
-    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = \TYPO3\CMS\Extbase\Command\HelpCommandController::class;
-}
+// register help command
+$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = \TYPO3\CMS\Extbase\Command\HelpCommandController::class;
diff --git a/typo3/sysext/lowlevel/Classes/CleanerCommand.php b/typo3/sysext/lowlevel/Classes/CleanerCommand.php
deleted file mode 100644 (file)
index baf4ab8..0000000
+++ /dev/null
@@ -1,601 +0,0 @@
-<?php
-namespace TYPO3\CMS\Lowlevel;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Backend\Utility\BackendUtility;
-use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
-use TYPO3\CMS\Core\Database\ReferenceIndex;
-use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Core\Utility\MathUtility;
-
-/**
- * Core functions for cleaning and analysing
- *
- * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
- */
-class CleanerCommand extends \TYPO3\CMS\Core\Controller\CommandLineController
-{
-    /**
-     * @var bool
-     */
-    public $genTree_traverseDeleted = true;
-
-    /**
-     * @var bool
-     */
-    public $genTree_traverseVersions = true;
-
-    /**
-     * @var string
-     */
-    public $label_infoString = 'The list of records is organized as [table]:[uid]:[field]:[flexpointer]:[softref_key]';
-
-    /**
-     * @var array
-     */
-    public $pagetreePlugins = [];
-
-    /**
-     * @var array
-     */
-    public $cleanerModules = [];
-
-    /**
-     * @var array
-     */
-    protected $recStats = [];
-
-    /**
-     * @var array
-     */
-    protected $workspaceIndex = [0 => true];
-
-    /**
-     * Constructor
-     */
-    public function __construct()
-    {
-        // Running parent class constructor
-        parent::__construct();
-        $this->cleanerModules = (array)$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['lowlevel']['cleanerModules'];
-        // Adding options to help archive:
-        $this->cli_options[] = ['-r', 'Execute this tool, otherwise help is shown'];
-        $this->cli_options[] = ['-v level', 'Verbosity level 0-3', 'The value of level can be:
-  0 = all output
-  1 = info and greater (default)
-  2 = warnings and greater
-  3 = errors'];
-        $this->cli_options[] = ['--refindex mode', 'Mode for reference index handling for operations that require a clean reference index ("update"/"ignore")', 'Options are "check" (default), "update" and "ignore". By default, the reference index is checked before running analysis that require a clean index. If the check fails, the analysis is not run. You can choose to bypass this completely (using value "ignore") or ask to have the index updated right away before the analysis (using value "update")'];
-        $this->cli_options[] = ['--AUTOFIX [testName]', 'Repairs errors that can be automatically fixed.', 'Only add this option after having run the test without it so you know what will happen when you add this option! The optional parameter "[testName]" works for some tool keys to limit the fixing to a particular test.'];
-        $this->cli_options[] = ['--dryrun', 'With --AUTOFIX it will only simulate a repair process', 'You may like to use this to see what the --AUTOFIX option will be doing. It will output the whole process like if a fix really occurred but nothing is in fact happening'];
-        $this->cli_options[] = ['--YES', 'Implicit YES to all questions', 'Use this with EXTREME care. The option "-i" is not affected by this option.'];
-        $this->cli_options[] = ['-i', 'Interactive', 'Will ask you before running the AUTOFIX on each element.'];
-        $this->cli_options[] = ['--filterRegex expr', 'Define an expression for preg_match() that must match the element ID in order to auto repair it', 'The element ID is the string in quotation marks when the text \'Cleaning ... in "ELEMENT ID"\'. "expr" is the expression for preg_match(). To match for example "Nature3.JPG" and "Holiday3.JPG" you can use "/.*3.JPG/". To match for example "Image.jpg" and "Image.JPG" you can use "/.*.jpg/i". Try a --dryrun first to see what the matches are!'];
-        $this->cli_options[] = ['--showhowto', 'Displays HOWTO file for cleaner script.'];
-        // Setting help texts:
-        $this->cli_help['name'] = 'lowlevel_cleaner -- Analysis and clean-up tools for TYPO3 installations';
-        $this->cli_help['synopsis'] = 'toolkey ###OPTIONS###';
-        $this->cli_help['description'] = 'Dispatches to various analysis and clean-up tools which can plug into the API of this script. Typically you can run tests that will take longer than the usual max execution time of PHP. Such tasks could be checking for orphan records in the page tree or flushing all published versions in the system. For the complete list of options, please explore each of the \'toolkey\' keywords below:
-
-  ' . implode('
-  ', array_keys($this->cleanerModules));
-        $this->cli_help['examples'] = '/.../cli_dispatch.phpsh lowlevel_cleaner missing_files -s -r
-This will show you missing files in the TYPO3 system and only report back if errors were found.';
-        $this->cli_help['author'] = 'Kasper Skaarhoej, (c) 2006';
-    }
-
-    /**************************
-     *
-     * CLI functionality
-     *
-     *************************/
-    /**
-     * CLI engine
-     *
-     * @param array $argv Command line arguments
-     * @return string
-     * @deprecated the Cleaner Command is deprecated since TYPO3 v8 and will be removed in TYPO3 v9, use a separate CLI Command instead
-     */
-    public function cli_main($argv)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $this->cli_setArguments($argv);
-
-        // Force user to admin state and set workspace to "Live":
-        $GLOBALS['BE_USER']->user['admin'] = 1;
-        $GLOBALS['BE_USER']->setWorkspace(0);
-        // Print Howto:
-        if ($this->cli_isArg('--showhowto')) {
-            $howto = file_get_contents(ExtensionManagementUtility::extPath('lowlevel') . 'README.rst');
-            echo wordwrap($howto, 120) . LF;
-            die;
-        }
-        // Print help
-        $analysisType = (string)$this->cli_args['_DEFAULT'][1];
-        if (!$analysisType) {
-            $this->cli_validateArgs();
-            $this->cli_help();
-            die;
-        }
-
-        if (is_array($this->cleanerModules[$analysisType])) {
-            $cleanerMode = GeneralUtility::getUserObj($this->cleanerModules[$analysisType][0]);
-            $cleanerMode->cli_validateArgs();
-            // Run it...
-            if ($this->cli_isArg('-r')) {
-                if (!$cleanerMode->checkRefIndex || $this->cli_referenceIndexCheck()) {
-                    $res = $cleanerMode->main();
-                    $this->cli_printInfo($analysisType, $res);
-                    // Autofix...
-                    if ($this->cli_isArg('--AUTOFIX')) {
-                        if ($this->cli_isArg('--YES') || $this->cli_keyboardInput_yes('
-
-NOW Running --AUTOFIX on result. OK?' . ($this->cli_isArg('--dryrun') ? ' (--dryrun simulation)' : ''))) {
-                            $cleanerMode->main_autofix($res);
-                        } else {
-                            $this->cli_echo('ABORTING AutoFix...
-', 1);
-                        }
-                    }
-                }
-            } else {
-                // Help only...
-                $cleanerMode->cli_help();
-                die;
-            }
-        } else {
-            $this->cli_echo('ERROR: Analysis Type \'' . $analysisType . '\' is unknown.
-', 1);
-            die;
-        }
-    }
-
-    /**
-     * Checks reference index
-     *
-     * @return bool TRUE if reference index was OK (either OK, updated or ignored)
-     */
-    public function cli_referenceIndexCheck()
-    {
-        // Reference index option:
-        $refIndexMode = isset($this->cli_args['--refindex']) ? $this->cli_args['--refindex'][0] : 'check';
-        switch ($refIndexMode) {
-            case 'check':
-
-            case 'update':
-                $refIndexObj = GeneralUtility::makeInstance(ReferenceIndex::class);
-                list($headerContent, $bodyContent, $errorCount) = $refIndexObj->updateIndex($refIndexMode === 'check', $this->cli_echo());
-                if ($errorCount && $refIndexMode === 'check') {
-                    $ok = false;
-                    $this->cli_echo('ERROR: Reference Index Check failed! (run with \'--refindex update\' to fix)
-', 1);
-                } else {
-                    $ok = true;
-                }
-                break;
-            case 'ignore':
-                $this->cli_echo('Reference Index Check: Bypassing reference index check...
-');
-                $ok = true;
-                break;
-            default:
-                $this->cli_echo('ERROR: Wrong value for --refindex argument.
-', 1);
-                die();
-
-        }
-        return $ok;
-    }
-
-    /**
-     * @param string $matchString
-     * @return string If string, it's the reason for not executing. Returning FALSE means it should execute.
-     */
-    public function cli_noExecutionCheck($matchString)
-    {
-        // Check for filter:
-        if ($this->cli_isArg('--filterRegex') && ($regex = $this->cli_argValue('--filterRegex', 0))) {
-            if (!preg_match($regex, $matchString)) {
-                return 'BYPASS: Filter Regex "' . $regex . '" did not match string "' . $matchString . '"';
-            }
-        }
-        // Check for interactive mode
-        if ($this->cli_isArg('-i')) {
-            if (!$this->cli_keyboardInput_yes(' EXECUTE?')) {
-                return 'BYPASS...';
-            }
-        }
-        // Check for
-        if ($this->cli_isArg('--dryrun')) {
-            return 'BYPASS: --dryrun set';
-        }
-    }
-
-    /**
-     * Formats a result array from a test so it fits output in the shell
-     *
-     * @param string $header Name of the test (eg. function name)
-     * @param array $res Result array from an analyze function
-     */
-    public function cli_printInfo($header, $res)
-    {
-        $detailLevel = MathUtility::forceIntegerInRange($this->cli_isArg('-v') ? $this->cli_argValue('-v') : 1, 0, 3);
-        $silent = !$this->cli_echo();
-        $severity = [
-            0 => 'MESSAGE',
-            1 => 'INFO',
-            2 => 'WARNING',
-            3 => 'ERROR'
-        ];
-        // Header output:
-        if ($detailLevel <= 1) {
-            $this->cli_echo('*********************************************
-' . $header . LF . '*********************************************
-');
-            $this->cli_echo(wordwrap(trim($res['message'])) . LF . LF);
-        }
-        // Traverse headers for output:
-        if (is_array($res['headers'])) {
-            foreach ($res['headers'] as $key => $value) {
-                if ($detailLevel <= (int)$value[2]) {
-                    if (is_array($res[$key]) && (count($res[$key]) || !$silent)) {
-                        // Header and explanaion:
-                        $this->cli_echo('---------------------------------------------' . LF, 1);
-                        $this->cli_echo('[' . $header . ']' . LF, 1);
-                        $this->cli_echo($value[0] . ' [' . $severity[$value[2]] . ']' . LF, 1);
-                        $this->cli_echo('---------------------------------------------' . LF, 1);
-                        if (trim($value[1])) {
-                            $this->cli_echo('Explanation: ' . wordwrap(trim($value[1])) . LF . LF, 1);
-                        }
-                    }
-                    // Content:
-                    if (is_array($res[$key])) {
-                        if (count($res[$key])) {
-                            if ($this->cli_echo('', 1)) {
-                                print_r($res[$key]);
-                            }
-                        } else {
-                            $this->cli_echo('(None)' . LF . LF);
-                        }
-                    } else {
-                        $this->cli_echo($res[$key] . LF . LF);
-                    }
-                }
-            }
-        }
-    }
-
-    /**************************
-     *
-     * Page tree traversal
-     *
-     *************************/
-    /**
-     * Traverses the FULL/part of page tree, mainly to register ALL validly connected records (to find orphans) but also to register deleted records, versions etc.
-     * Output (in $this->recStats) can be useful for multiple purposes.
-     *
-     * @param int $rootID Root page id from where to start traversal. Use "0" (zero) to have full page tree (necessary when spotting orphans, otherwise you can run it on parts only)
-     * @param int $depth Depth to traverse. zero is do not traverse at all. 1 = 1 sublevel, 1000= 1000 sublevels (all...)
-     * @param int $echoLevel If >0, will echo information about the traversal process.
-     * @param string $callBack Call back function (from this class or subclass)
-     */
-    public function genTree($rootID, $depth = 1000, $echoLevel = 0, $callBack = '')
-    {
-        // Initialize:
-        if (ExtensionManagementUtility::isLoaded('workspaces')) {
-            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
-                ->getQueryBuilderForTable('sys_workspace');
-
-            $queryBuilder->getRestrictions()
-                ->removeAll()
-                ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
-
-            $workspaceRecords = $queryBuilder
-                ->select('uid', 'title')
-                ->from('sys_workspace')
-                ->execute()
-                ->fetchAll();
-
-            foreach ($workspaceRecords as $workspaceRecord) {
-                $this->workspaceIndex[$workspaceRecord['uid']] = true;
-            }
-        }
-
-        $this->recStats = [
-            'all' => [],
-            // All records connected in tree including versions (the reverse are orphans). All Info and Warning categories below are included here (and therefore safe if you delete the reverse of the list)
-            'deleted' => [],
-            // Subset of "alL" that are deleted-flagged [Info]
-            'versions' => [],
-            // Subset of "all" which are offline versions (pid=-1). [Info]
-            'versions_published' => [],
-            // Subset of "versions" that is a count of 1 or more (has been published) [Info]
-            'versions_liveWS' => [],
-            // Subset of "versions" that exists in live workspace [Info]
-            'versions_lost_workspace' => [],
-            // Subset of "versions" that doesn't belong to an existing workspace [Warning: Fix by move to live workspace]
-            'versions_inside_versioned_page' => [],
-            // Subset of "versions" This is versions of elements found inside an already versioned branch / page. In real life this can work out, but is confusing and the backend should prevent this from happening to people. [Warning: Fix by deleting those versions (or publishing them)]
-            'illegal_record_under_versioned_page' => [],
-            // If a page is "element" or "page" version and records are found attached to it, they might be illegally attached, so this will tell you. [Error: Fix by deleting orphans since they are not registered in "all" category]
-            'misplaced_at_rootlevel' => [],
-            // Subset of "all": Those that should not be at root level but are. [Warning: Fix by moving record into page tree]
-            'misplaced_inside_tree' => []
-        ];
-        // Start traversal:
-        $this->genTree_traverse($rootID, $depth, $echoLevel, $callBack);
-        // Sort recStats (for diff'able displays)
-        foreach ($this->recStats as $kk => $vv) {
-            foreach ($this->recStats[$kk] as $tables => $recArrays) {
-                ksort($this->recStats[$kk][$tables]);
-            }
-            ksort($this->recStats[$kk]);
-        }
-        if ($echoLevel > 0) {
-            echo LF . LF;
-        }
-    }
-
-    /**
-     * Recursive traversal of page tree:
-     *
-     * @param int $rootID Page root id (must be online, valid page record - or zero for page tree root)
-     * @param int $depth Depth
-     * @param int $echoLevel Echo Level
-     * @param string $callBack Call back function (from this class or subclass)
-     * @param bool $versionSwapmode DON'T set from outside, internal. (indicates we are inside a version of a page)
-     * @param int $rootIsVersion DON'T set from outside, internal. (1: Indicates that rootID is a version of a page, 2: ...that it is even a version of a version (which triggers a warning!)
-     * @param string $accumulatedPath Internal string that accumulates the path
-     * @access private
-     */
-    public function genTree_traverse($rootID, $depth, $echoLevel = 0, $callBack = '', $versionSwapmode = false, $rootIsVersion = 0, $accumulatedPath = '')
-    {
-        // Register page:
-        $this->recStats['all']['pages'][$rootID] = $rootID;
-
-        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages');
-        $queryBuilder->getRestrictions()->removeAll();
-
-        $pageRecord = $queryBuilder->select('deleted', 'title', 't3ver_count', 't3ver_wsid')
-            ->from('pages')
-            ->where($queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($rootID, \PDO::PARAM_INT)))
-            ->execute()
-            ->fetch();
-
-        $accumulatedPath .= '/' . $pageRecord['title'];
-        // Register if page is deleted:
-        if ($pageRecord['deleted']) {
-            $this->recStats['deleted']['pages'][$rootID] = $rootID;
-        }
-        // If rootIsVersion is set it means that the input rootID is that of a version of a page. See below where the recursive call is made.
-        if ($rootIsVersion) {
-            $this->recStats['versions']['pages'][$rootID] = $rootID;
-            // If it has been published and is in archive now...
-            if ($pageRecord['t3ver_count'] >= 1 && $pageRecord['t3ver_wsid'] == 0) {
-                $this->recStats['versions_published']['pages'][$rootID] = $rootID;
-            }
-            // If it has been published and is in archive now...
-            if ($pageRecord['t3ver_wsid'] == 0) {
-                $this->recStats['versions_liveWS']['pages'][$rootID] = $rootID;
-            }
-            // If it doesn't belong to a workspace...
-            if (!isset($this->workspaceIndex[$pageRecord['t3ver_wsid']])) {
-                $this->recStats['versions_lost_workspace']['pages'][$rootID] = $rootID;
-            }
-            // In case the rootID is a version inside a versioned page
-            if ($rootIsVersion == 2) {
-                $this->recStats['versions_inside_versioned_page']['pages'][$rootID] = $rootID;
-            }
-        }
-        if ($echoLevel > 0) {
-            echo LF . $accumulatedPath . ' [' . $rootID . ']' . ($pageRecord['deleted'] ? ' (DELETED)' : '') . ($this->recStats['versions_published']['pages'][$rootID] ? ' (PUBLISHED)' : '');
-        }
-        if ($echoLevel > 1 && $this->recStats['versions_lost_workspace']['pages'][$rootID]) {
-            echo LF . '        ERROR! This version belongs to non-existing workspace (' . $pageRecord['t3ver_wsid'] . ')!';
-        }
-        if ($echoLevel > 1 && $this->recStats['versions_inside_versioned_page']['pages'][$rootID]) {
-            echo LF . '        WARNING! This version is inside an already versioned page or branch!';
-        }
-        // Call back:
-        if ($callBack) {
-            $this->{$callBack}('pages', $rootID, $echoLevel, $versionSwapmode, $rootIsVersion);
-        }
-        // Traverse tables of records that belongs to page:
-        foreach ($GLOBALS['TCA'] as $tableName => $cfg) {
-            if ($tableName !== 'pages') {
-                // Select all records belonging to page:
-                $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
-                    ->getQueryBuilderForTable($tableName);
-
-                $queryBuilder->getRestrictions()->removeAll();
-
-                $queryBuilder
-                    ->select('uid')
-                    ->from($tableName)
-                    ->where(
-                        $queryBuilder->expr()->eq(
-                            'pid',
-                            $queryBuilder->createNamedParameter($rootID, \PDO::PARAM_INT)
-                        )
-                    );
-
-                if ($GLOBALS['TCA'][$tableName]['ctrl']['delete']) {
-                    $queryBuilder->addSelect($GLOBALS['TCA'][$tableName]['ctrl']['delete']);
-                }
-
-                if (!$this->genTree_traverseDeleted) {
-                    $queryBuilder->getRestrictions()->add(DeletedRestriction::class);
-                }
-
-                $result = $queryBuilder->execute();
-
-                $count = $result->rowCount();
-                if ($count) {
-                    if ($echoLevel == 2) {
-                        echo LF . '    \\-' . $tableName . ' (' . $count . ')';
-                    }
-                }
-                while ($rowSub = $result->fetch()) {
-                    if ($echoLevel == 3) {
-                        echo LF . '    \\-' . $tableName . ':' . $rowSub['uid'];
-                    }
-                    // If the rootID represents an "element" or "page" version type, we must check if the record from this table is allowed to belong to this:
-                    if ($versionSwapmode) {
-                        // This is illegal records under a versioned page - therefore not registered in $this->recStats['all'] so they should be orphaned:
-                        $this->recStats['illegal_record_under_versioned_page'][$tableName][$rowSub['uid']] = $rowSub['uid'];
-                        if ($echoLevel > 1) {
-                            echo LF . '                ERROR! Illegal record (' . $tableName . ':' . $rowSub['uid'] . ') under versioned page!';
-                        }
-                    } else {
-                        $this->recStats['all'][$tableName][$rowSub['uid']] = $rowSub['uid'];
-                        // Register deleted:
-                        if ($GLOBALS['TCA'][$tableName]['ctrl']['delete'] && $rowSub[$GLOBALS['TCA'][$tableName]['ctrl']['delete']]) {
-                            $this->recStats['deleted'][$tableName][$rowSub['uid']] = $rowSub['uid'];
-                            if ($echoLevel == 3) {
-                                echo ' (DELETED)';
-                            }
-                        }
-                        // Check location of records regarding tree root:
-                        if (!$GLOBALS['TCA'][$tableName]['ctrl']['rootLevel'] && $rootID == 0) {
-                            $this->recStats['misplaced_at_rootlevel'][$tableName][$rowSub['uid']] = $rowSub['uid'];
-                            if ($echoLevel > 1) {
-                                echo LF . '            ERROR! Misplaced record (' . $tableName . ':' . $rowSub['uid'] . ') on rootlevel!';
-                            }
-                        }
-                        if ($GLOBALS['TCA'][$tableName]['ctrl']['rootLevel'] == 1 && $rootID > 0) {
-                            $this->recStats['misplaced_inside_tree'][$tableName][$rowSub['uid']] = $rowSub['uid'];
-                            if ($echoLevel > 1) {
-                                echo LF . '            ERROR! Misplaced record (' . $tableName . ':' . $rowSub['uid'] . ') inside page tree!';
-                            }
-                        }
-                        // Traverse plugins:
-                        if ($callBack) {
-                            $this->{$callBack}($tableName, $rowSub['uid'], $echoLevel, $versionSwapmode, $rootIsVersion);
-                        }
-                        // Add any versions of those records:
-                        if ($this->genTree_traverseVersions) {
-                            $versions = BackendUtility::selectVersionsOfRecord($tableName, $rowSub['uid'], 'uid,t3ver_wsid,t3ver_count' . ($GLOBALS['TCA'][$tableName]['ctrl']['delete'] ? ',' . $GLOBALS['TCA'][$tableName]['ctrl']['delete'] : ''), null, true);
-                            if (is_array($versions)) {
-                                foreach ($versions as $verRec) {
-                                    if (!$verRec['_CURRENT_VERSION']) {
-                                        if ($echoLevel == 3) {
-                                            echo LF . '                \\-[#OFFLINE VERSION: WS#' . $verRec['t3ver_wsid'] . '/Cnt:' . $verRec['t3ver_count'] . '] ' . $tableName . ':' . $verRec['uid'] . ')';
-                                        }
-                                        $this->recStats['all'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                        // Register deleted:
-                                        if ($GLOBALS['TCA'][$tableName]['ctrl']['delete'] && $verRec[$GLOBALS['TCA'][$tableName]['ctrl']['delete']]) {
-                                            $this->recStats['deleted'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                            if ($echoLevel == 3) {
-                                                echo ' (DELETED)';
-                                            }
-                                        }
-                                        // Register version:
-                                        $this->recStats['versions'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                        if ($verRec['t3ver_count'] >= 1 && $verRec['t3ver_wsid'] == 0) {
-                                            // Only register published versions in LIVE workspace (published versions in draft workspaces are allowed)
-                                            $this->recStats['versions_published'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                            if ($echoLevel == 3) {
-                                                echo ' (PUBLISHED)';
-                                            }
-                                        }
-                                        if ($verRec['t3ver_wsid'] == 0) {
-                                            $this->recStats['versions_liveWS'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                        }
-                                        if (!isset($this->workspaceIndex[$verRec['t3ver_wsid']])) {
-                                            $this->recStats['versions_lost_workspace'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                            if ($echoLevel > 1) {
-                                                echo LF . '            ERROR! Version (' . $tableName . ':' . $verRec['uid'] . ') belongs to non-existing workspace (' . $verRec['t3ver_wsid'] . ')!';
-                                            }
-                                        }
-                                        // In case we are inside a versioned branch, there should not exists versions inside that "branch".
-                                        if ($versionSwapmode) {
-                                            $this->recStats['versions_inside_versioned_page'][$tableName][$verRec['uid']] = $verRec['uid'];
-                                            if ($echoLevel > 1) {
-                                                echo LF . '            ERROR! This version (' . $tableName . ':' . $verRec['uid'] . ') is inside an already versioned page or branch!';
-                                            }
-                                        }
-                                        // Traverse plugins:
-                                        if ($callBack) {
-                                            $this->{$callBack}($tableName, $verRec['uid'], $echoLevel, $versionSwapmode, $rootIsVersion);
-                                        }
-                                    }
-                                }
-                            }
-                            unset($versions);
-                        }
-                    }
-                }
-            }
-        }
-        unset($resSub);
-        unset($rowSub);
-        // Find subpages to root ID and traverse (only when rootID is not a version or is a branch-version):
-        if ($depth > 0) {
-            $depth--;
-            $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
-                ->getQueryBuilderForTable('pages');
-
-            $queryBuilder->getRestrictions()->removeAll();
-            if (!$this->genTree_traverseDeleted) {
-                $queryBuilder->getRestrictions()->add(DeletedRestriction::class);
-            }
-
-            $queryBuilder
-                ->select('uid')
-                ->from('pages')
-                ->where(
-                    $queryBuilder->expr()->eq(
-                        'pid',
-                        $queryBuilder->createNamedParameter($rootID, \PDO::PARAM_INT)
-                    )
-                )
-                ->orderBy('sorting');
-
-            $result = $queryBuilder->execute();
-            while ($row = $result->fetch()) {
-                $this->genTree_traverse($row['uid'], $depth, $echoLevel, $callBack, $versionSwapmode, 0, $accumulatedPath);
-            }
-        }
-        // Add any versions of pages
-        if ($rootID > 0 && $this->genTree_traverseVersions) {
-            $versions = BackendUtility::selectVersionsOfRecord('pages', $rootID, 'uid,t3ver_oid,t3ver_wsid,t3ver_count', null, true);
-            if (is_array($versions)) {
-                foreach ($versions as $verRec) {
-                    if (!$verRec['_CURRENT_VERSION']) {
-                        $this->genTree_traverse($verRec['uid'], $depth, $echoLevel, $callBack, true, $versionSwapmode ? 2 : 1, $accumulatedPath . ' [#OFFLINE VERSION: WS#' . $verRec['t3ver_wsid'] . '/Cnt:' . $verRec['t3ver_count'] . ']');
-                    }
-                }
-            }
-        }
-    }
-
-    /**************************
-     *
-     * Helper functions
-     *
-     *************************/
-    /**
-     * Compile info-string
-     *
-     * @param array $rec Input record from sys_refindex
-     * @return string String identifying the main record of the reference
-     */
-    public function infoStr($rec)
-    {
-        return $rec['tablename'] . ':' . $rec['recuid'] . ':' . $rec['field'] . ':' . $rec['flexpointer'] . ':' . $rec['softref_key'] . ($rec['deleted'] ? ' (DELETED)' : '');
-    }
-}
diff --git a/typo3/sysext/lowlevel/ext_localconf.php b/typo3/sysext/lowlevel/ext_localconf.php
deleted file mode 100644 (file)
index 397b280..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-defined('TYPO3_MODE') or die();
-
-if (TYPO3_MODE === 'BE') {
-    // Setting up scripts that can be run from the cli_dispatch.phpsh script.
-    // Using cliKeys is deprecated as of TYPO3 v8 and will be removed in TYPO3 v9, use Configuration/Commands.php instead
-    $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']['lowlevel_cleaner'] = [
-        function () {
-            $cleanerObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Lowlevel\CleanerCommand::class);
-            $cleanerObj->cli_main($_SERVER['argv']);
-        }
-    ];
-}
index 6f74803..5a18781 100644 (file)
@@ -1,17 +1,6 @@
 <?php
 defined('TYPO3_MODE') or die();
 
-// Register the Scheduler as a possible key for CLI calls
-// Using cliKeys is deprecated as of TYPO3 v8 and will be removed in TYPO3 v9, use Configuration/Commands.php instead
-$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']['scheduler'] = [
-    function ($input, $output) {
-        $app = new \Symfony\Component\Console\Application('TYPO3 Scheduler', TYPO3_version);
-        $app->add(new \TYPO3\CMS\Scheduler\Command\SchedulerCommand('scheduler'));
-        $app->setDefaultCommand('scheduler');
-        $app->run($input, $output);
-    }
-];
-
 // Get the extensions's configuration
 $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['scheduler'], ['allowed_classes' => false]);
 // If sample tasks should be shown,