public static function preUpdate(Event $event) { $io = $event->getIO(); $composer = $event->getComposer(); /** @var \Composer\Package\RootPackage $package */ $package = $composer->getPackage(); // load constants $root = static::getContaoRoot($package); $messages = array(); $jsonModified = false; $configFile = new JsonFile('composer.json'); $configJson = $configFile->read(); // remove old installer scripts $eventScripts = array('pre-update-cmd' => array(__CLASS__ . '::updateContaoPackage', __CLASS__ . '::updateComposerConfig'), 'post-update-cmd' => array(__CLASS__ . '::createRunonce')); foreach ($eventScripts as $key => $scripts) { foreach ($scripts as $script) { if (array_key_exists($key, $configJson['scripts'])) { if (is_array($configJson['scripts'][$key])) { $index = array_search($script, $configJson['scripts'][$key]); if ($index !== false) { unset($configJson['scripts'][$key][$index]); if (empty($configJson['scripts'][$key])) { unset($configJson['scripts'][$key]); } $jsonModified = true; $messages[] = 'obsolete ' . $key . ' script was removed!'; } } else { if ($configJson['scripts'][$key] == $script) { unset($configJson['scripts'][$key]); $jsonModified = true; $messages[] = 'obsolete ' . $key . ' script was removed!'; } } } } } // add installer scripts $eventScripts = array('pre-update-cmd' => __CLASS__ . '::preUpdate', 'post-update-cmd' => __CLASS__ . '::postUpdate', 'post-autoload-dump' => __CLASS__ . '::postAutoloadDump'); foreach ($eventScripts as $key => $script) { if (!array_key_exists($key, $configJson['scripts']) || empty($configJson['scripts'][$key])) { $configJson['scripts'][$key] = $script; $jsonModified = true; $messages[] = $key . ' script was missing and readded!'; } else { if (is_array($configJson['scripts'][$key])) { if (!in_array($script, $configJson['scripts'][$key])) { $configJson['scripts'][$key][] = $script; $jsonModified = true; $messages[] = $key . ' script was missing and readded!'; } } else { if ($configJson['scripts'][$key] != $script) { $configJson['scripts'][$key] = $script; $jsonModified = true; $messages[] = $key . ' script was missing and readded!'; } } } } // add custom repository if (!array_key_exists('repositories', $configJson)) { $configJson['repositories'] = array(); } $artifactPath = $root . DIRECTORY_SEPARATOR . 'composer' . DIRECTORY_SEPARATOR . 'packages'; if (defined('PHP_WINDOWS_VERSION_BUILD')) { // remove outdated artifact repositories if (!isset($configJson['extra']['contao']['artifactPath'])) { $outdatedArtifactPath = 'packages'; } else { if ($artifactPath != $configJson['extra']['contao']['artifactPath']) { $outdatedArtifactPath = $configJson['extra']['contao']['artifactPath']; } } if (isset($outdatedArtifactPath)) { $configJson['repositories'] = array_filter($configJson['repositories'], function ($repository) use($outdatedArtifactPath) { return $repository['type'] != 'artifact' || rtrim($repository['url'], '/') != $outdatedArtifactPath; }); $configJson['extra']['contao']['artifactPath'] = $artifactPath; $jsonModified = true; $messages[] = 'The artifact repository path was missing or outdated ' . 'and has been set up to date! Please restart the last operation.'; } // add current artifact repositories, if it is missing foreach ($configJson['repositories'] as $repository) { if ($repository['type'] == 'artifact' && $repository['url'] == $artifactPath) { $hasArtifactRepository = true; break; } } if (!isset($hasArtifactRepository)) { $configJson['repositories'][] = array('type' => 'artifact', 'url' => $artifactPath); $jsonModified = true; $messages[] = 'The artifact repository was missing and has been added to repositories! ' . 'Please restart the last operation.'; } } if (!is_dir($artifactPath)) { mkdir($artifactPath, 0777, true); } $hasContaoRepository = false; foreach ($configJson['repositories'] as $repository) { if ($repository['type'] == 'composer' && ($repository['url'] == 'http://legacy-packages-via.contao-community-alliance.org/' || $repository['url'] == 'https://legacy-packages-via.contao-community-alliance.org/')) { $hasContaoRepository = true; break; } } // add contao repository if (!$hasContaoRepository) { $configJson['repositories'][] = array('type' => 'composer', 'url' => 'https://legacy-packages-via.contao-community-alliance.org/'); $jsonModified = true; $messages[] = 'The contao repository is missing and has been readded to repositories!'; } // add contao-community-alliance/composer dependency if (!array_key_exists('contao-community-alliance/composer', $configJson['require'])) { $configJson['require']['contao-community-alliance/composer'] = '*'; $jsonModified = true; $messages[] = 'The contao integration contao-community-alliance/composer ' . 'is missing and has been readded to dependencies!'; } else { if ($configJson['require']['contao-community-alliance/composer'] == 'dev-master@dev') { $configJson['require']['contao-community-alliance/composer'] = '*'; $jsonModified = true; $messages[] = 'The contao integration contao-community-alliance/composer ' . 'was installed as development release, switched to stable releases!'; } } // update contao version $versionParser = new VersionParser(); $version = VERSION . (is_numeric(BUILD) ? '.' . BUILD : '-' . BUILD); $prettyVersion = $versionParser->normalize($version); if ($package->getVersion() !== $prettyVersion) { $configJson['version'] = $version; $jsonModified = true; $messages[] = sprintf('Contao version changed from <info>%s</info> to <info>%s</info>!', $package->getPrettyVersion(), $version); // run all runonces after contao version changed $self = new self($io, $composer); $self->updateAllRunonces(); $self->createRunonces($io, $root); } // add provides switch (VERSION) { case '2.11': $swiftVersion = file_get_contents(TL_ROOT . '/plugins/swiftmailer/VERSION'); $swiftVersion = substr($swiftVersion, 6); $swiftVersion = trim($swiftVersion); break; case '3.0': $swiftVersion = file_get_contents(TL_ROOT . '/system/vendor/swiftmailer/VERSION'); $swiftVersion = substr($swiftVersion, 6); $swiftVersion = trim($swiftVersion); break; case '3.1': case '3.2': $swiftVersion = file_get_contents(TL_ROOT . '/system/modules/core/vendor/swiftmailer/VERSION'); $swiftVersion = substr($swiftVersion, 6); $swiftVersion = trim($swiftVersion); break; default: $swiftVersion = '0'; } if (!isset($configJson['provide']['swiftmailer/swiftmailer']) || $configJson['provide']['swiftmailer/swiftmailer'] != $swiftVersion) { $configJson['provide']['swiftmailer/swiftmailer'] = $swiftVersion; $jsonModified = true; $messages[] = sprintf('Provided swiftmailer version changed to <info>%s</info>!', $swiftVersion); } if ($jsonModified) { $configFile->write($configJson); } if (count($messages)) { $exception = null; foreach (array_reverse($messages) as $message) { $exception = new ConfigUpdateException($message, 0, $exception); } throw $exception; } }