7 const UNITS
= ["Bytes", "KB", "MB"];
8 const SIGS
= ["rsa" => "sig", "gpg" => "asc"];
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]);
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")) {
29 return gmdate("Y-m-d", $t);
32 function sigof($phar, $typ) {
33 return str_replace("phars/", "sigs/", $phar) . ".$typ";
36 function package_versions($package) {
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();
43 $release = $meta["release"];
45 $release = substr($name, strlen($package)+
1);
48 foreach (SIGS
as $sigtyp => $sigext) {
49 if (file_exists($sigdat = sigof($phar, $sigext))) {
50 $sigs[$sigtyp] = $sigdat;
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) {
60 if ($al < $bl) return -1;
61 if ($al > $bl) return 1;
65 uksort($versions, "version_compare");
69 $packages = array_map("basename", glob("phars/*", GLOB_NOSORT|GLOB_ONLYDIR
));
70 sort($packages, SORT_NATURAL|SORT_FLAG_CASE
);
72 if (in_array($_SERVER["QUERY_STRING"], $packages, true)) {
73 $package = $_SERVER["QUERY_STRING"];
79 if (!defined("INCLUDED")) {
80 if (($acc = $req->getHeader("Accept", Header
::class))) {
81 $neg = basename($acc->negotiate(["text/html", "application/json"]));
85 include_once "$neg.php";