[TYPO3-core] RFC: Bug / Feature #5838: Get cli_dispatch.phpsh to work on windows platforms
Martin Kutschker
Martin.Kutschker at n0spam-blackbox.net
Fri Feb 22 14:58:03 CET 2008
REMINDER #2
[it's a bug so this will come into 4.2 anyway, right?]
Martin Kutschker schrieb:
> REMINDER
>
> Problem:
> It is not possible to run a cli script using cli_dispatch.phpsh, if the
> server is windows.
>
> Solution:
> Improve path handling.
>
> Martin Kutschker schrieb:
>> Martin Kutschker schrieb:
>>> Andreas Otto schrieb:
>>>> Hi Martin,
>>>>
>>>> Martin Kutschker wrote:
>>>>> Please wait a bit, because I'll want to have a closer look a Dmitry's
>>>>> getcwd() idea.
>>>>
>>>> OK.
>>>
>>> This code works on Windows even with relative paths. Note that
>>> $_SERVER['PWD'] is used because of getcwd() issues on some *nix systems.
>>>
>>> $relativePath = FALSE;
>>> if (stristr(PHP_OS,'win')&&!stristr(PHP_OS,'darwin')) {
>>> if (!preg_match('/^([A-Z]:)?\\/', $temp_PATH_thisScript)) {
>>> $relativePath = TRUE;
>>> }
>>> } else {
>>> if ($temp_PATH_thisScript{0} != '/') {
>>> $relativePath = TRUE;
>>> }
>>> }
>>>
>>> if ($relativePath) {
>>> $wd = $_SERVER['PWD'] ? $_SERVER['PWD'] : getcwd();
>>> if ($wd) {
>>> $temp_PATH_thisScript =
>>> $wd.'/'.ereg_replace('\.\/','',$temp_PATH_thisScript);
>>> if (!@is_file($temp_PATH_thisScript)) {
>>> die ('relative path found and an error occured during resolving
>>> of the absolute path. $temp_PATH_thisScript');
>>> }
>>> } else {
>>> die ('relative path found, but resolving absolute path is not
>>> supported on this platform.');
>>> }
>>> }
>>> define('PATH_thisScript',$temp_PATH_thisScript);
>>
>> Here is the change as diff. I have also added a copyright claim and
>> the SVN tag.
>>
>> Masi
>>
>>
>> ------------------------------------------------------------------------
>>
>> Index: typo3/cli_dispatch.phpsh
>> ===================================================================
>> --- typo3/cli_dispatch.phpsh (revision 3159)
>> +++ typo3/cli_dispatch.phpsh (working copy)
>> @@ -1,12 +1,43 @@
>> #! /usr/bin/php -q
>> <?php
>> +/***************************************************************
>> +* Copyright notice
>> +*
>> +* (c) 2005-2008 Kasper Skaarhoj (kasperYYYY at typo3.com)
>> +* All rights reserved
>> +*
>> +* This script is part of the TYPO3 project. The TYPO3 project is
>> +* free software; you can redistribute it and/or modify
>> +* it under the terms of the GNU General Public License as published by
>> +* the Free Software Foundation; either version 2 of the License, or
>> +* (at your option) any later version.
>> +*
>> +* The GNU General Public License can be found at
>> +* http://www.gnu.org/copyleft/gpl.html.
>> +* A copy is found in the textfile GPL.txt and important notices to
>> the license
>> +* from the author is found in LICENSE.txt distributed with these
>> scripts.
>> +*
>> +*
>> +* This script is distributed in the hope that it will be useful,
>> +* but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> +* GNU General Public License for more details.
>> +*
>> +* This copyright notice MUST APPEAR in all copies of the script!
>> +***************************************************************/
>>
>> -// *****************************************
>> -// CLI module dispatcher.
>> -// This script can take a "cliKey" as first argument and uses that to
>> look up the path of the script to include in the end.
>> -// See configuration of this feature in
>> $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys']
>> -// The point is to have only ONE script dealing with the environment
>> initialization while the actual processing is all a developer should
>> care for.
>> -// *****************************************
>> +/**
>> + * Command Line Interface module dispatcher
>> + *
>> + * $Id: cli_dispatch.phpsh 2665 2007-11-05 19:38:07Z ingmars $
>> + *
>> + * @author Kasper Skaarhoj <kasperYYYY at typo3.com>
>> + *
>> + * This script takes a "cliKey" as first argument and uses that to
>> look up the path of the script to include in the end.
>> + * See configuration of this feature in
>> $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys'].
>> + * The point is to have only ONE script dealing with the environment
>> initialization while the actual processing is all a developer should
>> care for.
>> + *
>> + */
>>
>> if (PHP_SAPI!='cli') {
>> die('ERROR: Not called from a command line interface (eg. a shell
>> or scheduler).'.chr(10));
>> @@ -15,18 +46,39 @@
>> // Defining circumstances for CLI mode:
>> define('TYPO3_cliMode', TRUE);
>>
>> - // Defining PATH_thisScript here: Must be the ABSOLUTE path of
>> this script in the right context:
>> - // This will work as long as the script is called by it's
>> absolute path!
>> -$temp_PATH_thisScript = isset($_SERVER['argv'][0]) ?
>> $_SERVER['argv'][0] : (isset($_ENV['_']) ? $_ENV['_'] : $_SERVER['_']);
>> + // Get path to this script
>> +$temp_PATH_thisScript = isset($_SERVER['argv'][0]) ?
>> $_SERVER['argv'][0] : (isset($_ENV['_']) ? $_ENV['
>> +_'] : $_SERVER['_']);
>>
>> - // Alternatively, in some environments, we might be able to
>> figure out the absolute path (with no "../" and "./" in) from
>> environment variables...
>> -if ($temp_PATH_thisScript{0}!='/') {
>> - $temp_CURRENT_DIR = $_SERVER['PWD'].'/';
>> - $temp_PATH_thisScript =
>> $temp_CURRENT_DIR.ereg_replace('\.\/','',$temp_PATH_thisScript);
>> + // Figure out if the path is relative
>> +$relativePath = FALSE;
>> +if (stristr(PHP_OS,'win') && !stristr(PHP_OS,'darwin')) {
>> + // Windows
>> + if (!preg_match('/^([A-Z]:)?\\/', $temp_PATH_thisScript)) {
>> + $relativePath = TRUE;
>> + }
>> +} else {
>> + // *nix, et al
>> + if ($temp_PATH_thisScript{0} != '/') {
>> + $relativePath = TRUE;
>> + }
>> +}
>> +
>> + // Resolve path
>> +if ($relativePath) {
>> + $workingDirectory = $_SERVER['PWD'] ? $_SERVER['PWD'] : getcwd();
>> + if ($workingDirectory) {
>> + $temp_PATH_thisScript =
>> +
>> $workingDirectory.'/'.ereg_replace('\.\/','',$temp_PATH_thisScript);
>> if (!@is_file($temp_PATH_thisScript)) {
>> - die(wordwrap('ERROR: '.$temp_PATH_thisScript.' was not a
>> file. Maybe your environment does not support running this script with
>> a relative path? Try to run the script with its absolute path and you
>> should be fine.'.chr(10).chr(10)));
>> + die ('Relative path found, but an error occured during
>> resolving of the absolute path: '.$temp_PATH_thisScript);
>> }
>> + } else {
>> + die ('Relative path found, but resolving absolute path is not
>> supported on this platform.');
>> + }
>> }
>> +
>> + // Define absolute path to this script
>> define('PATH_thisScript',$temp_PATH_thisScript);
>>
>> // First argument is a key that points to the script configuration
>> @@ -38,7 +90,7 @@
>> if (defined('TYPO3_cliInclude')) {
>> include(TYPO3_cliInclude);
>> } else {
>> - echo 'ERROR: Nothing to include.'.chr(10);
>> - exit;
>> + die('No include file configured for key "'.TYPO3_cliKey.'".');
>> }
>> -?>
>> \ No newline at end of file
>> +
>> +?>
>>
>>
>> ------------------------------------------------------------------------
>>
>> Index: typo3/cli_dispatch.phpsh
>> ===================================================================
>> --- typo3/cli_dispatch.phpsh (revision 3159)
>> +++ typo3/cli_dispatch.phpsh (working copy)
>> @@ -1,32 +1,84 @@
>> #! /usr/bin/php -q
>> <?php
>> +/***************************************************************
>> +* Copyright notice
>> +*
>> +* (c) 2005-2008 Kasper Skaarhoj (kasperYYYY at typo3.com)
>> +* All rights reserved
>> +*
>> +* This script is part of the TYPO3 project. The TYPO3 project is
>> +* free software; you can redistribute it and/or modify
>> +* it under the terms of the GNU General Public License as published by
>> +* the Free Software Foundation; either version 2 of the License, or
>> +* (at your option) any later version.
>> +*
>> +* The GNU General Public License can be found at
>> +* http://www.gnu.org/copyleft/gpl.html.
>> +* A copy is found in the textfile GPL.txt and important notices to
>> the license
>> +* from the author is found in LICENSE.txt distributed with these
>> scripts.
>> +*
>> +*
>> +* This script is distributed in the hope that it will be useful,
>> +* but WITHOUT ANY WARRANTY; without even the implied warranty of
>> +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> +* GNU General Public License for more details.
>> +*
>> +* This copyright notice MUST APPEAR in all copies of the script!
>> +***************************************************************/
>>
>> -// *****************************************
>> -// CLI module dispatcher.
>> -// This script can take a "cliKey" as first argument and uses that to
>> look up the path of the script to include in the end.
>> -// See configuration of this feature in
>> $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys']
>> -// The point is to have only ONE script dealing with the environment
>> initialization while the actual processing is all a developer should
>> care for.
>> -// *****************************************
>> +/**
>> + * Command Line Interface module dispatcher
>> + *
>> + * $Id: cli_dispatch.phpsh 2665 2007-11-05 19:38:07Z ingmars $
>> + *
>> + * @author Kasper Skaarhoj <kasperYYYY at typo3.com>
>> + *
>> + * This script takes a "cliKey" as first argument and uses that to
>> look up the path of the script to include in the end.
>> + * See configuration of this feature in
>> $TYPO3_CONF_VARS['SC_OPTIONS']['GLOBAL']['cliKeys'].
>> + * The point is to have only ONE script dealing with the environment
>> initialization while the actual processing is all a developer should
>> care for.
>> + *
>> + */
>>
>> -if (PHP_SAPI!='cli') {
>> +if (PHP_SAPI!='cli') {
>> die('ERROR: Not called from a command line interface (eg. a shell
>> or scheduler).'.chr(10));
>> }
>>
>> // Defining circumstances for CLI mode:
>> define('TYPO3_cliMode', TRUE);
>>
>> - // Defining PATH_thisScript here: Must be the ABSOLUTE path of
>> this script in the right context:
>> - // This will work as long as the script is called by it's
>> absolute path!
>> -$temp_PATH_thisScript = isset($_SERVER['argv'][0]) ?
>> $_SERVER['argv'][0] : (isset($_ENV['_']) ? $_ENV['_'] : $_SERVER['_']);
>> + // Get path to this script
>> +$temp_PATH_thisScript = isset($_SERVER['argv'][0]) ?
>> $_SERVER['argv'][0] : (isset($_ENV['_']) ? $_ENV['
>> +_'] : $_SERVER['_']);
>>
>> - // Alternatively, in some environments, we might be able to
>> figure out the absolute path (with no "../" and "./" in) from
>> environment variables...
>> -if ($temp_PATH_thisScript{0}!='/') {
>> - $temp_CURRENT_DIR = $_SERVER['PWD'].'/';
>> - $temp_PATH_thisScript =
>> $temp_CURRENT_DIR.ereg_replace('\.\/','',$temp_PATH_thisScript);
>> - if (!@is_file($temp_PATH_thisScript)) {
>> - die(wordwrap('ERROR: '.$temp_PATH_thisScript.' was not a
>> file. Maybe your environment does not support running this script with
>> a relative path? Try to run the script with its absolute path and you
>> should be fine.'.chr(10).chr(10)));
>> + // Figure out if the path is relative
>> +$relativePath = FALSE;
>> +if (stristr(PHP_OS,'win') && !stristr(PHP_OS,'darwin')) {
>> + // Windows
>> + if (!preg_match('/^([A-Z]:)?\\/', $temp_PATH_thisScript)) {
>> + $relativePath = TRUE;
>> }
>> +} else {
>> + // *nix, et al
>> + if ($temp_PATH_thisScript{0} != '/') {
>> + $relativePath = TRUE;
>> + }
>> }
>> +
>> + // Resolve path
>> +if ($relativePath) {
>> + $workingDirectory = $_SERVER['PWD'] ? $_SERVER['PWD'] : getcwd();
>> + if ($workingDirectory) {
>> + $temp_PATH_thisScript =
>> +
>> $workingDirectory.'/'.ereg_replace('\.\/','',$temp_PATH_thisScript);
>> + if (!@is_file($temp_PATH_thisScript)) {
>> + die ('Relative path found, but an error occured during
>> resolving of the absolute path: '.$temp_PATH_thisScript);
>> + }
>> + } else {
>> + die ('Relative path found, but resolving absolute path is not
>> supported on this platform.');
>> + }
>> +}
>> +
>> + // Define absolute path to this script
>> define('PATH_thisScript',$temp_PATH_thisScript);
>>
>> // First argument is a key that points to the script configuration
>> @@ -35,10 +87,10 @@
>> // Include init file:
>> require(dirname(PATH_thisScript).'/init.php');
>>
>> -if (defined('TYPO3_cliInclude')) {
>> +if (defined('TYPO3_cliInclude')) {
>> include(TYPO3_cliInclude);
>> } else {
>> - echo 'ERROR: Nothing to include.'.chr(10);
>> - exit;
>> + die('No include file configured for key "'.TYPO3_cliKey.'".');
>> }
>> -?>
>> \ No newline at end of file
>> +
>> +?>
More information about the TYPO3-team-core
mailing list