Skip to content
Snippets Groups Projects
Handler.php 2.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • jurgenhaas's avatar
    jurgenhaas committed
    <?php
    
    
    jurgenhaas's avatar
    jurgenhaas committed
    namespace LakeDrops\DorgFlow;
    
    jurgenhaas's avatar
    jurgenhaas committed
    
    
    jurgenhaas's avatar
    jurgenhaas committed
    use GitElephant\Repository;
    
    use LakeDrops\Component\Composer\BaseHandler;
    
    jurgenhaas's avatar
    jurgenhaas committed
    use Symfony\Component\Filesystem\Filesystem;
    
    jurgenhaas's avatar
    jurgenhaas committed
    
    
    jurgenhaas's avatar
    jurgenhaas committed
    /**
     * Class Handler.
     *
     * @package LakeDrops\DorgFlow
     */
    
    class Handler extends BaseHandler {
    
    jurgenhaas's avatar
    jurgenhaas committed
    
      /**
       * Post install/update event to prepare projects for development.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
    
      public function prepareDevProjects() {
    
    jurgenhaas's avatar
    jurgenhaas committed
    
    
    jurgenhaas's avatar
    jurgenhaas committed
        // We only do the fancy stuff for developers.
    
        if (!$this->isDevMode()) {
    
    jurgenhaas's avatar
    jurgenhaas committed
          return;
        }
    
        $options = $this->getOptions();
    
    jurgenhaas's avatar
    jurgenhaas committed
    
    
        $this->io->write('Dorgflow: Preparing drupol.org packages for development', TRUE);
        $installationManager = $this->composer->getInstallationManager();
    
    jurgenhaas's avatar
    jurgenhaas committed
        foreach ($options['projects'] as $project => $version) {
          $package = $this->getPackage($project);
    
          if ($package === NULL) {
    
    jurgenhaas's avatar
    jurgenhaas committed
            continue;
          }
    
          $path = $installationManager->getInstallPath($package);
    
          $this->io->write("- $project => $path", TRUE);
    
          $this->prepareWorkingDirectory($path, $project, $version);
    
    jurgenhaas's avatar
    jurgenhaas committed
        }
      }
    
      /**
    
    jurgenhaas's avatar
    jurgenhaas committed
       * Retrieve options from composer.json "extra" configuration.
    
    jurgenhaas's avatar
    jurgenhaas committed
       *
       * @return array
    
    jurgenhaas's avatar
    jurgenhaas committed
       *   The options.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
    
      protected function getOptions(): array {
    
    jurgenhaas's avatar
    jurgenhaas committed
        $extra = $this->composer->getPackage()->getExtra() + ['dorgflow' => []];
    
    jurgenhaas's avatar
    jurgenhaas committed
          'projects' => [],
        ];
      }
    
      /**
    
    jurgenhaas's avatar
    jurgenhaas committed
       * Prepare the working directory of a git based package for dorgflow.
       *
       * @param string $path
       *   Name of the working directory.
       * @param string $project
       *   Name of the project.
       * @param string $version
       *   Version to checkout.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
    
      protected function prepareWorkingDirectory($path, $project, $version) {
    
    jurgenhaas's avatar
    jurgenhaas committed
        list(, $projectname) = explode('/', $project);
    
        $uri = 'git@git.drupal.org:project/' . $projectname . '.git';
    
    jurgenhaas's avatar
    jurgenhaas committed
    
    
    jurgenhaas's avatar
    jurgenhaas committed
        // Git Clone the repository into the working directory.
    
    jurgenhaas's avatar
    jurgenhaas committed
        $repository = Repository::open($path);
    
    jurgenhaas's avatar
    jurgenhaas committed
        $repository->init();
    
    
        try {
          $origin = $repository->getRemote('origin', FALSE);
    
          if ($origin && $origin->getFetchURL() === $uri) {
    
    jurgenhaas's avatar
    jurgenhaas committed
          }
        }
    
    jurgenhaas's avatar
    jurgenhaas committed
          // Ignore the exception and conitue setup.
    
    jurgenhaas's avatar
    jurgenhaas committed
        }
    
    
        $fs = new Filesystem();
        $fs->remove($path);
        $fs->mkdir($path);
        $repository->init();
        $repository->addRemote('origin', $uri);
    
    
    jurgenhaas's avatar
    jurgenhaas committed
        $repository->fetch();
    
    jurgenhaas's avatar
    jurgenhaas committed
        $repository->checkout($version);
    
        $repository->getCaller()->execute('branch --set-upstream-to origin/' . $version . ' ' . $version);
    
        $this->io->write('  - completed', TRUE);
    
    jurgenhaas's avatar
    jurgenhaas committed
      }
    
    }