72a97f62542632c2f024f43c8c2999339859cbfb
[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 list($name, $enc) = explode(".ext.phar", basename($phar));
40 $data = new Phar($phar);
41 $meta = $data->getMetadata();
42 if ($meta) {
43 $release = $meta["release"];
44 } else {
45 $release = substr($name, strlen($package)+1);
46 }
47
48 foreach (SIGS as $sigtyp => $sigext) {
49 if (file_exists($sigdat = sigof($phar, $sigext))) {
50 $sigs[$sigtyp] = $sigdat;
51 }
52 }
53 $size = filesize($phar);
54 $date = isset($meta["date"]) ? strtotime($meta["date"]) : filemtime($phar);
55 $pharext = isset($meta["version"]) ? $meta["version"] : "2.0.1";
56 $versions[$release][$enc] = compact("phar", "date", "size", "pharext", "sigs");
57 uksort($versions[$release], function($a, $b) {
58 $al = strlen($a);
59 $bl = strlen($b);
60 if ($al < $bl) return -1;
61 if ($al > $bl) return 1;
62 return 0;
63 });
64 }
65 uksort($versions, "version_compare");
66 return $versions;
67 }
68
69 function package_info($package) {
70 if (($xml = simplexml_load_file("phars/$package/info.xml"))) {
71 return [
72 "title" => (string) $xml->s,
73 "description" => (string) $xml->d,
74 "license" => (string) $xml->l
75 ];
76 }
77 }
78
79 $packages = array_map("basename", glob("phars/*", GLOB_NOSORT|GLOB_ONLYDIR));
80 sort($packages, SORT_NATURAL|SORT_FLAG_CASE);
81
82 if (in_array($_SERVER["QUERY_STRING"], $packages, true)) {
83 $package = $_SERVER["QUERY_STRING"];
84 }
85
86 $res = new Response;
87 $req = new Request;
88
89 if (!defined("INCLUDED")) {
90 if (($acc = $req->getHeader("Accept", Header::class))) {
91 $neg = basename($acc->negotiate(["text/html", "application/json"]));
92 } else {
93 $neg = "html";
94 }
95 include_once "$neg.php";
96 }