utility scripts to composer install from local satis cache
authorPaul Mehrer <p.mehrer@metaways.de>
Wed, 27 Jan 2016 15:56:23 +0000 (16:56 +0100)
committerPhilipp Schüle <p.schuele@metaways.de>
Mon, 8 Feb 2016 16:49:19 +0000 (17:49 +0100)
* see readme file for further info and instructions

Change-Id: If8799630e48278c84ba2e7a4a385771ee40689ea
Reviewed-on: http://gerrit.tine20.com/customers/2633
Tested-by: Jenkins CI (http://ci.tine20.com/)
Reviewed-by: Philipp Schüle <p.schuele@metaways.de>
scripts/packaging/composer/README.md [new file with mode: 0644]
scripts/packaging/composer/composerLockRewrite.php [new file with mode: 0644]
scripts/packaging/composer/satisDirectoryGlitch.php [new file with mode: 0644]

diff --git a/scripts/packaging/composer/README.md b/scripts/packaging/composer/README.md
new file mode 100644 (file)
index 0000000..17f44e6
--- /dev/null
@@ -0,0 +1,26 @@
+composer helper scripts
+--------------------
+
+Find/add composer helper scripts here.
+
+
+satis helper scripts (composerLockRewrite / satisDirectoryGlitch)
+--------------------
+
+Use these scripts to composer install from satis "proxy"
+
+first use composerLockRewrite.php to fix composer.json and composer.lock
+
+for example:
+
+php ./composerLockRewrite.php ../../../tine20/composer.lock
+
+if you want to access another satis host, you can include the hostname (or IP) as param:
+
+php ./composerLockRewrite.php ../../../tine20/composer.lock localhost
+
+then use satisDirectoryGlitch.php to move the zend libraries to the right place:
+
+for example:
+
+php ./satisDirectoryGlitch.php ../../../tin20/vendor/zendframework/
\ No newline at end of file
diff --git a/scripts/packaging/composer/composerLockRewrite.php b/scripts/packaging/composer/composerLockRewrite.php
new file mode 100644 (file)
index 0000000..277b23e
--- /dev/null
@@ -0,0 +1,135 @@
+<?php
+/**
+ * @package     HelperScripts
+ * @subpackage  Composer
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Paul Mehrer <p.mehrer@metaways.de>
+ * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+
+if ( $_SERVER['argc'] < 2) {
+    usage();
+}
+
+$file = $_SERVER['argv'][1];
+if ( !is_file($file) ) {
+    echo $file . ' is no file' . PHP_EOL;
+    usage();
+}
+
+print_r($_SERVER['argv']);
+
+// second param may contain satis ip address / hostname
+$host = (isset($_SERVER['argv'][2])) ? $_SERVER['argv'][2] : '79.99.84.34';
+
+$file1 = dirname($file) . '/composer.json';
+if ( !is_file($file1) ) {
+    echo $file1 . ' is no file' . PHP_EOL;
+    usage();
+}
+
+$filecontents = file_get_contents($file1);
+if (false === $filecontents) {
+    echo 'could not get file content of ' . $file1 . PHP_EOL;
+    usage();
+}
+
+$jsonComposer = json_decode($filecontents);
+if (null === $jsonComposer) {
+    echo 'failed to json decode file ' . $file1 . PHP_EOL;
+    exit(2);
+}
+
+$var = (object)array('type' => 'composer', 'url' => 'http://' . $host);
+$var1 = (object)array('packagist' => false);
+
+$jsonComposer->repositories = array($var, $var1);
+// we need to replace "_empty_" with the empty string as this breaks autoloading
+$jsonEncodedComposerJson = str_replace('_empty_', '', json_encode($jsonComposer, JSON_PRETTY_PRINT));
+file_put_contents($file1, $jsonEncodedComposerJson);
+unset($jsonComposer);
+unset($file1);
+
+
+$filecontents = file_get_contents($file);
+if (false === $filecontents) {
+    echo 'could not get file content of ' . $file . PHP_EOL;
+    usage();
+}
+
+
+$jsonComposerLock = json_decode($filecontents);
+if (null === $jsonComposerLock) {
+    echo 'failed to json decode file ' . $file . PHP_EOL;
+    exit(2);
+}
+
+
+$filecontents = file_get_contents('http://' . $host . '/packages.json');
+if (false === $filecontents) {
+    echo 'could not get remote content of http://' . $host . '/packages.json' . PHP_EOL;
+    exit(3);
+}
+
+
+$jsonSatis = json_decode($filecontents, true);
+if (null === $jsonSatis) {
+    echo 'failed to json decode remote content of http://' . $host . '/packages.json' . PHP_EOL;
+    exit(4);
+}
+
+
+if (isset($jsonSatis['includes']) && is_array($jsonSatis['includes'])) {
+    $tmp = '';
+    $tmp1 = $jsonSatis;
+    foreach ($jsonSatis['includes'] as $key => $val) {
+        $filecontents = file_get_contents('http://' . $host . '/' . $key);
+        if (false === $filecontents) {
+            echo 'could not get remote content of http://' . $host . '/' . $key . PHP_EOL;
+            exit(5);
+        }
+        $tmp = json_decode($filecontents, true);
+        if (null === $tmp) {
+            echo 'failed to json decode remote content of http://' . $host . '/' . $key . PHP_EOL;
+            exit(6);
+        }
+        $tmp1 = array_merge_recursive($tmp1, $tmp);
+    }
+    unset($tmp);
+    $jsonSatis = $tmp1;
+    unset($tmp1);
+}
+unset($filecontents);
+
+loopArray($jsonComposerLock->packages);
+loopArray($jsonComposerLock->{'packages-dev'});
+
+function loopArray(array &$a)
+{
+    global $jsonSatis;
+    foreach ($a as $package) {
+        if (!isset($jsonSatis['packages'][$package->name])) {
+            echo 'could not find package ' . $package->name . PHP_EOL;
+            continue;
+        }
+        if (!isset($jsonSatis['packages'][$package->name][$package->version])) {
+            echo 'could not find version ' . $package->version . '  for package ' . $package->name . PHP_EOL;
+            continue;
+        }
+        echo 'found version ' . $package->version . '  for package ' . $package->name . PHP_EOL;
+
+        $package->dist->type = $jsonSatis['packages'][$package->name][$package->version]['dist']['type'];
+        $package->dist->url = $jsonSatis['packages'][$package->name][$package->version]['dist']['url'];
+        $package->dist->reference = $jsonSatis['packages'][$package->name][$package->version]['dist']['reference'];
+        $package->dist->shasum = $jsonSatis['packages'][$package->name][$package->version]['dist']['shasum'];
+    }
+}
+
+file_put_contents($file, json_encode($jsonComposerLock, JSON_PRETTY_PRINT));
+
+
+function usage()
+{
+    echo __FILE__ . ' path/to/composer.lock [172.123.13.171]' . PHP_EOL;
+    exit(1);
+}
\ No newline at end of file
diff --git a/scripts/packaging/composer/satisDirectoryGlitch.php b/scripts/packaging/composer/satisDirectoryGlitch.php
new file mode 100644 (file)
index 0000000..7b3142a
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @package     HelperScripts
+ * @subpackage  Composer
+ * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
+ * @author      Paul Mehrer <p.mehrer@metaways.de>
+ * @copyright   Copyright (c) 2016 Metaways Infosystems GmbH (http://www.metaways.de)
+ */
+
+if ( $_SERVER['argc'] < 2)
+    usage();
+
+$dir = $_SERVER['argv'][1];
+if ( !is_dir($dir) ) {
+    echo $dir . ' is no directory' . PHP_EOL;
+    usage();
+}
+
+
+iterateDir(new DirectoryIterator($dir));
+
+
+
+function iterateDir(DirectoryIterator $iterator)
+{
+    foreach ($iterator as $dir) {
+        if (!$dir->isDir() || strpos($dir->getFilename(), '.') === 0) continue;
+        if ('src' === $dir->getFilename()) {
+            $realName = basename($dir->getPath());
+            $baseDir = dirname($dir->getPath());
+            if ( !rename($dir->getPathname(), $baseDir.'/myTMP') ) break;
+            exec('rm -rf '.$baseDir.'/'.$realName);
+            rename($baseDir.'/myTMP', $baseDir.'/'.$realName);
+            break;
+        }
+        iterateDir(new DirectoryIterator($dir->getPathname()));
+    }
+}
+
+
+function usage()
+{
+    echo __FILE__ . ' path/to/vendordir' . PHP_EOL;
+    exit(1);
+}
\ No newline at end of file