[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1057431: fakeupstream.cgi: add support for static.rust-lang.org



Package: qa.debian.org
Severity: wishlist
Tags: patch
X-Debbugs-Cc: zixing.liu@canonical.com

Hi Debian QA Team,

I would like to see a fakeupstream service implemented for 
https://static.rust-lang.org/dist so that the debian/watch file inside the
rustc package could be simplified and actually useful for checking new
releases.

Attached below is a patch that I proposed to add the said functionality.
You can find the same patch at:
 https://salsa.debian.org/qa/qa/-/merge_requests/48
if you prefer using Debian Salsa to merge the patch/merge request.

Thanks,
Zixing
>From 9bbd2ecffe31822cf2a77ed0ce9ed69f78931aee Mon Sep 17 00:00:00 2001
From: liushuyu <liushuyu011@gmail.com>
Date: Mon, 23 Oct 2023 22:27:29 -0600
Subject: [PATCH] cgi-bin/fakeupstream.cgi: add support ...

... for monitoring Rust releases
---
 cgi-bin/fakeupstream.cgi | 77 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)

diff --git a/cgi-bin/fakeupstream.cgi b/cgi-bin/fakeupstream.cgi
index c13538e8..718b2540 100755
--- a/cgi-bin/fakeupstream.cgi
+++ b/cgi-bin/fakeupstream.cgi
@@ -26,6 +26,8 @@ use JSON;
 use File::Temp qw/ tempdir /;
 use Date::Format;
 use Date::Parse;
+use Time::Piece;
+use Time::Seconds qw(ONE_DAY);
 use Dpkg::Version;
 use threads;
 use constant MAX_THREADS => 3;
@@ -1110,6 +1112,81 @@ elsif( $upstream_param =~ m%^google-fonts/($project_char_re+)/($project_char_re+
 	exit 0;
 }
 
+elsif( $upstream_param eq 'rustc' )
+{
+	my $ua = LWP::UserAgent->new;
+
+	sub fetch_rust_github_tags($) {
+		my $ua = shift;
+		my @versions;
+		my $page_number = 1;
+		my $per_page = 100;
+		my $url = "https://api.github.com/repos/rust-lang/rust/tags?per_page=$per_page";;
+		while (1) {
+			my $response = $ua->get( "$url&page=$page_number" );
+			return_error( "failed to read $url : $response->status_line" ) if( not $response->is_success );
+			my $json = JSON::decode_json( $response->decoded_content );
+			foreach my $version (@{$json}) {
+				my $version_name = $version->{"name"};
+				if ( $version_name =~ /^\d+\.\d+\.\d+$/ ) {
+					push @versions, $version_name;
+				}
+			}
+			last if (scalar @versions) < $per_page;
+		}
+		$page_number++;
+		return @versions;
+	}
+
+	sub fetch_rust_last_unstable_date($$) {
+		my $ua = shift;
+		my $channel = shift;
+		my $url = "https://static.rust-lang.org/dist/channel-rust-$channel-date.txt";;
+		my $response = $ua->get ( $url );
+		return_error( "failed to read $url : $response->status_line" ) unless( $response->is_success );
+		return $response->decoded_content;
+	}
+
+	sub make_header($) {
+		my $channel = shift;
+		my $title = "Rust toolchain version listing ($channel)";
+		print $q->header;
+		print $q->start_html({ -title => $title });
+		print $q->h1($title) . "\n";
+		print $q->start_ul;
+	}
+
+	$type_param = 'stable' unless $type_param;
+	my $channel = $type_param;
+
+	if ($channel eq 'stable') {
+		my @tags = fetch_rust_github_tags( $ua );
+		make_header($channel);
+		foreach my $version (@tags) {
+			print $q->li( $q->a( { -href => "https://static.rust-lang.org/dist/rustc-$version-src.tar.xz"; }, $version ) );
+		}
+	} else {
+		my $last_date = fetch_rust_last_unstable_date ( $ua, $channel );
+		my $limit = 10;
+		make_header($channel);
+		print $q->p( "For unstable channels, only releases within the last $limit days are listed." );
+		while ($limit > 0) {
+			my $response = $ua->get( "https://static.rust-lang.org/dist/$last_date/channel-rust-$channel.toml"; );
+			if ($response->is_success()) {
+				if ($response->decoded_content =~ /(1\.\d+\.\d+-(?:nightly|beta)(?:\.\d+)?\s+\([0-9a-f]{9}\s+\d+-\d+-\d+\))/) {
+					print $q->li( $q->a( { -href => "https://static.rust-lang.org/dist/$last_date/rustc-$channel-src.tar.xz"; }, $1 ) );
+				}
+			}
+			my $next_last_date = Time::Piece->strptime($last_date, "%Y-%m-%d") - ONE_DAY;
+			$last_date = $next_last_date->ymd;
+			$limit--;
+		}
+	}
+
+	print $q->end_ul;
+	print $q->end_html;
+	exit 0;
+}
 
 my %upstream_info_per_package =
 (
-- 
GitLab


Reply to: