From a671aecbecd287e0fa15aaa8d72513389beea6a0 Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen@paragon-es.de>
Date: Tue, 22 Aug 2017 09:45:54 +0200
Subject: [PATCH] Initial code

---
 composer.json   | 11 ++++----
 src/Handler.php | 75 ++++++++++++++++++++++++++++++++++++++++---------
 src/Plugin.php  | 20 ++++++-------
 3 files changed, 75 insertions(+), 31 deletions(-)

diff --git a/composer.json b/composer.json
index f8ed414..e7646ea 100644
--- a/composer.json
+++ b/composer.json
@@ -1,9 +1,9 @@
 {
-    "name": "lakedrops/composer-dev-environment",
+    "name": "lakedrops/dorgflow",
     "description": "Composer Plugin for development environments",
     "type": "composer-plugin",
     "keywords": ["Development"],
-    "homepage": "https://gitlab.paragon-es.de/lakedrops/composer-dev-environment",
+    "homepage": "https://gitlab.paragon-es.de/lakedrops/dorgflow",
     "license": "GPL-2.0+",
     "authors": [
         {
@@ -20,8 +20,8 @@
         }
     ],
     "support": {
-        "issues": "https://gitlab.paragon-es.de/lakedrops/composer-dev-environment/issues",
-        "source": "https://gitlab.paragon-es.de/lakedrops/composer-dev-environment/tree/master"
+        "issues": "https://gitlab.paragon-es.de/lakedrops/dorgflow/issues",
+        "source": "https://gitlab.paragon-es.de/lakedrops/dorgflow/tree/master"
     },
     "require": {
         "composer-plugin-api": "^1.0.0",
@@ -33,10 +33,11 @@
         }
     },
     "extra": {
-        "class": "LakeDrops\\ComposerDevEnvironment\\Plugin"
+        "class": "LakeDrops\\DorgFlow\\Plugin"
     },
     "require-dev": {
         "composer/composer": "dev-master",
+        "cypresslab/gitelephant": "~1.0",
         "phpunit/phpunit": "^4.4.0"
     }
 }
diff --git a/src/Handler.php b/src/Handler.php
index 8d86ca6..f1bd431 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -1,16 +1,12 @@
 <?php
 
-/**
- * @file
- * Contains \LakeDrops\ComposerDevEnvironment\Handler.
- */
-
-namespace LakeDrops\ComposerDevEnvironment;
+namespace LakeDrops\DorgFlow;
 
 use Composer\Package\PackageInterface;
 use Composer\Composer;
 use Composer\IO\IOInterface;
 use Composer\Script\Event as ScriptEvent;
+use GitElephant\Repository;
 
 class Handler {
 
@@ -24,11 +20,6 @@ class Handler {
    */
   protected $io;
 
-  /**
-   * @var PackageInterface
-   */
-  protected $drupalCorePackage;
-
   /**
    * Handler constructor.
    *
@@ -41,12 +32,68 @@ class Handler {
   }
 
   /**
-   * Post project create event to execute the scaffolding.
+   * Retrieve a package from the current composer process.
+   *
+   * @param string $name
+   *   Name of the package to get from the current composer installation.
+   *
+   * @return PackageInterface
+   */
+  protected function getPackage($name) {
+    return $this->composer->getRepositoryManager()->getLocalRepository()->findPackage($name, '*');
+  }
+
+  /**
+   * Post install/update event to prepare projects for development.
    *
    * @param ScriptEvent $event
    */
-  public function test($event) {
-    print('HALLO, here I am' . PHP_EOL);
+  public function prepareDevProjects($event) {
+
+    // We only do the fancy stuff for developers
+    if (!$event->isDevMode()) {
+      return;
+    }
+
+    $options = $this->getOptions();
+    $installationManager = $this->composer->getInstallationManager();
+
+    foreach ($options['projects'] as $project => $version) {
+      $package = $this->getPackage($project);
+      if (empty($package)) {
+        continue;
+      }
+
+      $path = $installationManager->getInstallPath($package);
+      $this->prepareWorkingDirectory($path, $project, $version, $options['username']);
+    }
+  }
+
+  /**
+   * Retrieve excludes from optional "extra" configuration.
+   *
+   * @return array
+   */
+  protected function getOptions() {
+    $extra = $this->composer->getPackage()->getExtra() + ['dorgflow' => []];
+    $options = $extra['dorgflow'] + [
+      'projects' => [],
+      'username' => '',
+    ];
+    return $options;
+  }
+
+  /**
+   * @inheritDoc
+   */
+  protected function prepareWorkingDirectory($path, $project, $version, $username) {
+    list(, $projectname) = explode('/', $project);
+    $repo = $username . '@git.drupal.org/project/' . $projectname . '.git';
+
+    // Git Clone the repository into the working directory
+    $repository = Repository::open($path);
+    $repository->cloneFrom($repo, '.');
+    $repository->checkout($version);
   }
 
 }
diff --git a/src/Plugin.php b/src/Plugin.php
index a60a9e6..e1745fd 100644
--- a/src/Plugin.php
+++ b/src/Plugin.php
@@ -1,11 +1,6 @@
 <?php
 
-/**
- * @file
- * Contains LakeDrops\ComposerDevEnvironment\Plugin.
- */
-
-namespace LakeDrops\ComposerDevEnvironment;
+namespace LakeDrops\DorgFlow;
 
 use Composer\Composer;
 use Composer\EventDispatcher\EventSubscriberInterface;
@@ -14,12 +9,12 @@ use Composer\Plugin\PluginInterface;
 use Composer\Script\ScriptEvents;
 
 /**
- * Composer plugin for handling drupal scaffold.
+ * Composer plugin for preparing Drupal project for development with dorgflow.
  */
 class Plugin implements PluginInterface, EventSubscriberInterface {
 
   /**
-   * @var \LakeDrops\ComposerDevEnvironment\Handler
+   * @var \LakeDrops\DorgFlow\Handler
    */
   protected $handler;
 
@@ -35,17 +30,18 @@ class Plugin implements PluginInterface, EventSubscriberInterface {
    */
   public static function getSubscribedEvents() {
     return array(
-      ScriptEvents::PRE_UPDATE_CMD => 'test',
+      ScriptEvents::POST_INSTALL_CMD => 'prepareDevProjects',
+      ScriptEvents::POST_UPDATE_CMD => 'prepareDevProjects',
     );
   }
 
   /**
-   * Post create project event callback.
+   * Post install/update event callback.
    *
    * @param \Composer\Script\Event $event
    */
-  public function test($event) {
-    $this->handler->test($event);
+  public function prepareDevProjects($event) {
+    $this->handler->prepareDevProjects($event);
   }
 
 }
-- 
GitLab