Skip to content
Snippets Groups Projects
Handler.php 3.94 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
    
    use Composer\Composer;
    use Composer\IO\IOInterface;
    
    jurgenhaas's avatar
    jurgenhaas committed
    use Composer\Script\Event;
    
    jurgenhaas's avatar
    jurgenhaas committed
    use GitElephant\Repository;
    
    use LakeDrops\Component\Dotenv\Dotenv;
    
    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
     */
    
    jurgenhaas's avatar
    jurgenhaas committed
    class Handler {
    
      /**
    
    jurgenhaas's avatar
    jurgenhaas committed
       * The composer object of this session.
       *
    
    jurgenhaas's avatar
    jurgenhaas committed
       * @var \Composer\Composer
       */
      protected $composer;
    
      /**
    
    jurgenhaas's avatar
    jurgenhaas committed
       * The input-output object of the composer session.
       *
    
    jurgenhaas's avatar
    jurgenhaas committed
       * @var \Composer\IO\IOInterface
       */
      protected $io;
    
      /**
       * Handler constructor.
       *
    
    jurgenhaas's avatar
    jurgenhaas committed
       * @param \Composer\Composer $composer
       *   The composer object of this session.
       * @param \Composer\IO\IOInterface $io
       *   The input-output object of the composer session.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
      public function __construct(Composer $composer, IOInterface $io) {
        $this->composer = $composer;
        $this->io = $io;
      }
    
      /**
    
    jurgenhaas's avatar
    jurgenhaas committed
       * Retrieve a package from the current composer process.
       *
       * @param string $name
       *   Name of the package to get from the current composer installation.
       *
    
    jurgenhaas's avatar
    jurgenhaas committed
       * @return \Composer\Package\PackageInterface
       *   The package.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
      protected function getPackage($name) {
        return $this->composer->getRepositoryManager()->getLocalRepository()->findPackage($name, '*');
      }
    
      /**
       * Post install/update event to prepare projects for development.
    
    jurgenhaas's avatar
    jurgenhaas committed
       *
    
    jurgenhaas's avatar
    jurgenhaas committed
       * @param \Composer\Script\Event $event
       *   The event that triggered the call of this function.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
    
    jurgenhaas's avatar
    jurgenhaas committed
      public function prepareDevProjects(Event $event) {
    
    jurgenhaas's avatar
    jurgenhaas committed
    
    
    jurgenhaas's avatar
    jurgenhaas committed
        // We only do the fancy stuff for developers.
    
    jurgenhaas's avatar
    jurgenhaas committed
        if (!$event->isDevMode()) {
          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 (empty($package)) {
            continue;
          }
    
          $path = $installationManager->getInstallPath($package);
    
          $this->io->write("- $project => $path", TRUE);
    
    jurgenhaas's avatar
    jurgenhaas committed
          $this->prepareWorkingDirectory($path, $project, $version, $options['username']);
        }
      }
    
      /**
    
    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() {
    
        $env = new Dotenv('dorgflow', $this->io);
    
    jurgenhaas's avatar
    jurgenhaas committed
        $extra = $this->composer->getPackage()->getExtra() + ['dorgflow' => []];
        $options = $extra['dorgflow'] + [
          'projects' => [],
    
          'username' => $env->receive('drupal_org_username', 'Drupal.org username', getenv('USER')),
    
    jurgenhaas's avatar
    jurgenhaas committed
        ];
        return $options;
      }
    
      /**
    
    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.
       * @param string $username
       *   Username on drupal.org.
    
    jurgenhaas's avatar
    jurgenhaas committed
       */
      protected function prepareWorkingDirectory($path, $project, $version, $username) {
        list(, $projectname) = explode('/', $project);
    
    jurgenhaas's avatar
    jurgenhaas committed
        $uri = $username . '@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) {
            // Already setup correctly.
            return;
    
    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);
    
    jurgenhaas's avatar
    jurgenhaas committed
      }
    
    }