From ea7419c6963293bdaa84240dee969ac2c9410c66 Mon Sep 17 00:00:00 2001
From: jurgenhaas <juergen.haas@lakedrops.com>
Date: Wed, 6 Jul 2022 09:24:38 +0200
Subject: [PATCH] composer/plugin/dorgflow#6 Add support to keep files and
 directories that are not contained in the repository

---
 src/Handler.php | 60 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 11 deletions(-)

diff --git a/src/Handler.php b/src/Handler.php
index 61c3fdc..3b817f5 100644
--- a/src/Handler.php
+++ b/src/Handler.php
@@ -2,14 +2,12 @@
 
 namespace LakeDrops\DorgFlow;
 
-use Exception;
-use GitElephant\Command\ResetCommand;
 use GitElephant\Repository;
 use LakeDrops\Component\Composer\BaseHandler;
 use Symfony\Component\Filesystem\Filesystem;
 
 /**
- * Class Handler.
+ * Handler class for the Dorgflow plugin.
  *
  * @package LakeDrops\DorgFlow
  */
@@ -50,10 +48,10 @@ class Handler extends BaseHandler {
 
     $installationManager = $this->composer->getInstallationManager();
     foreach ([
-               'projects' => 'git.drupal.org:project',
-               'drupalspoons' => 'gitlab.com:drupalspoons',
-               'selfhosted' => FALSE,
-             ] as $type => $url) {
+      'projects' => 'git.drupal.org:project',
+      'drupalspoons' => 'gitlab.com:drupalspoons',
+      'selfhosted' => FALSE,
+    ] as $type => $url) {
       if ($this->config->readValue($type) === NULL) {
         continue;
       }
@@ -86,7 +84,9 @@ class Handler extends BaseHandler {
         }
         $path = $installationManager->getInstallPath($package);
         $this->io->write("- $project => $path", TRUE);
+        $this->keepObjects($project);
         $this->prepareWorkingDirectory($path, $projectname, $version, $fullUrl);
+        $this->restoreObjects($project);
       }
     }
   }
@@ -112,11 +112,12 @@ class Handler extends BaseHandler {
 
     try {
       $origin = $repository->getRemote('origin', FALSE);
-      if ($origin && $origin->getFetchURL() === $uri) {
+      if ($origin->getFetchURL() === $uri) {
         // Already setup correctly.
         return;
       }
-    } catch (Exception $ex) {
+    }
+    catch (\Exception $ex) {
       // Ignore the exception and conitue setup.
     }
 
@@ -177,12 +178,13 @@ class Handler extends BaseHandler {
     $repository = Repository::open($path);
     try {
       $origin = $repository->getRemote($remote, FALSE);
-      if ($origin && $origin->getFetchURL() === $uri) {
+      if ($origin->getFetchURL() === $uri) {
         // Already setup correctly.
         $this->io->write('Already available.');
         return;
       }
-    } catch (Exception $ex) {
+    }
+    catch (\Exception $ex) {
       // Ignore the exception and conitue setup.
     }
     $repository->addRemote($remote, $uri);
@@ -190,4 +192,40 @@ class Handler extends BaseHandler {
     $this->io->write('Successfully added issue fork.');
   }
 
+  /**
+   * Move files and directories to keep to the /tmp directory.
+   *
+   * @param string $project
+   *   The project name.
+   */
+  private function keepObjects(string $project): void {
+    if ($objects = $this->config->readValue(['keep', $project])) {
+      $fs = new Filesystem();
+      foreach ($objects as $id => $object) {
+        if (file_exists($object)) {
+          $this->io->write('  - keeping ' . $object);
+          $fs->rename($object, '/tmp/dorgflow-keep-' . $id, TRUE);
+        }
+      }
+    }
+  }
+
+  /**
+   * Move files and directories to keep from the /tmp directory.
+   *
+   * @param string $project
+   *   The project name.
+   */
+  private function restoreObjects(string $project): void {
+    if ($objects = $this->config->readValue(['keep', $project])) {
+      $fs = new Filesystem();
+      foreach ($objects as $id => $object) {
+        if (file_exists('/tmp/dorgflow-keep-' . $id)) {
+          $this->io->write('  - restoring ' . $object);
+          $fs->rename('/tmp/dorgflow-keep-' . $id, $object, TRUE);
+        }
+      }
+    }
+  }
+
 }
-- 
GitLab