From acf60d41361b7d697e8eb0860c174e3e1d1c8bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Lebrun?= Date: Fri, 27 Mar 2026 10:57:28 +0100 Subject: [PATCH] query/web/api: support getting latest-rc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We support URLs like "/linux/latest/source" that redirect to the latest tagged version. But this excludes release candidates. Add a "latest-rc" that takes RCs into account. Requested by Luca. Signed-off-by: Théo Lebrun --- elixir/api.py | 5 +++-- elixir/query.py | 7 +++++-- elixir/web.py | 15 +++++++++------ utils/speedtest.py | 10 ++++++---- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/elixir/api.py b/elixir/api.py index 1574907..83fe1b2 100755 --- a/elixir/api.py +++ b/elixir/api.py @@ -43,8 +43,9 @@ class ApiIdentGetterResource: resp.status = falcon.HTTP_NOT_FOUND return - if version == 'latest': - version = query.get_latest_tag() + if version in ('latest', 'latest-rc'): + rc = version == 'latest-rc' + version = query.get_latest_tag(rc=rc) symbol_definitions, symbol_references, symbol_doccomments, _ = query.search_ident(version, ident, family) diff --git a/elixir/query.py b/elixir/query.py index 5de950a..a5f7a90 100755 --- a/elixir/query.py +++ b/elixir/query.py @@ -185,8 +185,11 @@ class Query: # Returns the latest tag that is included in the database. # This excludes release candidates. - def get_latest_tag(self): - sorted_tags = self.scriptLines('get-latest-tags') + def get_latest_tag(self, rc): + if rc: + sorted_tags = reversed(self.scriptLines('list-tags')) + else: + sorted_tags = self.scriptLines('get-latest-tags') for tag in sorted_tags: if self.db.vers.exists(tag): diff --git a/elixir/web.py b/elixir/web.py index 6eb2c28..e50fe8f 100755 --- a/elixir/web.py +++ b/elixir/web.py @@ -234,8 +234,9 @@ class SourceResource: raise ElixirProjectError('Error', 'Path contains characters that are not allowed', project=project, version=version, query=query) - if version == 'latest': - version = query.get_latest_tag() + if version in ('latest', 'latest-rc'): + rc = version == 'latest-rc' + version = query.get_latest_tag(rc=rc) resp.status = falcon.HTTP_FOUND resp.location = stringify_source_path(project, version, path) return @@ -333,8 +334,9 @@ class IdentResource(IdentPostRedirectResource): ident = validated_ident - if version == 'latest': - version = query.get_latest_tag() + if version in ('latest', 'latest-rc'): + rc = version == 'latest-rc' + version = query.get_latest_tag(rc=rc) resp.status = falcon.HTTP_FOUND resp.location = stringify_ident_path(project, version, family, ident) return @@ -361,8 +363,9 @@ class IncompleteURLRedirectResource: raise ElixirProjectError('Error', f'Unknown default project: {project}', status=falcon.HTTP_INTERNAL_SERVER_ERROR) - if version == 'latest' or len(version) == 0: - version = query.get_latest_tag() + if version in ('latest', 'latest-rc') or len(version) == 0: + rc = version == 'latest-rc' + version = query.get_latest_tag(rc=rc) resp.status = falcon.HTTP_FOUND resp.location = stringify_source_path(project, version, '/') diff --git a/utils/speedtest.py b/utils/speedtest.py index 0577f46..b943b06 100755 --- a/utils/speedtest.py +++ b/utils/speedtest.py @@ -83,14 +83,16 @@ def init_query(project): def get_ident(query, ident, version): - if version == 'latest': - version = query.get_latest_tag() + if version == ('latest', 'latest-rc'): + rc = version == 'latest' + version = query.get_latest_tag(rc=rc) return query.search_ident(version, ident[0], ident[1]) def get_file(query, path, version): - if version == 'latest': - version = query.get_latest_tag() + if version == ('latest', 'latest-rc'): + rc = version == 'latest' + version = query.get_latest_tag(rc=rc) return query.get_file(version, path)