/** * Mirror a directory if the two directories don't match. * * @param string $source * @param string $dest * @param PackageEvent $event */ public static function mirror($source, $dest, PackageEvent $event) { if (realpath($source) === realpath($dest)) { return; } $fs = new Filesystem(); try { $fs->mirror($source, $dest); } catch (IOException $e) { $event->getIO()->writeError(sprintf('Mirroring %s to %s failed:', $source, $dest)); $event->getIO()->writeError($e->getMessage()); } }
/** * Auto registers the "pbj-schema-store" repos with the SchemaStore. * * @param PackageEvent $event */ public static function writePbjSchemaStoresFile(PackageEvent $event) { if (!$event->isDevMode()) { return; } $dirs = []; /** @var PackageInterface $package */ foreach ($event->getInstalledRepo()->getPackages() as $package) { if (!$package instanceof PackageInterface) { continue; } if ('pbj-schema-store' !== $package->getType()) { continue; } $dir = sprintf('$vendorDir.\'/%s/schemas/\'', $package->getName()); // override for current package if ($event->getComposer()->getPackage()->getName() == $package->getName()) { $dir = '__DIR__.\'/schemas/\''; } $dirs[] = sprintf('%s %s', PHP_EOL, $dir); } if (empty($dirs)) { return; } $dirs = implode(',', $dirs); $event->getIO()->write('<info>Writing "pbj-schema-store" locations to "pbj-schema-stores.php"</info>'); $text = <<<TEXT <?php /** * DO NOT EDIT THIS FILE as it will be overwritten by Composer as part of * the installation/update process. * * Registers all directories from all required packages which are of * of the type "pbj-schema-store". * * This file has been auto-generated by the Pbj Compiler. */ \$vendorDir = realpath(__DIR__.'/vendor'); \\Gdbots\\Pbjc\\SchemaStore::addDirs([{$dirs} ]); TEXT; $fs = new Filesystem(); $fs->dumpFile('pbj-schema-stores.php', $text); }
/** * Remove possibly problematic test files from vendored projects. * * @param \Composer\Installer\PackageEvent $event * A PackageEvent object to get the configured composer vendor directories * from. */ public static function vendorTestCodeCleanup(PackageEvent $event) { $vendor_dir = $event->getComposer()->getConfig()->get('vendor-dir'); $io = $event->getIO(); $op = $event->getOperation(); if ($op->getJobType() == 'update') { $package = $op->getTargetPackage(); } else { $package = $op->getPackage(); } $package_key = static::findPackageKey($package->getName()); $message = sprintf(" Processing <comment>%s</comment>", $package->getPrettyName()); if ($io->isVeryVerbose()) { $io->write($message); } if ($package_key) { foreach (static::$packageToCleanup[$package_key] as $path) { $dir_to_remove = $vendor_dir . '/' . $package_key . '/' . $path; $print_message = $io->isVeryVerbose(); if (is_dir($dir_to_remove)) { if (static::deleteRecursive($dir_to_remove)) { $message = sprintf(" <info>Removing directory '%s'</info>", $path); } else { // Always display a message if this fails as it means something has // gone wrong. Therefore the message has to include the package name // as the first informational message might not exist. $print_message = TRUE; $message = sprintf(" <error>Failure removing directory '%s'</error> in package <comment>%s</comment>.", $path, $package->getPrettyName()); } } else { // If the package has changed or the --prefer-dist version does not // include the directory this is not an error. $message = sprintf(" Directory '%s' does not exist", $path); } if ($print_message) { $io->write($message); } } if ($io->isVeryVerbose()) { // Add a new line to separate this output from the next package. $io->write(""); } } }
/** * @param PackageEvent $event */ public function postPackageInstall(PackageEvent $event) { $operation = $event->getOperation(); if (!$operation instanceof InstallOperation) { return; } $package = $operation->getPackage(); if ($package->getName() !== static::$packageName) { return; } $extra = $event->getComposer()->getPackage()->getExtra(); if (!isset($extra['connect-packages']) || !count($extra['connect-packages'])) { return; } //skip if we are installing from lock file if ($event->getComposer()->getLocker()->isLocked()) { return; } $packages = implode('", "', array_keys($extra['connect-packages'])); $message = '<comment>The package(s): "%s" will be installed the next time you run '; $message .= 'composer update</comment>'; $event->getIO()->write(sprintf($message, $packages)); }
/** * @param PackageEvent $event * @return bool|void */ public function installBinary(PackageEvent $event) { $binLocation = $event->getComposer()->getConfig()->get('bin-dir'); $binaries = $event->getOperation()->getPackage()->getBinaries(); if (count($binaries) === 0) { return; } $binary = basename(array_values($binaries)[0]); $binaryLocation = sprintf('%s/%s', $binLocation, $binary); $target = $this->getInstallLocation($binary); //if target exists and is symlink then we just remove it if (is_link($target)) { unlink($target); } if (is_writable(dirname($target))) { return symlink($binaryLocation, $target); } $event->getIO()->write(sprintf('<error>The directory: %s is not writeable. The workshop %s cannot be installed.</error>', dirname($target), $binary)); $event->getIO()->write(""); $event->getIO()->write(sprintf('You have two options now:')); $event->getIO()->write(sprintf(' 1. Add the composer global bin dir: <info>%s</info> to your PATH variable', $binLocation)); $event->getIO()->write(sprintf(' 2. Run <info>%s</info> directly with <info>%s</info>', $binary, $binaryLocation)); $event->getIO()->write(""); }
/** * Composer post-package action events. * * @param PackageEvent $event */ public function onPostPackage(PackageEvent $event) { if ($event->getIO() instanceof BufferIO) { $this->logger->debug($event->getIO()->getOutput(), ['event' => 'extensions']); } }
/** * Composer post-package action events. * * @param PackageEvent $event */ public function onPostPackage(PackageEvent $event) { if ($event->getIO() instanceof BufferIO) { $this->manager->setOutput($event->getIO()->getOutput()); } }
/** * @param PackageEvent $event */ public function __construct(PackageEvent $event) { $this->aliasOf = $event; parent::__construct($event->getName(), $event->getComposer(), $event->getIO(), $event->isDevMode(), $event->getArguments(), $event->getFlags()); }