PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB` getConfigDirs()); } /** * Get potential home config directory paths. * * Returns `~/.psysh`, `%APPDATA%/PsySH` (when on Windows), and the * XDG Base Directory home config directory: * * http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html * * @return string[] */ public static function getHomeConfigDirs() { $xdg = new Xdg(); return self::getDirNames([$xdg->getHomeConfigDir()]); } /** * Get the current home config directory. * * Returns the highest precedence home config directory which actually * exists. If none of them exists, returns the highest precedence home * config directory (`%APPDATA%/PsySH` on Windows, `~/.config/psysh` * everywhere else). * * @see self::getHomeConfigDirs * * @return string */ public static function getCurrentConfigDir() { $configDirs = self::getHomeConfigDirs(); foreach ($configDirs as $configDir) { if (@\is_dir($configDir)) { return $configDir; } } return $configDirs[0]; } /** * Find real config files in config directories. * * @param string[] $names Config file names * @param string $configDir Optionally use a specific config directory * * @return string[] */ public static function getConfigFiles(array $names, $configDir = null) { $dirs = ($configDir === null) ? self::getConfigDirs() : [$configDir]; return self::getRealFiles($dirs, $names); } /** * Get potential data directory paths. * * If a `dataDir` option was explicitly set, returns an array containing * just that directory. * * Otherwise, it returns `~/.psysh` and all XDG Base Directory data directories: * * http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html * * @return string[] */ public static function getDataDirs() { $xdg = new Xdg(); return self::getDirNames($xdg->getDataDirs()); } /** * Find real data files in config directories. * * @param string[] $names Config file names * @param string $dataDir Optionally use a specific config directory * * @return string[] */ public static function getDataFiles(array $names, $dataDir = null) { $dirs = ($dataDir === null) ? self::getDataDirs() : [$dataDir]; return self::getRealFiles($dirs, $names); } /** * Get a runtime directory. * * Defaults to `/psysh` inside the system's temp dir. * * @return string */ public static function getRuntimeDir() { $xdg = new Xdg(); \set_error_handler([ErrorException::class, 'throwException']); try { // XDG doesn't really work on Windows, sometimes complains about // permissions, sometimes tries to remove non-empty directories. // It's a bit flaky. So we'll give this a shot first... $runtimeDir = $xdg->getRuntimeDir(false); } catch (\Exception $e) { // Well. That didn't work. Fall back to a boring old folder in the // system temp dir. $runtimeDir = \sys_get_temp_dir(); } \restore_error_handler(); return \strtr($runtimeDir, '\\', '/') . '/psysh'; } private static function getDirNames(array $baseDirs) { $dirs = \array_map(function ($dir) { return \strtr($dir, '\\', '/') . '/psysh'; }, $baseDirs); // Add ~/.psysh if (isset($_SERVER['HOME']) && $_SERVER['HOME']) { $dirs[] = \strtr($_SERVER['HOME'], '\\', '/') . '/.psysh'; } // Add some Windows specific ones :) if (\defined('PHP_WINDOWS_VERSION_MAJOR')) { if (isset($_SERVER['APPDATA']) && $_SERVER['APPDATA']) { // AppData gets preference \array_unshift($dirs, \strtr($_SERVER['APPDATA'], '\\', '/') . '/PsySH'); } $dir = \strtr($_SERVER['HOMEDRIVE'] . '/' . $_SERVER['HOMEPATH'], '\\', '/') . '/.psysh'; if (!\in_array($dir, $dirs)) { $dirs[] = $dir; } } return $dirs; } private static function getRealFiles(array $dirNames, array $fileNames) { $files = []; foreach ($dirNames as $dir) { foreach ($fileNames as $name) { $file = $dir . '/' . $name; if (@\is_file($file)) { $files[] = $file; } } } return $files; } /** * Ensure that $dir exists and is writable. * * Generates E_USER_NOTICE error if the directory is not writable or creatable. * * @param string $dir * * @return bool False if directory exists but is not writeable, or cannot be created */ public static function ensureDir($dir) { if (!\is_dir($dir)) { // Just try making it and see if it works @\mkdir($dir, 0700, true); } if (!\is_dir($dir) || !\is_writable($dir)) { \trigger_error(\sprintf('Writing to %s is not allowed.', $dir), E_USER_NOTICE); return false; } return true; } /** * Ensure that $file exists and is writable, make the parent directory if necessary. * * Generates E_USER_NOTICE error if either $file or its directory is not writable. * * @param string $file * * @return string|false Full path to $file, or false if file is not writable */ public static function touchFileWithMkdir($file) { if (\file_exists($file)) { if (\is_writable($file)) { return $file; } \trigger_error(\sprintf('Writing to %s is not allowed.', $file), E_USER_NOTICE); return false; } if (!self::ensureDir(\dirname($file))) { return false; } \touch($file); return $file; } }