7c6b9af7ec5acb99b86aee0e3332d4a28aff458c
[pharext/replicator.pharext.org] / bin / pecl+sig
1 #!/usr/bin/php -dphar.readonly=0
2 <?php
3
4 ini_set("display_errors", 0);
5 ini_set("log_errors", 1);
6
7 /* needed for the packager, so the pharstub task can find includes */
8 set_include_path(__DIR__."/../vendor/m6w6/pharext/src:".get_include_path());
9
10 $what = !empty($argv[1]) ? $argv[1] : "latest";
11 $pids = [];
12
13 function skip($skp) {
14 $dir = dirname($skp);
15 if (is_dir($dir) || mkdir(dirname($skp), 0755, true)) {
16 touch($skp);
17 }
18 }
19
20 function fail($pkg, $ver, $skp, $fmt) {
21 $msg = call_user_func_array("sprintf", array_slice(func_get_args(), 3));
22 fprintf(STDERR, "FAILURE: %s-%s, %s; skipping next time\n", $pkg, $ver, $msg);
23 skip($skp);
24 }
25
26 function sign($pkg, $ext) {
27 $fmt = "%s/%s-sign %s %s%s";
28 foreach (["rsa", "gpg"] as $sig) {
29 foreach (["", ".gz", ".bz2"] as $typ) {
30 passthru(sprintf($fmt, __DIR__, $sig, $pkg, $ext, $typ));
31 }
32 }
33 }
34
35 function info($pkg, $dir) {
36 $pkg = strtolower($pkg);
37 $inf = file_get_contents("https://pecl.php.net/rest/p/$pkg/info.xml");
38 if ($inf) {
39 file_put_contents("$dir/info.xml", $inf);
40 }
41 }
42
43 function wait(&$pids) {
44 $status = null;
45 switch ($pid = pcntl_wait($status)) {
46 case -1:
47 // meh
48 break;
49 default:
50 extract($pids[$pid]);
51 unset($pids[$pid]);
52 if (pcntl_wifexited($status) && ($rc = pcntl_wexitstatus($status))) {
53 fail($pkg, $ver, $skp, "exit code: %d", $rc);
54 } elseif (pcntl_wifsignaled($status) && ($rc = pcntl_wtermsig($status))) {
55 fail($pkg, $ver, $skp, "signal: %d", $rc);
56 } else {
57 printf("SUCCESS: %s-%s\n", $pkg, $ver);
58 /* create skipfile, ensuring we do not build a package with
59 * different name in registry/package.xml again
60 */
61 skip($skp);
62 /* create signatures */
63 sign($pkg, $ext);
64 }
65 break;
66 }
67 return $pid > 0;
68 };
69
70 function work($url, $dir) {
71 is_dir($dir) || mkdir($dir, 0777, true);
72 require_once __DIR__."/../vendor/autoload.php";
73 $packager = new pharext\Packager;
74 $packager->run(5, [
75 $_SERVER["argv"][0],
76 "-qps",
77 $url,
78 "-Zzd",
79 $dir
80 ]);
81 };
82
83 if (($sxe = simplexml_load_file("https://pecl.php.net/feeds/$what.rss"))) {
84 foreach ($sxe->item as $item) {
85 list($pkg, $ver) = explode(" ", (string) $item->title);
86 $url = sprintf("https://pecl.php.net/get/%s/%s", $pkg, $ver);
87 $skp = sprintf("%s/../skip/%s/%s", __DIR__, $pkg, $ver);
88 $ext = sprintf("%s/../public/phars/%s/%s-%s.ext.phar", __DIR__, $pkg, $pkg, $ver);
89 $dir = dirname($ext);
90
91 if (!is_file($skp) && !is_file($ext)) {
92 switch ($pid = pcntl_fork()) {
93 case -1:
94 exit;
95 case 0:
96 work($url, $dir);
97 info($pkg, $dir);
98 exit;
99 default:
100 $pids[$pid] = compact("url", "pkg", "ver", "skp", "ext", "dir");
101 break;
102 }
103 }
104
105 if (count($pids) > 5) {
106 wait($pids);
107 }
108 }
109 while (wait($pids))
110 ;
111
112 }
113
114