/**
  * @override \ComponentManager\Step\Step
  *
  * @param \ComponentManager\Task\InstallTask $task
  */
 public function execute($task, LoggerInterface $logger)
 {
     $resolvedComponentVersions = $task->getResolvedComponentVersions();
     foreach ($resolvedComponentVersions as $resolvedComponentVersion) {
         $logger->info('Installing component', ['component' => $resolvedComponentVersion->getComponent()->getName(), 'packageRepository' => $resolvedComponentVersion->getPackageRepository()->getName(), 'version' => $resolvedComponentVersion->getVersion()->getVersion(), 'release' => $resolvedComponentVersion->getVersion()->getRelease()]);
         $projectLockFile = $this->project->getProjectLockFile();
         $component = $resolvedComponentVersion->getComponent();
         $packageSource = $this->project->getPackageSource($resolvedComponentVersion->getSpecification()->getPackageSource());
         $typeDirectory = $this->moodle->getPluginTypeDirectory($component->getPluginType());
         $targetDirectory = $this->platform->joinPaths([$typeDirectory, $component->getPluginName()]);
         $tempDirectory = $this->platform->createTempDirectory();
         $sourceDirectory = $packageSource->obtainPackage($tempDirectory, $resolvedComponentVersion, $this->filesystem, $logger);
         if ($resolvedComponentVersion->getFinalVersion() === null) {
             $logger->warning('Package source did not indicate final version; defaulting to desired version', ['version' => $resolvedComponentVersion->getVersion()->getVersion()]);
             $resolvedComponentVersion->setFinalVersion($resolvedComponentVersion->getVersion()->getVersion());
         }
         $logger->debug('Downloaded component source', ['packageSource' => $packageSource->getName(), 'sourceDirectory' => $sourceDirectory]);
         if ($this->filesystem->exists($targetDirectory)) {
             $logger->info('Component directory already exists; removing', ['targetDirectory' => $targetDirectory]);
             $this->filesystem->remove($targetDirectory);
         }
         $logger->info('Copying component source to Moodle directory', ['sourceDirectory' => $sourceDirectory, 'targetDirectory' => $targetDirectory]);
         $this->filesystem->mirror($sourceDirectory, $targetDirectory);
         $logger->info('Pinning component at installed final version', ['finalVersion' => $resolvedComponentVersion->getFinalVersion()]);
         $projectLockFile->addResolvedComponentVersion($resolvedComponentVersion);
         $logger->info('Cleaning up after component installation', ['tempDirectory' => $tempDirectory]);
         try {
             $this->filesystem->chmod([$tempDirectory], 0750, 00, true);
             $this->filesystem->remove([$tempDirectory]);
         } catch (IOException $e) {
             $logger->warning('Unable to clean up temporary directory', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'tempDirectory' => $tempDirectory]);
         }
     }
 }
 /**
  * Initialiser.
  *
  * @param \ComponentManager\Project\Project        $project
  * @param \ComponentManager\Platform\Platform      $platform
  * @param \Symfony\Component\Filesystem\Filesystem $filesystem
  * @param \ComponentManager\Moodle                 $moodle
  */
 public function __construct(Project $project, Platform $platform, Filesystem $filesystem, Moodle $moodle)
 {
     parent::__construct();
     $this->addStep(new VerifyPackageRepositoriesCachedStep($project->getPackageRepositories()));
     $this->addStep(new ResolveComponentVersionsStep($project));
     $this->addStep(new InstallComponentsStep($project, $moodle, $platform, $filesystem));
     $this->addStep(new BuildComponentsStep($moodle, $platform, $filesystem));
     $this->addStep(new CommitProjectLockFileStep($project->getProjectLockFile()));
     $this->addStep(new RemoveTempDirectoriesStep($platform));
 }
 /**
  * Initialiser.
  *
  * @param \ComponentManager\MoodleApi              $moodleApi
  * @param \ComponentManager\Project\Project        $project
  * @param string                                   $moodleArchive
  * @param string                                   $moodleDestination
  * @param \Symfony\Component\Filesystem\Filesystem $filesystem
  * @param \ComponentManager\Moodle                 $moodle
  * @param string                                   $packageFormat
  * @param string                                   $packageDestination
  */
 public function __construct(MoodleApi $moodleApi, Project $project, $moodleArchive, $moodleDestination, Platform $platform, Filesystem $filesystem, Moodle $moodle, $packageFormat, $packageDestination)
 {
     /* Because we're reordering the installation steps, we don't want to
      * call InstallTask's constructor. */
     AbstractTask::__construct();
     $this->resolvedComponentVersions = [];
     $this->addStep(new VerifyPackageRepositoriesCachedStep($project->getPackageRepositories()));
     $this->addStep(new ResolveMoodleVersionStep($moodleApi, $project->getProjectFile()->getMoodleVersion()));
     $this->addStep(new ResolveComponentVersionsStep($project));
     $this->addStep(new ObtainMoodleSourceStep($moodleArchive, dirname($moodleDestination)));
     $this->addStep(new InstallComponentsStep($project, $moodle, $platform, $filesystem));
     $this->addStep(new BuildComponentsStep($moodle, $platform, $filesystem));
     $this->addStep(new CommitProjectLockFileStep($project->getProjectLockFile()));
     $this->addStep(new PackageStep($project, $moodleDestination, $packageFormat, $packageDestination));
     $this->addStep(new RemoveTempDirectoriesStep($platform));
 }
 /**
  * @override \ComponentManager\Step\Step
  *
  * @param \ComponentManager\Task\InstallTask $task
  */
 public function execute($task, LoggerInterface $logger)
 {
     $componentSpecifications = $this->project->getProjectFile()->getComponentSpecifications();
     foreach ($componentSpecifications as $componentSpecification) {
         $packageRepository = $this->project->getPackageRepository($componentSpecification->getPackageRepository());
         $logger->info('Resolving component version', ['component' => $componentSpecification->getName(), 'packageRepository' => $componentSpecification->getPackageRepository(), 'version' => $componentSpecification->getVersion()]);
         $componentName = $componentSpecification->getName();
         $componentVersion = $componentSpecification->getVersion();
         $packageRepositoryName = $componentSpecification->getPackageRepository();
         if (!($component = $packageRepository->getComponent($componentSpecification))) {
             throw new InvalidProjectException("The component \"{$componentName}\" could not be found within repository \"{$packageRepositoryName}\"", InvalidProjectException::CODE_MISSING_COMPONENT);
         }
         /* Note that even at this late stage, we still might not have a final
          * version for the component:
          * -> If the package repository provides us with the Moodle
          *    $plugin->version value, we'll be using it here.
          * -> If the package repository is a version control system, the version
          *    will contain the name of a branch or tag and will need to be
          *    resolved to an individual commit. */
         $version = $component->getVersion($componentVersion);
         $task->addResolvedComponentVersion(new ResolvedComponentVersion($componentSpecification, $packageRepository, $component, $version));
     }
 }
 /**
  * @override \ComponentManager\Step\Step
  */
 public function execute($task, LoggerInterface $logger)
 {
     $packageFormat = $this->project->getPackageFormat($this->format);
     $packageFormat->package($this->source, $this->destination, $this->project->getProjectFile(), $this->project->getProjectLockFile(), $logger);
 }