| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | #!/usr/bin/env php
 | 
					
						
							|  |  |  | <?php | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social 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 Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Description of this file. | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |  * @package   samples | 
					
						
							|  |  |  |  * @author    Diogo Cordeiro <diogo@fc.up.pt> | 
					
						
							|  |  |  |  * @copyright 2019 Free Software Foundation, Inc http://www.fsf.org | 
					
						
							|  |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-15 04:10:29 +01:00
										 |  |  | define('INSTALLDIR', dirname(__DIR__)); | 
					
						
							|  |  |  | define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | define('GNUSOCIAL', true); | 
					
						
							|  |  |  | define('STATUSNET', true); | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-23 13:36:02 +01:00
										 |  |  | require_once INSTALLDIR . '/lib/util/common.php'; | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | // Try to find an autoloader for a local psysh version.
 | 
					
						
							|  |  |  | // We'll wrap this whole mess in a Closure so it doesn't leak any globals.
 | 
					
						
							|  |  |  | call_user_func(function () { | 
					
						
							|  |  |  |     $cwd = null; | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |     // Find the cwd arg (if present)
 | 
					
						
							|  |  |  |     $argv = isset($_SERVER['argv']) ? $_SERVER['argv'] : array(); | 
					
						
							|  |  |  |     foreach ($argv as $i => $arg) { | 
					
						
							|  |  |  |         if ($arg === '--cwd') { | 
					
						
							|  |  |  |             if ($i >= count($argv) - 1) { | 
					
						
							|  |  |  |                 echo 'Missing --cwd argument.' . PHP_EOL; | 
					
						
							|  |  |  |                 exit(1); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $cwd = $argv[$i + 1]; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |         if (preg_match('/^--cwd=/', $arg)) { | 
					
						
							|  |  |  |             $cwd = substr($arg, 6); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |     // Or fall back to the actual cwd
 | 
					
						
							|  |  |  |     if (!isset($cwd)) { | 
					
						
							|  |  |  |         $cwd = getcwd(); | 
					
						
							| 
									
										
										
										
											2009-11-17 17:09:31 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |     $cwd = str_replace('\\', '/', $cwd); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $chunks = explode('/', $cwd); | 
					
						
							|  |  |  |     while (!empty($chunks)) { | 
					
						
							|  |  |  |         $path = implode('/', $chunks); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Find composer.json
 | 
					
						
							|  |  |  |         if (is_file($path . '/composer.json')) { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |             if (!empty($cfg = json_decode( | 
					
						
							|  |  |  |                 file_get_contents($path . '/composer.json'), | 
					
						
							|  |  |  |                 true | 
					
						
							|  |  |  |             ))) { | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |                 if (isset($cfg['name']) && $cfg['name'] === 'psy/psysh') { | 
					
						
							|  |  |  |                     // We're inside the psysh project. Let's use the local
 | 
					
						
							|  |  |  |                     // Composer autoload.
 | 
					
						
							|  |  |  |                     if (is_file($path . '/vendor/autoload.php')) { | 
					
						
							|  |  |  |                         require $path . '/vendor/autoload.php'; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     return; | 
					
						
							| 
									
										
										
										
											2010-01-25 09:41:40 -08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2009-11-17 17:09:31 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |         // Or a composer.lock
 | 
					
						
							|  |  |  |         if (is_file($path . '/composer.lock')) { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |             if (!empty($cfg = json_decode( | 
					
						
							|  |  |  |                 file_get_contents($path . '/composer.lock'), | 
					
						
							|  |  |  |                 true | 
					
						
							|  |  |  |             ))) { | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |                 foreach (array_merge($cfg['packages'], $cfg['packages-dev']) as $pkg) { | 
					
						
							|  |  |  |                     if (isset($pkg['name']) && $pkg['name'] === 'psy/psysh') { | 
					
						
							|  |  |  |                         // We're inside a project which requires psysh. We'll
 | 
					
						
							|  |  |  |                         // use the local Composer autoload.
 | 
					
						
							|  |  |  |                         if (is_file($path . '/vendor/autoload.php')) { | 
					
						
							|  |  |  |                             require $path . '/vendor/autoload.php'; | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                         return; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |         array_pop($chunks); | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // We didn't find an autoloader for a local version, so use the autoloader that
 | 
					
						
							|  |  |  | // came with this script.
 | 
					
						
							|  |  |  | if (!class_exists('Psy\Shell')) { | 
					
						
							|  |  |  |     /* <<< */ | 
					
						
							|  |  |  |     if (is_file(__DIR__ . '/../vendor/autoload.php')) { | 
					
						
							|  |  |  |         require __DIR__ . '/../vendor/autoload.php'; | 
					
						
							|  |  |  |     } elseif (is_file(__DIR__ . '/../../../autoload.php')) { | 
					
						
							|  |  |  |         require __DIR__ . '/../../../autoload.php'; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         echo 'PsySH dependencies not found, be sure to run `composer install`.' . PHP_EOL; | 
					
						
							|  |  |  |         echo 'See https://getcomposer.org to get Composer.' . PHP_EOL; | 
					
						
							|  |  |  |         exit(1); | 
					
						
							| 
									
										
										
										
											2009-12-14 11:51:38 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |     /* >>> */ | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | // If the psysh binary was included directly, assume they just wanted an
 | 
					
						
							|  |  |  | // autoloader and bail early.
 | 
					
						
							|  |  |  | if (version_compare(PHP_VERSION, '5.3.6', '<')) { | 
					
						
							|  |  |  |     $trace = debug_backtrace(); | 
					
						
							|  |  |  | } elseif (version_compare(PHP_VERSION, '5.4.0', '<')) { | 
					
						
							|  |  |  |     $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  |     $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | if (Psy\Shell::isIncluded($trace)) { | 
					
						
							|  |  |  |     unset($trace); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return; | 
					
						
							| 
									
										
										
										
											2009-12-14 11:51:38 -08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Clean up after ourselves.
 | 
					
						
							|  |  |  | unset($trace); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // If the local version is too old, we can't do this
 | 
					
						
							|  |  |  | if (!function_exists('Psy\bin')) { | 
					
						
							|  |  |  |     $argv = $_SERVER['argv']; | 
					
						
							|  |  |  |     $first = array_shift($argv); | 
					
						
							|  |  |  |     if (preg_match('/php(\.exe)?$/', $first)) { | 
					
						
							|  |  |  |         array_shift($argv); | 
					
						
							| 
									
										
										
										
											2009-12-14 11:51:38 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  |     array_unshift($argv, 'vendor/bin/psysh'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     echo 'A local PsySH dependency was found, but it cannot be loaded. Please update to' . PHP_EOL; | 
					
						
							|  |  |  |     echo 'the latest version, or run the local copy directly, e.g.:' . PHP_EOL; | 
					
						
							|  |  |  |     echo PHP_EOL; | 
					
						
							|  |  |  |     echo '    ' . implode(' ', $argv) . PHP_EOL; | 
					
						
							|  |  |  |     exit(1); | 
					
						
							| 
									
										
										
										
											2009-11-06 14:31:39 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-06-23 17:59:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | // And go!
 | 
					
						
							|  |  |  | call_user_func(Psy\bin()); |