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 $name = basename($phar, ".ext.phar");
40 $data = new Phar($phar);
41 $meta = $data->getMetadata();
45 $release = $meta["release"];
47 $release = substr($name, strlen($package)+
1);
50 foreach (["", ".gz", ".bz2"] as $enc) {
52 if (!is_file($file)) {
56 foreach (SIGS
as $sigtyp => $sigext) {
57 if (file_exists($sigdat = sigof($file, $sigext))) {
58 $sigs[$sigtyp] = $sigdat;
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");
66 uksort($versions[$release], function($a, $b) {
69 if ($al < $bl) return -1;
70 if ($al > $bl) return 1;
74 uksort($versions, "version_compare");
78 function package_info($package) {
79 if (($xml = simplexml_load_file("phars/$package/info.xml"))) {
81 "title" => (string) $xml->s
,
82 "description" => (string) $xml->d
,
83 "license" => (string) $xml->l
88 $packages = array_map("basename", glob("phars/*", GLOB_NOSORT|GLOB_ONLYDIR
));
89 sort($packages, SORT_NATURAL|SORT_FLAG_CASE
);
91 if (in_array($_SERVER["QUERY_STRING"], $packages, true)) {
92 $package = $_SERVER["QUERY_STRING"];
98 if (!defined("INCLUDED")) {
99 if (($acc = $req->getHeader("Accept", Header
::class))) {
100 $neg = basename($acc->negotiate(["text/html", "application/json"]));
104 include_once "$neg.php";