touch skipfile on success
[m6w6/replicator] / bin / pecl
1 #!/usr/bin/php -dphar.readonly=0
2 <?php
3
4 ini_set("display_errors", 0);
5 ini_set("log_errors", 1);
6
7 $what = !empty($argv[1]) ? $argv[1] : "latest";
8 $pids = [];
9
10 function fail($pkg, $ver, $skp, $fmt) {
11 $msg = call_user_func_array("sprintf", array_slice(func_get_args(), 3));
12 fprintf(STDERR, "FAILURE: %s-%s, %s; skipping next time\n", $pkg, $ver, $msg);
13 touch($skp);
14 }
15
16 function wait(&$pids) {
17 $status = null;
18 switch ($pid = pcntl_wait($status)) {
19 case -1:
20 // meh
21 break;
22 default:
23 extract($pids[$pid]);
24 unset($pids[$pid]);
25 if (pcntl_wifexited($status) && ($rc = pcntl_wexitstatus($status))) {
26 fail($pkg, $ver, $skp, "exit code: %d", $rc);
27 } elseif (pcntl_wifsignaled($status) && ($rc = pcntl_wtermsig($status))) {
28 fail($pkg, $ver, $skp, "signal: %d", $rc);
29 } else {
30 printf("SUCCESS: %s-%s\n", $pkg, $ver);
31 /* create skipfile, ensuring we do not build a package with
32 * different name in registry/package.xml again
33 */
34 touch($skp);
35 }
36 break;
37 }
38 return $pid > 0;
39 };
40
41 function work($url, $dir) {
42 is_dir($dir) || mkdir($dir, 0777, true);
43 require_once __DIR__."/../vendor/autoload.php";
44 $packager = new pharext\Packager;
45 $packager->run(5, [
46 $_SERVER["argv"][0],
47 "-qps",
48 $url,
49 "-Zzd",
50 $dir
51 ]);
52 };
53
54 if (($sxe = simplexml_load_file("http://pecl.php.net/feeds/$what.rss"))) {
55 foreach ($sxe->item as $item) {
56 $url = (string) $item->link;
57 $pkg = basename(dirname($url));
58 $ver = basename($url);
59 $skp = sprintf("%s/../build/%s-%s.skip", __DIR__, $pkg, $ver);
60 $ext = sprintf("%s/../public/phars/%s/%s-%s.ext.phar", __DIR__, $pkg, $pkg, $ver);
61 $dir = dirname($ext);
62
63 if (!is_file($skp) && !is_file($ext)) {
64 switch ($pid = pcntl_fork()) {
65 case -1:
66 exit;
67 case 0:
68 work($url, $dir);
69 exit;
70 default:
71 $pids[$pid] = compact("url", "pkg", "ver", "skp", "ext", "dir");
72 break;
73 }
74 }
75
76 if (count($pids) > 5) {
77 wait($pids);
78 }
79 }
80 while (wait($pids))
81 ;
82
83 }
84
85