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