[TYPO3-core] RFC: Bug / Feature #5838: Get cli_dispatch.phpsh to work on windows platforms

Michael Stucki michael at typo3.org
Mon Feb 25 15:17:57 CET 2008


Any Windows users, please test this - it was written for YOU! :-)

- michael

Martin Kutschker wrote:

> 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
>>> +
>>> +?>

-- 
Use a newsreader! Check out
http://typo3.org/community/mailing-lists/use-a-news-reader/


More information about the TYPO3-team-core mailing list