fix hogging by opening each phar; need to do more about that
[pharext/replicator.pharext.org] / public / index.php
1 <?php
2
3 use http\Env\Request;
4 use http\Env\Response;
5 use http\Header;
6
7 const UNITS = ["Bytes", "KB", "MB"];
8 const SIGS = ["rsa" => "sig", "gpg" => "asc"];
9
10 function human_size($s) {
11 $l = floor(log10($s));
12 return sprintf("%1.1F %s", $s/pow(10,$l-($l%3)), UNITS[$l/3]);
13 }
14
15 function human_date($t) {
16 $d = date_create("@".$_SERVER["REQUEST_TIME"]);
17 for ($i = 1; $i < 7; ++$i) {
18 if ($t > $d->modify("-$i days")->format("U")) {
19 switch ($i) {
20 case 1:
21 return "today";
22 case 2:
23 return "yesterday";
24 default:
25 return "$i days ago";
26 }
27 }
28 }
29 return gmdate("Y-m-d", $t);
30 }
31
32 function sigof($phar, $typ) {
33 return str_replace("phars/", "sigs/", $phar) . ".$typ";
34 }
35
36 function package_versions($package) {
37 $versions = [];
38 foreach (glob("phars/$package/*.ext.phar") as $phar) {
39 $name = basename($phar, ".ext.phar");
40 $data = new Phar($phar);
41 $meta = $data->getMetadata();
42 unset($data);
43
44 if ($meta) {
45 $release = $meta["release"];
46 } else {
47 $release = substr($name, strlen($package)+1);
48 }
49
50 foreach (["", ".gz", ".bz2"] as $enc) {
51 $file = $phar . $enc;
52 if (!is_file($file)) {
53 continue;
54 }
55
56 foreach (SIGS as $sigtyp => $sigext) {
57 if (file_exists($sigdat = sigof($file, $sigext))) {
58 $sigs[$sigtyp] = $sigdat;
59 }
60 }
61 $size = filesize($file);
62 $date = isset($meta["date"]) ? strtotime($meta["date"]) : filemtime($file);
63 $pharext = isset($meta["version"]) ? $meta["version"] : "2.0.1";
64 $versions[$release][$enc] = ["phar" => $file] + compact("date", "size", "pharext", "sigs");
65 }
66 uksort($versions[$release], function($a, $b) {
67 $al = strlen($a);
68 $bl = strlen($b);
69 if ($al < $bl) return -1;
70 if ($al > $bl) return 1;
71 return 0;
72 });
73 }
74 uksort($versions, "version_compare");
75 return $versions;
76 }
77
78 function package_info($package) {
79 if (($xml = simplexml_load_file("phars/$package/info.xml"))) {
80 return [
81 "title" => (string) $xml->s,
82 "description" => (string) $xml->d,
83 "license" => (string) $xml->l
84 ];
85 }
86 }
87
88 $packages = array_map("basename", glob("phars/*", GLOB_NOSORT|GLOB_ONLYDIR));
89 sort($packages, SORT_NATURAL|SORT_FLAG_CASE);
90
91 if (in_array($_SERVER["QUERY_STRING"], $packages, true)) {
92 $package = $_SERVER["QUERY_STRING"];
93 }
94
95 $res = new Response;
96 $req = new Request;
97
98 if (!defined("INCLUDED")) {
99 if (($acc = $req->getHeader("Accept", Header::class))) {
100 $neg = basename($acc->negotiate(["text/html", "application/json"]));
101 } else {
102 $neg = "html";
103 }
104 include_once "$neg.php";
105 }