+#!/usr/bin/php -dphar.readonly=0
+<?php
+
+ini_set("display_errors", 0);
+ini_set("log_errors", 1);
+
+/* needed for the packager, so the pharstub task can find includes */
+set_include_path(__DIR__."/../vendor/m6w6/pharext/src:".get_include_path());
+
+$what = !empty($argv[1]) ? $argv[1] : "latest";
+$pids = [];
+
+function skip($skp) {
+ $dir = dirname($skp);
+ if (is_dir($dir) || mkdir(dirname($skp), 0755, true)) {
+ touch($skp);
+ }
+}
+
+function fail($pkg, $ver, $skp, $fmt) {
+ $msg = call_user_func_array("sprintf", array_slice(func_get_args(), 3));
+ fprintf(STDERR, "FAILURE: %s-%s, %s; skipping next time\n", $pkg, $ver, $msg);
+ skip($skp);
+}
+
+function sign($pkg, $ext) {
+ $fmt = "%s/bin/%s-sign %s %s";
+ foreach (["rsa", "gpg"] as $sig) {
+ passthru(sprintf($fmt, __DIR__, $sig, $pkg, $ext));
+ }
+}
+
+function wait(&$pids) {
+ $status = null;
+ switch ($pid = pcntl_wait($status)) {
+ case -1:
+ // meh
+ break;
+ default:
+ extract($pids[$pid]);
+ unset($pids[$pid]);
+ if (pcntl_wifexited($status) && ($rc = pcntl_wexitstatus($status))) {
+ fail($pkg, $ver, $skp, "exit code: %d", $rc);
+ } elseif (pcntl_wifsignaled($status) && ($rc = pcntl_wtermsig($status))) {
+ fail($pkg, $ver, $skp, "signal: %d", $rc);
+ } else {
+ printf("SUCCESS: %s-%s\n", $pkg, $ver);
+ /* create skipfile, ensuring we do not build a package with
+ * different name in registry/package.xml again
+ */
+ skip($skp);
+ /* create signatures */
+ sign($pkg, $ext);
+ }
+ break;
+ }
+ return $pid > 0;
+};
+
+function work($url, $dir) {
+ is_dir($dir) || mkdir($dir, 0777, true);
+ require_once __DIR__."/../vendor/autoload.php";
+ $packager = new pharext\Packager;
+ $packager->run(5, [
+ $_SERVER["argv"][0],
+ "-qps",
+ $url,
+ "-Zzd",
+ $dir
+ ]);
+};
+
+if (($sxe = simplexml_load_file("http://pecl.php.net/feeds/$what.rss"))) {
+ foreach ($sxe->item as $item) {
+ $url = (string) $item->link;
+ $pkg = basename(dirname($url));
+ $ver = basename($url);
+ $skp = sprintf("%s/../skip/%s/%s", __DIR__, $pkg, $ver);
+ $ext = sprintf("%s/../public/phars/%s/%s-%s.ext.phar", __DIR__, $pkg, $pkg, $ver);
+ $dir = dirname($ext);
+
+ if (!is_file($skp) && !is_file($ext)) {
+ switch ($pid = pcntl_fork()) {
+ case -1:
+ exit;
+ case 0:
+ work($url, $dir);
+ exit;
+ default:
+ $pids[$pid] = compact("url", "pkg", "ver", "skp", "ext", "dir");
+ break;
+ }
+ }
+
+ if (count($pids) > 5) {
+ wait($pids);
+ }
+ }
+ while (wait($pids))
+ ;
+
+}
+
+