Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/feeds.php
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-05-22 13:07:33 +0200
committerErich Eckner <git@eckner.net>2019-05-22 13:07:33 +0200
commita81b7c142b680d5d5526a6e4c1865dcad245600f (patch)
tree70b862cfebcd92a5289bf2efadbdcd3561207b05 /feeds.php
parent862c6228c1d4e167aff65ab5bbb6ec78b99f173e (diff)
feed.php -> feeds.php
Diffstat (limited to 'feeds.php')
-rw-r--r--feeds.php490
1 files changed, 490 insertions, 0 deletions
diff --git a/feeds.php b/feeds.php
new file mode 100644
index 0000000..70320e9
--- /dev/null
+++ b/feeds.php
@@ -0,0 +1,490 @@
+<?php
+
+require_once "init.php";
+
+require_once BASE . "/lib/mysql.php";
+
+$uri_parts = explode('/', $_SERVER['REQUEST_URI']);
+
+if ($uri_parts[0] != '' || $uri_parts[1] != 'feeds')
+ throw_http_error(422, 'Unprocessable Entity');
+
+$last = array_pop($uri_parts);
+if ($last != '')
+ array_push($uri_parts, $last);
+
+array_splice(
+ $uri_parts,
+ 0, 2
+);
+
+if (count($uri_parts) == 0) { // index page
+
+ require_once BASE . "/lib/style.php";
+ require_once BASE . "/lib/format.php";
+
+ print_header("RSS - Feeds");
+
+ $result = mysql_run_query(
+ "SELECT DISTINCT `architectures`.`name` FROM `architectures`" .
+ mysql_join_architectures_repositories() .
+ " WHERE `repositories`.`is_on_master_mirror`" .
+ " ORDER BY `name`"
+ );
+ $archs = array();
+ while ($row = $result -> fetch_assoc())
+ $archs[$row['name']] = $row['name'] . '/';
+
+ $print_archs = array_merge(
+ array(
+ '' => '',
+ 'All Arches' => 'all/'
+ ),
+ $archs
+ );
+
+ $result = mysql_run_query(
+ "SELECT DISTINCT `repositories`.`name` FROM `repositories` WHERE `repositories`.`is_on_master_mirror` ORDER BY `name`"
+ );
+ $repos = array();
+ while ($row = $result -> fetch_assoc())
+ $repos[$row['name']] = $row['name'] . '/';
+
+ $print_repos = array_merge(
+ array(
+ 'All Repos' => ''
+ ),
+ $repos
+ );
+
+ $bugtracker_projects = array(
+ 0 => 'All Projects',
+ 1 => 'Arch Linux 32'
+ );
+
+ $bugtracker_operations = array(
+ 'Opened' => '',
+ 'Edited' => 'topic=edit&',
+ 'Closed' => 'topic=clo&'
+ );
+
+ function print_arches_header() {
+ global $print_archs;
+ foreach ($print_archs as $arch => $dummy) {
+ print " <th>\n";
+ print " " . $arch . "\n";
+ print " </th>\n";
+ };
+ }
+
+ function print_feeds($prefix) {
+ global $print_archs;
+ global $print_repos;
+ foreach ($print_repos as $repo => $dummy) {
+ print " <tr>\n";
+ print " <td>\n";
+ print " <strong>" . $repo . "</strong>\n";
+ print " </td>\n";
+ foreach ($print_archs as $arch => $dummy) {
+ if ($arch == '')
+ continue;
+ print " <td>\n";
+ print " <a href=\"/feeds/packages/" . $prefix . $print_archs[$arch] . $print_repos[$repo] . "\" class=\"rss\">Feed</a>\n";
+ print " </td>\n";
+ }
+ print " </tr>\n";
+ }
+ }
+
+ function print_feeds_table($prefix) {
+ print " <table class=\"pretty2\">\n";
+ print " <thead>\n";
+ print " <tr>\n";
+ print_arches_header();
+ print " </tr>\n";
+ print " </thead>\n";
+ print " <tbody>\n";
+ print_feeds($prefix);
+ print " </tbody>\n";
+ print " </table>\n";
+ }
+
+ ?>
+ <div id="rss-feeds" class="box">
+ <h2>
+ RSS Feeds
+ </h2>
+ <p>
+ Several RSS feeds are available for consumption from the Arch32 website.
+ The majority of these are package-related and allow feeds to be customized for the updates you care about.
+ </p>
+ <h3>
+ News Feed
+ </h3>
+ <p>
+ Grab the
+ <a href="https://news.archlinux32.org/rss.php" class="rss" title="Arch Linux news feed">news item feed</a>
+ to keep up-to-date with the latest news from the Arch Linux development staff.
+ </p>
+ <h3>
+ Package Feeds
+ </h3>
+ <p>
+ If you are interested in
+ <a href="/feeds/packages/" class="rss" title="Arch Linux 32 package updates feed">all package updates</a>,
+ then grab this feed.
+ <?php
+
+ print_feeds_table('');
+
+ ?>
+ <p>
+ <s>Recently added packages.</s> (to be implemented)
+ </p>
+ <?php
+
+ // print_feeds_table('added/');
+
+ ?>
+ <p>
+ <s>Recently removed packages.</s> (to be implemented)
+ </p>
+ <?php
+
+ // print_feeds_table('removed/');
+
+ ?>
+ <h3>
+ Release Feed
+ </h3>
+ <p>
+ Grab the
+ <a href="/feeds/releases/" class="rss" title="Arch Linux release feed">ISO release feed</a>
+ if you want to help seed the ISO release torrents as they come out.
+ </p>
+ <h3>
+ Development Feeds
+ </h3>
+ <p>
+ Subscribe to any of the following to track bug tickets and feature requests from the
+ <a href="https://bugs.archlinux32.org/" title="Arch Linux 32 Bugs">Arch Linux 32 Bugtracker</a>:
+ </p>
+ <table class="pretty2">
+ <thead>
+ <tr>
+ <th>
+ Project
+ </th>
+ <?php
+
+ foreach ($bugtracker_operations as $label => $dummy) {
+ print " <th>\n";
+ print " Recently " . $label . " Tasks\n";
+ print " </th>\n";
+ }
+
+ ?>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+
+ foreach ($bugtracker_projects as $id => $project) {
+ print " <tr>\n";
+ print " <td>\n";
+ print " " . $project . "\n";
+ print " </td>\n";
+ foreach ($bugtracker_operations as $label => $option) {
+ print " <td>\n";
+ print " <a href=\"https://bugs.archlinux.org/feed.php?feed_type=rss2&" . $option . "project=" . $id . "\" class=\"rss\">Feed</a>\n";
+ print " </td>\n";
+ }
+ print " </tr>\n";
+ }
+
+ ?>
+ </tbody>
+ </table>
+ </div>
+ <?php
+
+ print_footer();
+
+ die();
+
+} // index page
+
+if ($uri_parts[0] == 'releases') {
+ if (count($uri_parts) != 1)
+ throw_http_error(501, "Not Implemented", '/feeds/' . implode('/',$uri_parts));
+ $available_isos = apcu_fetch('available_isos', $apcu_success);
+ if ($apcu_success == false || true) {
+ $ch = curl_init("https://mirror.archlinux32.org/archisos/");
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ $listing = curl_exec($ch);
+ curl_close($ch);
+ preg_match_all(
+ ',<a href="(archlinux-([0-9]{4}\.[0-9]{2}\.[0-9]{2})-([^.]+)\.iso)">\1</a>\s+(\S+)\s+\S+\s+([0-9]+)\s*\n,',
+ $listing,
+ $matches,
+ PREG_SET_ORDER
+ );
+ $available_isos = array();
+ foreach ($matches as $match) {
+ $available_isos[] = array(
+ 'file' => $match[1],
+ 'title' => $match[2] . '-' . $match[3],
+ 'build_date' => strtotime(str_replace('.', '-', $match[2])),
+ 'build_type' => $match[3],
+ 'release_date' => $match[4],
+ 'size' => $match[5]
+ );
+ }
+ apcu_store('available_isos', $available_isos, 3600);
+ }
+
+ header('Content-Type: application/rss+xml; charset=utf-8');
+ print "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
+ print "<rss version=\"2.0\">";
+ print "<channel>";
+ print "<title>";
+ print "Arch Linux 32: Releases";
+ print "</title>";
+ print "<link>";
+ print "https://www.archlinux32.org/download/";
+ print "</link>";
+ print "<description>";
+ print "Release ISOs";
+ print "</description>";
+ print "<atom:link href=\"https://www.archlinux32.org/feeds/releases/\" rel=\"self\">";
+ print "</atom:link>";
+ print "<language>";
+ print "en-us";
+ print "</language>";
+ print "<lastBuildDate>";
+ print date('Y-m-d', $available_isos[0]['build_date']);
+ print "</lastBuildDate>";
+ foreach ($available_isos as $available_iso) {
+ print "<item>";
+ print "<title>";
+ print $available_iso['title'];
+ print "</title>";
+ // TODO: link to iso description (do we want that?)
+ print "<description>";
+ print "</description>";
+ print "<pubDate>";
+ print date('Y-m-d', $available_iso['release_date']);
+ print "</pubDate>";
+ // TODO: guid
+ print "<enclosure length=\"";
+ print date('Y-m-d', $available_iso['size']);
+ print "\" type=\"application/x-bittorrent\">";
+ // TODO: url=\"https://www.archlinux32.org/iso/2019.02.01/archlinux-2019.02.01-x86_64.iso.torrent\">";
+ print "</enclosure>";
+ print "</item>";
+ }
+ print "</channel>";
+ print "</rss>";
+
+ die();
+} // releases
+
+if ($uri_parts[0] == 'packages') {
+
+ array_splice(
+ $uri_parts,
+ 0, 1
+ );
+
+// TODO: implement "added" and "removed" - but how?
+// $actions = array('' => '', 'added' => 'added', 'removed' => 'removed');
+ $actions = array('' => '');
+ $archs = array('all' => 'all');
+ $result = mysql_run_query(
+ "SELECT DISTINCT `architectures`.`name` FROM `architectures`" .
+ mysql_join_architectures_repositories() .
+ " WHERE `repositories`.`is_on_master_mirror`" .
+ " ORDER BY `name`"
+ );
+ while ($row = $result -> fetch_assoc())
+ $archs[$row['name']] = $row['name'];
+ $repos = array('' => '');
+ $result = mysql_run_query(
+ "SELECT DISTINCT `repositories`.`name` FROM `repositories` WHERE `repositories`.`is_on_master_mirror` ORDER BY `name`"
+ );
+ while ($row = $result -> fetch_assoc())
+ $repos[$row['name']] = $row['name'];
+
+ if (count($uri_parts) > 0 && array_key_exists($uri_parts[0], $actions)) {
+ $action = $uri_parts[0];
+ $action_filter = 'unimplemented';
+ array_splice(
+ $uri_parts,
+ 0, 1
+ );
+ }
+ else {
+ $action = '';
+ $action_filter = '`repositories`.`is_on_master_mirror`';
+ }
+
+ if (count($uri_parts) > 0) {
+ if (!array_key_exists($uri_parts[0], $archs))
+ throw_http_error(501, "Not Implemented", implode('/',$uri_parts));
+ $arch = $uri_parts[0];
+ $arch_filter = ' AND `r_a`.`name`="' . $arch . '"';
+ array_splice(
+ $uri_parts,
+ 0, 1
+ );
+ }
+ else {
+ $arch = '';
+ $arch_filter = '';
+ }
+
+ if (count($uri_parts) > 0) {
+ if (!array_key_exists($uri_parts[0], $repos))
+ throw_http_error(501, "Not Implemented", implode('/',$uri_parts));
+ $repo = $uri_parts[0];
+ $repo_filter = ' AND `repositories`.`name`="' . $repo . '"';
+ array_splice(
+ $uri_parts,
+ 0, 1
+ );
+ }
+ else {
+ $repo = '';
+ $repo_filter = '';
+ }
+
+ if (count($uri_parts) != 0)
+ throw_http_error(501, "Not Implemented", implode('/',$uri_parts));
+
+ $result = mysql_run_query(
+ "SELECT MAX(`build_assignments`.`return_date`) AS `max_build_date`" .
+ " FROM `build_assignments`" .
+ mysql_join_build_assignments_binary_packages() .
+ mysql_join_binary_packages_binary_packages_in_repositories() .
+ mysql_join_binary_packages_in_repositories_repositories() .
+ mysql_join_repositories_architectures("", "r_a") .
+ " WHERE " . $action_filter . $repo_filter . $arch_filter
+ );
+ $max_build_date = $result -> fetch_assoc();
+ $max_build_date = $max_build_date['max_build_date'];
+
+ $result = mysql_run_query(
+ "SELECT `binary_packages`.`pkgname`," .
+ "`binary_packages`.`epoch`," .
+ "`binary_packages`.`pkgver`," .
+ "`binary_packages`.`pkgrel`," .
+ "`binary_packages`.`sub_pkgrel`," .
+ "`binary_packages`.`sub_pkgrel_omitted`," .
+ "`architectures`.`name` AS `architecture`," .
+ "`repositories`.`name` AS `repo`," .
+ "`r_a`.`name` AS `r_a`," .
+ "`binary_packages_in_repositories`.`last_moved`" .
+ " FROM `binary_packages`" .
+ mysql_join_binary_packages_binary_packages_in_repositories() .
+ mysql_join_binary_packages_in_repositories_repositories() .
+ mysql_join_repositories_architectures("", "r_a") .
+ mysql_join_binary_packages_architectures() .
+ " WHERE " . $action_filter . $repo_filter . $arch_filter .
+ " ORDER BY `binary_packages_in_repositories`.`last_moved` DESC" .
+ " LIMIT 50"
+ );
+ $packages = array();
+ while ($row = $result -> fetch_assoc())
+ $packages[] = $row;
+
+ header('Content-Type: application/rss+xml; charset=utf-8');
+
+ print "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
+ print "<rss version=\"2.0\">";
+ print "<channel>";
+ print "<title>";
+ print "Arch Linux 32: ";
+ switch ($action) {
+ case '':
+ print "Recent package updates";
+ break;
+ case 'added':
+ print "Recent added packages";
+ break;
+ case 'removes':
+ print "Recent removed packages";
+ break;
+ }
+ if ($arch != 'all')
+ print " (" . $arch;
+ if ($repo != '')
+ print " [" . $repo . "]";
+ if ($arch != '')
+ print ")";
+ print "</title>";
+ print "<link>";
+ print "https://www.archlinux32.org/packages/";
+ print "</link>";
+ print "<description>";
+ switch ($action) {
+ case '':
+ print "Recently updated packages in the Arch Linux 32 package repositories";
+ break;
+ case 'added':
+ print "Recently added packages to the Arch Linux 32 package repositories";
+ break;
+ case 'removes':
+ print "Recently removed packages from the Arch Linux 32 package repositories";
+ break;
+ }
+ if ($arch != 'all')
+ print " for the '" . $arch . "' architecture (including 'any' packages)";
+ else
+ print " for all architectures";
+ if ($repo != '')
+ print " in the [" . $repo . "] repository";
+ print ".";
+ print "</description>";
+ print "<atom:link href=\"https://www.archlinux32.org" . $_SERVER['REQUEST_URI'] . "\" rel=\"self\">";
+ print "</atom:link>";
+ print "<language>";
+ print "en-us";
+ print "</language>";
+ print "<lastBuildDate>";
+ print $max_build_date;
+ print "</lastBuildDate>";
+ foreach ($packages as $package) {
+ print "<item>";
+ print "<title>";
+ print $package['pkgname'];
+ if ($package['epoch'] != 0)
+ print $package['epoch'] . ":";
+ print $package['pkgver'] . "-" . $package['pkgrel'];
+ if (!$package['sub_pkgrel_omitted'])
+ print '.' . $package['sub_pkgrel'];
+ print ' ' . $package['architecture'];
+ print "</title>";
+ print "<link>";
+ print "https://www.archlinux32.org/packages/" . $package['repo'] . "/" . $package['r_a'] . "/" . $package['pkgname'] . "/";
+ print "</link>";
+// TODO: description
+ print "<pubDate>";
+ print $package['last_moved'];
+ print "</pubDate>";
+// TODO: guid
+ print "<category>";
+ print $package['repo'];
+ print "</category>";
+ print "<category>";
+ print $package['r_a'];
+ print "</category>";
+ print "</item>";
+ }
+ print "</channel>";
+ print "</rss>";
+
+ die();
+
+} // packages
+
+throw_http_error(501, "Not Implemented");