Пример #1
0
 /**
  * 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;
 }
Пример #3
0
 /**
  * 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;
 }
Пример #5
0
 /**
  * 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;
 }
Пример #7
0
 /**
  * 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;
 }
Пример #8
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);
 }
Пример #10
0
 /**
  * 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;
 }