Chris@18: finder = new DrupalFinder(); Chris@18: } Chris@18: Chris@18: protected function dumpToFileSystem($fileStructure, $root) Chris@18: { Chris@18: $fileStructure = $this->prepareFileStructure($fileStructure); Chris@18: foreach ($fileStructure as $name => $content) { Chris@18: if (is_array($content)) { Chris@18: mkdir($root . '/' . $name); Chris@18: $this->dumpToFileSystem($content, $root . '/' . $name); Chris@18: } else { Chris@18: file_put_contents($root . '/' . $name, $content); Chris@18: } Chris@18: } Chris@18: } Chris@18: Chris@18: protected function prepareFileStructure($fileStructure) Chris@18: { Chris@18: foreach ($fileStructure as $name => $content) { Chris@18: if (($name === 'composer.json' || $name === 'composer.lock') && is_array($content)) { Chris@18: $fileStructure[$name] = json_encode($content, JSON_UNESCAPED_SLASHES); Chris@18: } elseif (is_array($content)) { Chris@18: $fileStructure[$name] = $this->prepareFileStructure($content); Chris@18: } Chris@18: } Chris@18: return $fileStructure; Chris@18: } Chris@18: Chris@18: protected function tempdir($dir, $prefix = '', $mode = 0700) Chris@18: { Chris@18: if (substr($dir, -1) != '/') { Chris@18: $dir .= '/'; Chris@18: } Chris@18: do { Chris@18: $path = $dir . $prefix . mt_rand(0, 9999999); Chris@18: } while (!mkdir($path, $mode)); Chris@18: register_shutdown_function( Chris@18: [get_called_class(), 'tempdir_remove'], Chris@18: $path Chris@18: ); Chris@18: Chris@18: return realpath($path); Chris@18: } Chris@18: Chris@18: public static function tempdir_remove($path) Chris@18: { Chris@18: if (is_link($path)) { Chris@18: if (defined('PHP_WINDOWS_VERSION_BUILD')) { Chris@18: rmdir($path); Chris@18: } else { Chris@18: unlink($path); Chris@18: } Chris@18: Chris@18: return; Chris@18: } Chris@18: Chris@18: foreach (scandir($path) as $child) { Chris@18: if (in_array($child, ['.', '..'])) { Chris@18: continue; Chris@18: } Chris@18: $child = "$path/$child"; Chris@18: is_dir($child) ? static::tempdir_remove($child) : unlink($child); Chris@18: } Chris@18: rmdir($path); Chris@18: } Chris@18: Chris@18: /** Chris@18: * @param $target Chris@18: * @param $link Chris@18: * Chris@18: * @throws \PHPUnit_Framework_SkippedTestError Chris@18: */ Chris@18: protected function symlink($target, $link) Chris@18: { Chris@18: try { Chris@18: return symlink($target, $link); Chris@18: } catch (Exception $e) { Chris@18: if (defined('PHP_WINDOWS_VERSION_BUILD') Chris@18: && strstr($e->getMessage(), WIN_ERROR_PRIVILEGE_NOT_HELD) Chris@18: ) { Chris@18: $this->markTestSkipped(<<<'MESSAGE' Chris@18: No privilege to create symlinks. Run test as Administrator (elevated process). Chris@18: MESSAGE Chris@18: ); Chris@18: } Chris@18: throw $e; Chris@18: } Chris@18: } Chris@18: } Chris@18: Chris@18: define('WIN_ERROR_PRIVILEGE_NOT_HELD', '1314');