/** * Find named pipe * * @return string or NULL if no file can be found */ protected function locate() { $pipes = '\\\\.\\pipe\\'; // Check well-known pipe name if (file_exists($pipes . 'mysql')) { return $pipes . 'mysql'; } // Locate my.ini in %WINDIR%, C: or the MySQL install dir, the latter of // which we determine by querying the registry using the "REG" tool. do { foreach ([getenv('WINDIR'), 'C:'] as $location) { $ini = new File($location, 'my.ini'); if ($ini->exists()) { break 2; } } exec('reg query "HKLM\\SOFTWARE\\MySQL AB" /s /e /f Location', $out, $ret); if (0 === $ret && 1 === sscanf($out[2], " Location REG_SZ %[^\r]", $location)) { $ini = new File($location, 'my.ini'); break; } return null; } while (0); $options = $this->parse($ini); return isset($options['client']['socket']) ? $pipes . $options['client']['socket'] : null; }
/** * Constructor * * @param io.File file * @throws lang.IllegalArgumentException if the given file does not exist */ public function __construct(File $file) { if (!$file->exists()) { throw new IllegalArgumentException('File "' . $file->getURI() . '" does not exist!'); } $this->file = $file; }
/** * Main * * Exitcodes used: * <ul> * <li>127: Archive referenced in -xar [...] does not exist</li> * <li>126: No manifest or manifest does not have a main-class</li> * </ul> * * @see http://tldp.org/LDP/abs/html/exitcodes.html * @param string[] args * @return int */ public static function main(array $args) { // Open archive $f = new File(array_shift($args)); if (!$f->exists()) { Console::$err->writeLine('*** Cannot find archive ' . $f->getURI()); return 127; } // Register class loader $cl = \lang\ClassLoader::registerLoader(new \lang\archive\ArchiveClassLoader(new Archive($f))); if (!$cl->providesResource(self::MANIFEST)) { Console::$err->writeLine('*** Archive ' . $f->getURI() . ' does not have a manifest'); return 126; } // Load manifest $pr = Properties::fromString($cl->getResource(self::MANIFEST)); if (null === ($class = $pr->readString('archive', 'main-class', null))) { Console::$err->writeLine('*** Archive ' . $f->getURI() . '\'s manifest does not have a main class'); return 126; } // Run main() try { return \lang\XPClass::forName($class, $cl)->getMethod('main')->invoke(null, [$args]); } catch (\lang\reflect\TargetInvocationException $e) { throw $e->getCause(); } }
/** * Constructor * * @param io.File file * @throws lang.IllegalArgumentException if the given file does not exist */ public function __construct(File $file) { $uri = $file->getURI(); $cl = ClassLoader::getDefault()->findUri($uri); if ($cl === null) { throw new IllegalArgumentException('File "' . $uri . ($file->exists() ? '" is not in class path' : '" not found')); } $this->loader = $cl; $this->uri = $uri; }
/** * Locate config file * * @return io.File */ protected function locateConf() { foreach ([getenv('FREETDSCONF'), getenv('HOME') . '/.freetds.conf', '/etc/freetds/freetds.conf', '/etc/freetds.conf', '/usr/local/etc/freetds.conf'] as $location) { if (empty($location)) { continue; } $f = new File($location); if ($f->exists()) { return $f; } } return null; }
/** * Removes a given module version * * @param io.Folder $cwd The working directory * @param io.collections.FileCollection $version The version * @return bool whether the module was active */ protected function remove($cwd, FileCollection $version) { $versioned = basename($version->getURI()); $vendor = basename($version->getOrigin()->getURI()); Console::writeLine('Removing ', $vendor, '/', $versioned, ' -> ', $version); // Remove corresponding .pth file $pth = new File($cwd, '.' . $vendor . '.' . $versioned . '.pth'); if ($pth->exists()) { $active = true; $pth->unlink(); } else { $active = false; } // Remove folder $fld = new Folder($version->getURI()); $fld->unlink(); return $active; }
/** * Execute this action * * @param string[] $args command line args * @return int exit code */ public function perform($args) { if (empty($args)) { Console::$err->writeLine('*** Missing argument #1: Module name'); return 2; } sscanf($args[0], '%[^@]@%s', $name, $version); $module = Module::valueOf($name); $cwd = new Folder('.'); $base = new Folder($cwd, $module->vendor); // No version supplied -> check installation. If the module is already // installed, this is "xpi upgrade"'s job. If we have a version, the user // wants to install in parallel, so pass. if (null === $version) { $f = new File($base, $module->name . '.json'); if ($f->exists()) { Console::$err->writeLine('*** Not changing existing ', $module, '. Use "xpi upgrade"'); return 1; } } // Search for module $request = create(new RestRequest('/vendors/{vendor}/modules/{module}'))->withSegment('vendor', $module->vendor)->withSegment('module', $module->name); try { $info = $this->api->execute($request)->data(); uksort($info['releases'], function ($a, $b) { return version_compare($a, $b, '<'); }); } catch (RestException $e) { Console::$err->writeLine('*** Cannot find module ', $module, ': ', $e->getMessage()); return 3; } // Check newest version if (null === $version) { if (empty($info['releases'])) { Console::$err->writeLine('*** No releases yet for ', $module); return 1; } $version = key($info['releases']); $this->cat && $this->cat->info('Using latest release', $version); } else { if (':' === $version[0]) { $this->cat && $this->cat->info('Using development version', $version); } else { if (!isset($info['releases'][$version])) { Console::$err->writeLine('*** No such release ', $version, ' for ', $module, ', have ', $info['releases']); return 1; } $this->cat && $this->cat->info('Using version', $version); } } // Determine origin and target if (':' === $version[0]) { $branch = substr($version, 1); $target = new Folder($base, $module->name . '@' . $branch); $origin = new GitHubArchive($module->vendor, $module->name, $branch); } else { $target = new Folder($base, $module->name . '@' . $version); $origin = new XarRelease($this->api, $module->vendor, $module->name, $version); } if ($target->exists()) { Console::writeLine($module, ' already exists in ', $target); } else { Console::writeLine($module, ' -> ', $target); try { // Create and fetch into $target->create(0755); $origin->fetchInto($target); // Save module meta data unset($info['releases']); self::$json->encodeTo($info, create(new File($base, $module->name . '.json'))->getOutputStream()); } catch (\lang\Throwable $e) { Console::writeLine('*** ', $e); $target->unlink(); return 2; } } // Deselect any previously selected version foreach (new FilteredIOCollectionIterator(new FileCollection($cwd), new NameMatchesFilter('#^\\.' . $module->vendor . '\\.' . $module->name . '.*\\.pth#')) as $found) { $pth = new File($found->getURI()); Console::writeLine('Deselect ', $pth); $pth->unlink(); } // Rebuild paths based on .pth files found in newly selected $pth = new File('.' . $module->vendor . '.' . strtr($target->dirname, DIRECTORY_SEPARATOR, '.') . '.pth'); $out = $pth->getOutputStream(); $base = strtr(substr($target->getURI(), strlen($cwd->getURI())), DIRECTORY_SEPARATOR, '/'); Console::writeLine('Select ', $pth); foreach (new FilteredIOCollectionIterator(new FileCollection($target), new ExtensionEqualsFilter('.pth')) as $found) { $r = new StringReader($found->getInputStream()); while (null !== ($line = $r->readLine())) { if ('' === $line || '#' === $line[0]) { continue; } else { if ('!' === $line[0]) { $out->write('!' . $base . substr($line, 1) . "\n"); } else { $out->write($base . $line . "\n"); } } } } $out->close(); Console::writeLine('Done'); return 0; }
/** * Execute this action * * @param string[] $args command line args * @return int exit code */ public function perform($args) { $cwd = new FileCollection('.'); // Parse args $i = 1; if ('-r' === $args[0]) { $remote = true; array_shift($args); $i++; } else { if ('-i' === $args[0]) { $remote = false; array_shift($args); $i++; $installed = new File($args[0] . '.json'); } else { $installed = new File($args[0] . '.json'); $remote = !$installed->exists(); } } if (empty($args)) { Console::$err->writeLine('*** Missing argument #', $i, ': Module name'); return 2; } sscanf(rtrim($args[0], '/'), '%[^@]@%s', $name, $version); $module = Module::valueOf($name); // Search for module if ($remote) { Console::writeLine('@', $this->api->getBase()->getURL()); $request = create(new RestRequest('/vendors/{vendor}/modules/{module}'))->withSegment('vendor', $module->vendor)->withSegment('module', $module->name); try { $result = $this->api->execute($request)->data(); } catch (RestException $e) { Console::$err->writeLine('*** Cannot find remote module ', $module, ': ', $e->getMessage()); return 3; } $releases = $result['releases']; } else { Console::writeLine('@', $cwd->getURI()); try { $result = self::$json->decodeFrom($installed->getInputStream()); } catch (IOException $e) { Console::$err->writeLine('*** Cannot find installed module ', $module, ': ', $e->getMessage()); return 3; } $releases = $this->installedReleases($cwd, $module); } Console::writeLine(new Module($result['vendor'], $result['module']), ': ', $result['info']); Console::writeLine($result['link']['url']); uksort($releases, function ($a, $b) { return version_compare($a, $b, '<'); }); Console::writeLine('Releases: ', sizeof($releases), ', list {'); foreach ($releases as $version => $release) { $s = ''; foreach ($release as $key => $value) { $s .= ', ' . $key . '= ' . \xp::stringOf($value); } Console::writeLine(' ', $version, ' (', substr($s, 2), ')'); } Console::writeLine('}'); // List active releases for local queries if (!$remote) { foreach (new FilteredIOCollectionIterator($cwd, new NameMatchesFilter('#^\\.' . $module->vendor . '\\.' . $module->name . '.*\\.pth#')) as $found) { $r = new StringReader($found->getInputStream()); Console::writeLine('Selected: ', basename($found->getURI()), ', class path {'); while (null !== ($line = $r->readLine())) { $resolved = realpath($cwd->getURI() . ltrim($line, '!')); if (is_dir($resolved)) { $cl = \lang\FileSystemClassLoader::instanceFor($resolved, false); } else { if (is_file($resolved)) { $cl = \lang\archive\ArchiveClassLoader::instanceFor($resolved, false); } } Console::writeLine(' ', $cl); } Console::writeLine('}'); } return 0; } }
public function movingToAnotherFolder() { $this->writeData($this->file, null); $target = new File($this->folder, $this->file->getFilename()); $this->file->move($this->folder); $exists = $target->exists(); $target->unlink(); $this->assertTrue($exists); }
/** * Returns an inputstream for a given name, or NULL * * @param string $name * @return io.streams.InputStream */ protected function inputStreamFor($name) { $f = new File($this->base, $name); return $f->exists() ? $f->in() : null; }