diff --git a/pulp_python/app/pypi/views.py b/pulp_python/app/pypi/views.py index e228d88d..7cbff28f 100644 --- a/pulp_python/app/pypi/views.py +++ b/pulp_python/app/pypi/views.py @@ -4,6 +4,7 @@ from pathlib import PurePath from urllib.parse import urljoin, urlparse, urlunsplit +import packaging_legacy.version from django.contrib.sessions.models import Session from django.core.exceptions import ObjectDoesNotExist from django.db import transaction @@ -404,14 +405,18 @@ def retrieve(self, request, path, package): if not releases: return HttpResponseNotFound(f"{normalized} does not exist.") + sorted_releases = sorted( + releases.values(), + key=lambda r: (packaging_legacy.version.parse(r["version"]), r["filename"]), + ) media_type = request.accepted_renderer.media_type headers = {"X-PyPI-Last-Serial": str(PYPI_SERIAL_CONSTANT)} if media_type == PYPI_SIMPLE_V1_JSON: - detail_data = write_simple_detail_json(normalized, releases.values()) + detail_data = write_simple_detail_json(normalized, sorted_releases) return Response(detail_data, headers=headers) else: - detail_data = write_simple_detail(normalized, releases.values()) + detail_data = write_simple_detail(normalized, sorted_releases) kwargs = {"content_type": media_type, "headers": headers} return HttpResponse(detail_data, **kwargs) diff --git a/pyproject.toml b/pyproject.toml index 3dea8ca9..faca90fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ dependencies = [ "bandersnatch>=6.6.0,<6.7", "pypi-simple>=1.8.0,<2.0", "pypi-attestations==0.0.28", # API is not stable + "packaging-legacy>=23.0,<24", ] [project.urls]