From 6de0a1536661ab9b56fe81f5c1839cee4033ee05 Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Fri, 7 Mar 2025 13:59:05 +0100 Subject: [PATCH] Revert "fix: GitHub release page no longer support `after` parameter" This reverts commit b92bdbd298d351478e4fbe8d4ff149c4405c766e. --- src/claranet_tfwrapper/__init__.py | 40 +++++++++++++++++++----------- tests/test_cache_requests.py | 28 +++++++++++---------- tests/test_search_on_github.py | 22 ++++++++-------- 3 files changed, 52 insertions(+), 38 deletions(-) diff --git a/src/claranet_tfwrapper/__init__.py b/src/claranet_tfwrapper/__init__.py index 428ce1377..540a2c533 100755 --- a/src/claranet_tfwrapper/__init__.py +++ b/src/claranet_tfwrapper/__init__.py @@ -65,6 +65,7 @@ def get_architecture(): RC_KO = 1 RC_UNK = 2 +LIMIT_GITHUB_RELEASES = 42 GITHUB_RELEASES = "https://github.com/{}/releases" TERRAFORM_RELEASES_URL = "https://releases.hashicorp.com/terraform/index.json" @@ -569,21 +570,32 @@ def bootstrap(wrapper_config): # FIXME: use https://pygithub.readthedocs.io/en/stable/github_objects/Repository.html#github.Repository.Repository.get_releases def search_on_github(repo, minor_version, patch_regex, patch): """Search release on github.""" - # FIXME: the github UI seems to use a cache that does not return recent versions - result = CachedRequestsSession.get("{}?q={}".format(GITHUB_RELEASES.format(repo), minor_version)) - releases = re.findall(r"(.*)".format(repo), result.text) - - for release in releases: - logger.debug( - 'Release found: "{}", checking with "^v{}.{}$"'.format(release, minor_version, patch if patch else patch_regex) - ) - if re.match( - r"^v{}\.{}$".format(minor_version, patch if patch else patch_regex), - release, - ): - patch = patch or release.split(".")[-1] - return patch + # Start search from the next incremented minor version + # Note: the github UI serves the first page if the requested version does not exist + release = "v{}{}.0".format(minor_version[:-1], int(minor_version[-1]) + 1) + releases_count = 0 + while True: + result = CachedRequestsSession.get("{}?after={}".format(GITHUB_RELEASES.format(repo), release)) + releases = re.findall(r"(.*)".format(repo), result.text) + releases_count += len(releases) + for release in releases: + logger.debug( + 'Release found: "{}", checking with "^v{}.{}$"'.format(release, minor_version, patch if patch else patch_regex) + ) + if re.match( + r"^v{}\.{}$".format(minor_version, patch if patch else patch_regex), + release, + ): + patch = patch or release.split(".")[-1] + return patch + # hard limit or it will take too long + if releases_count > LIMIT_GITHUB_RELEASES: + return None + if len(releases) < 1: + # no more version available + break + release = releases[-1:][0] return None diff --git a/tests/test_cache_requests.py b/tests/test_cache_requests.py index fb629eb89..1bc9646a6 100644 --- a/tests/test_cache_requests.py +++ b/tests/test_cache_requests.py @@ -12,7 +12,7 @@ @pytest.fixture -def terraform_releases_html_q_0_12(): +def terraform_releases_html_after_v0_13_0(): return """ @@ -74,19 +74,19 @@ def read(self, size=-1): def test_search_on_github_cache_terraform_releases_200( tmp_working_dir, - terraform_releases_html_q_0_12, + terraform_releases_html_after_v0_13_0, ): with mock.patch("io.BytesIO", AutoclosingBytesIO): with pook.use(): repo = "hashicorp/terraform" - releases_url = "https://github.com/{}/releases?q=0.12".format(repo) + releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo) # A volatile mock that can only be invoked once pook.get( releases_url, reply=200, response_type="text/plain", - response_body=terraform_releases_html_q_0_12, + response_body=terraform_releases_html_after_v0_13_0, response_headers={ "Status": "200 OK", "ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"', @@ -110,11 +110,13 @@ def test_search_on_github_cache_terraform_releases_200( assert not pook.isactive() -def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(tmp_working_dir, terraform_releases_html_q_0_12): +def test_search_on_github_cache_terraform_releases_does_not_cache_error_429( + tmp_working_dir, terraform_releases_html_after_v0_13_0 +): with mock.patch("io.BytesIO", AutoclosingBytesIO): with pook.use(): repo = "hashicorp/terraform" - releases_url = "https://github.com/{}/releases?q=0.12".format(repo) + releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo) # volatile mocks that can only be invoked once each pook.get( @@ -127,7 +129,7 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(tmp_ releases_url, reply=200, response_type="text/plain", - response_body=terraform_releases_html_q_0_12, + response_body=terraform_releases_html_after_v0_13_0, response_headers={ "Status": "200 OK", "ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"', @@ -157,12 +159,12 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_429(tmp_ def test_search_on_github_cache_terraform_releases_does_not_cache_error_403( tmp_working_dir, - terraform_releases_html_q_0_12, + terraform_releases_html_after_v0_13_0, ): with mock.patch("io.BytesIO", AutoclosingBytesIO): with pook.use(): repo = "hashicorp/terraform" - releases_url = "https://github.com/{}/releases?q=0.12".format(repo) + releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo) # volatile mocks that can only be invoked once each pook.get( @@ -175,7 +177,7 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_403( releases_url, reply=200, response_type="text/plain", - response_body=terraform_releases_html_q_0_12, + response_body=terraform_releases_html_after_v0_13_0, response_headers={ "Status": "200 OK", "ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"', @@ -205,12 +207,12 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_403( def test_search_on_github_cache_terraform_releases_does_not_cache_error_404( tmp_working_dir, - terraform_releases_html_q_0_12, + terraform_releases_html_after_v0_13_0, ): with mock.patch("io.BytesIO", AutoclosingBytesIO): with pook.use(): repo = "hashicorp/terraform" - releases_url = "https://github.com/{}/releases?q=0.12".format(repo) + releases_url = "https://github.com/{}/releases?after=v0.13.0".format(repo) # volatile mocks that can only be invoked once each pook.get( @@ -223,7 +225,7 @@ def test_search_on_github_cache_terraform_releases_does_not_cache_error_404( releases_url, reply=200, response_type="text/plain", - response_body=terraform_releases_html_q_0_12, + response_body=terraform_releases_html_after_v0_13_0, response_headers={ "Status": "200 OK", "ETag": 'W/"df0474ebd25f223a95926ba58e11e77b"', diff --git a/tests/test_search_on_github.py b/tests/test_search_on_github.py index 19c3eef7f..947d83bf8 100644 --- a/tests/test_search_on_github.py +++ b/tests/test_search_on_github.py @@ -7,7 +7,7 @@ @pytest.fixture -def provider_releases_html_q_2_5(): +def provider_releases_html_after_v2_6_0(): return """ @@ -34,7 +34,7 @@ def provider_releases_html_q_2_5(): @pytest.fixture -def provider_releases_html_q_1_2(): +def provider_releases_html_after_v1_3_0(): return """ @@ -62,28 +62,28 @@ def provider_releases_html_q_1_2(): def test_search_on_github_provider_releases( requests_mock, - provider_releases_html_q_2_5, - provider_releases_html_q_1_2, + provider_releases_html_after_v2_6_0, + provider_releases_html_after_v1_3_0, ): from claranet_tfwrapper import GITHUB_RELEASES repo = "claranet/terraform-provider-gitlab" releases_url = GITHUB_RELEASES.format(repo) - releases_url_q_2_5 = releases_url + "?q=2.5" - releases_url_q_1_2 = releases_url + "?q=1.2" + releases_url_after_v2_6_0 = releases_url + "?after=v2.6.0" + releases_url_after_v1_3_0 = releases_url + "?after=v1.3.0" requests_mock.get( - releases_url_q_2_5, + releases_url_after_v2_6_0, complete_qs=True, - text=provider_releases_html_q_2_5, + text=provider_releases_html_after_v2_6_0, ) requests_mock.get( - releases_url_q_1_2, + releases_url_after_v1_3_0, complete_qs=True, - text=provider_releases_html_q_1_2, + text=provider_releases_html_after_v1_3_0, ) - assert provider_releases_html_q_2_5 == requests.get(releases_url_q_2_5).text + assert provider_releases_html_after_v2_6_0 == requests.get(releases_url_after_v2_6_0).text patch_regex = r"[0-9]+(((-alpha|-beta|-rc)[0-9]+)|(?P-dev))?" patch = tfwrapper.search_on_github(repo, "2.5", patch_regex, "")