From d04e22506a2c35e011fa59f8feb6c0b154a6d9df Mon Sep 17 00:00:00 2001 From: jurgenhaas <juergen@paragon-es.de> Date: Wed, 25 Oct 2017 17:02:29 +0200 Subject: [PATCH] #9 Better handling of backup files --- src/Handler.php | 155 ++++++++++++++++++++++---------------------- src/NestedArray.php | 29 +++++++++ 2 files changed, 107 insertions(+), 77 deletions(-) create mode 100644 src/NestedArray.php diff --git a/src/Handler.php b/src/Handler.php index c3ccc34..91e5224 100644 --- a/src/Handler.php +++ b/src/Handler.php @@ -118,12 +118,10 @@ class Handler { $twig_loader = new \Twig_Loader_Array([]); $twig = new \Twig_Environment($twig_loader); $options['webRoot'] = $webRoot . '/'; + $orig_ignored = FALSE; foreach ($this->getFiles($projectRoot, $webRoot, $settingsPath) as $template => $def) { $file = $def['dest'] . '/' . $template; if ($overwrite || !$fs->exists($file)) { - if ($fs->exists($file)) { - $fs->rename($file, $file . '.orig'); - } $twig_loader->setTemplate($template, file_get_contents($pluginRoot . '/templates/' . $template . '.twig')); $rendered = $twig->render($template, $options); if (!empty($def['add2yaml']) && isset($options[$template])) { @@ -131,6 +129,23 @@ class Handler { $yaml = array_merge_recursive($yaml, $options[$template]); $rendered = Yaml::dump($yaml, 9, 2); } + if ($fs->exists($file)) { + if (md5_file($file) == md5($rendered)) { + continue; + } + $orig_file = $file . '.orig'; + if ($fs->exists($orig_file)) { + $fs->remove($orig_file); + } + $fs->rename($file, $orig_file); + if (!$orig_ignored) { + $this->git('ignore *.orig'); + $orig_ignored = TRUE; + } + } + else { + $this->git('ignore ' . $template); + } file_put_contents($file, $rendered); } if (isset($def['link']) && ($def['link'] != $settingsPath)) { @@ -153,16 +168,6 @@ class Handler { } } - // Initialize local git working copy - try { - foreach ($this->getFiles($projectRoot, $webRoot, $settingsPath) as $template => $def) { - $this->git('ignore ' . $template); - } - } - catch (\Exception $ex) { - // We're ignoring this for now - } - $traefik = new Traefik($options['projectname']); $traefik->update(); } @@ -204,65 +209,65 @@ class Handler { $env = new Dotenv('docker4drupal', $this->io); $env->put('COMPOSE_PROJECT_NAME', $projectname); $extra = $this->composer->getPackage()->getExtra() + ['docker4drupal' => []]; - $options = $extra['docker4drupal'] + [ - 'projectname' => $projectname, - 'docker0' => [ - 'ip' => $this->getLocalIpv4('docker0'), - ], - 'live' => [ - 'root' => '', - 'uri' => '', - 'host' => '', - 'user' => $env->receive('live_host_username', 'Remote username for host of the live site', getenv('USER')), - ], - 'drupal' => [ - 'version' => '8', - ], - 'php' => [ - 'version' => '7.0', - 'xdebug' => 1, - ], - 'webserver' => [ - 'type' => 'nginx', - 'version' => '1.13', - ], - 'varnish' => [ - 'enable' => 0, - ], - 'redis' => [ - 'version' => '4.0', - ], - 'adminer' => [ - 'version' => '4.3', - ], - 'solr' => [ - 'enable' => 0, - 'version' => '6.6', - ], - 'node' => [ - 'enable' => 0, - 'key' => '', - 'path' => '', - ], - 'memcached' => [ - 'enable' => 0, - ], - 'rsyslog' => [ - 'enable' => 0, - ], - 'athenapdf' => [ - 'enable' => 0, - 'key' => '', - ], - 'blackfire' => [ - 'enable' => 0, - 'id' => '', - 'token' => '', - ], - 'webgrind' => [ - 'enable' => 0, - ], - ]; + $options = NestedArray::mergeDeep([ + 'projectname' => $projectname, + 'docker0' => [ + 'ip' => $this->getLocalIpv4('docker0'), + ], + 'live' => [ + 'root' => '', + 'uri' => '', + 'host' => '', + 'user' => $env->receive('live_host_username', 'Remote username for host of the live site', getenv('USER')), + ], + 'drupal' => [ + 'version' => '8', + ], + 'php' => [ + 'version' => '7.0', + 'xdebug' => 1, + ], + 'webserver' => [ + 'type' => 'nginx', + 'version' => '1.13', + ], + 'varnish' => [ + 'enable' => 0, + ], + 'redis' => [ + 'version' => '4.0', + ], + 'adminer' => [ + 'version' => '4.3', + ], + 'solr' => [ + 'enable' => 0, + 'version' => '6.6', + ], + 'node' => [ + 'enable' => 0, + 'key' => '', + 'path' => '', + ], + 'memcached' => [ + 'enable' => 0, + ], + 'rsyslog' => [ + 'enable' => 0, + ], + 'athenapdf' => [ + 'enable' => 0, + 'key' => '', + ], + 'blackfire' => [ + 'enable' => 0, + 'id' => '', + 'token' => '', + ], + 'webgrind' => [ + 'enable' => 0, + ], + ], $extra['docker4drupal']); return $options; } @@ -271,13 +276,9 @@ class Handler { * * @param $command * Git command name, arguments and/or options. - * @throws \Exception */ protected function git($command) { - passthru(escapeshellcmd('git -c "user.email=d8-project@lakedrops.com" ' . $command), $exit_code); - if ($exit_code !== 0) { - throw new \Exception('Git returned a non-zero exit code'); - } + passthru(escapeshellcmd('git -c "user.email=d8-project@lakedrops.com" ' . $command)); } private function getLocalIpv4($interface = NULL) { diff --git a/src/NestedArray.php b/src/NestedArray.php new file mode 100644 index 0000000..e36c072 --- /dev/null +++ b/src/NestedArray.php @@ -0,0 +1,29 @@ +<?php + +namespace LakeDrops\Docker4Drupal; + +class NestedArray { + + public static function mergeDeep() { + return self::mergeDeepArray(func_get_args()); + } + + public static function mergeDeepArray(array $arrays, $preserve_integer_keys = FALSE) { + $result = []; + foreach ($arrays as $array) { + foreach ($array as $key => $value) { + if (is_int($key) && !$preserve_integer_keys) { + $result[] = $value; + } + elseif (isset($result[$key]) && is_array($result[$key]) && is_array($value)) { + $result[$key] = self::mergeDeepArray([$result[$key], $value], $preserve_integer_keys); + } + else { + $result[$key] = $value; + } + } + } + return $result; + } + +} -- GitLab