Skip to content

Commit 0e387e8

Browse files
Follow Bitbucket tag pages when collecting package releases
Signed-off-by: Ali Zulfiqar <codewithfourtix@gmail.com>
1 parent 27c4fc9 commit 0e387e8

2 files changed

Lines changed: 66 additions & 18 deletions

File tree

src/fetchcode/package.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -293,28 +293,31 @@ def get_bitbucket_data_from_purl(purl):
293293
tags_url = tags_url.get("href")
294294
if not tags_url:
295295
return []
296-
tags_data = get_response(tags_url)
297-
tags = tags_data.get("values") or {}
296+
while tags_url:
297+
tags_data = get_response(tags_url)
298+
tags = tags_data.get("values") or {}
298299

299-
for tag in tags:
300-
version = tag.get("name") or ""
301-
version_purl = PackageURL(type=purl.type, namespace=namespace, name=name, version=version)
302-
download_url = f"{base_path}/{namespace}/{name}/downloads/{name}-{version}.tar.gz"
303-
code_view_url = f"{bitbucket_url}/{namespace}/{name}/src/{version}"
300+
for tag in tags:
301+
version = tag.get("name") or ""
302+
version_purl = PackageURL(type=purl.type, namespace=namespace, name=name, version=version)
303+
download_url = f"{base_path}/{namespace}/{name}/downloads/{name}-{version}.tar.gz"
304+
code_view_url = f"{bitbucket_url}/{namespace}/{name}/src/{version}"
304305

305-
if purl.version and version_purl.version != purl.version:
306-
continue
306+
if purl.version and version_purl.version != purl.version:
307+
continue
307308

308-
yield Package(
309-
api_url=api_url,
310-
bug_tracking_url=bug_tracking_url,
311-
code_view_url=code_view_url,
312-
download_url=download_url,
313-
**version_purl.to_dict(),
314-
)
309+
yield Package(
310+
api_url=api_url,
311+
bug_tracking_url=bug_tracking_url,
312+
code_view_url=code_view_url,
313+
download_url=download_url,
314+
**version_purl.to_dict(),
315+
)
315316

316-
if purl.version:
317-
break
317+
if purl.version:
318+
return
319+
320+
tags_url = tags_data.get("next")
318321

319322

320323
@router.route("pkg:rubygems/.*")
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# fetchcode is a free software tool from nexB Inc. and others.
2+
# Visit https://github.com/aboutcode-org/fetchcode for support and download.
3+
4+
# Copyright (c) nexB Inc. and others. All rights reserved.
5+
# http://nexb.com and http://aboutcode.org
6+
7+
# This software is licensed under the Apache License version 2.0.
8+
9+
# You may not use this software except in compliance with the License.
10+
# You may obtain a copy of the License at:
11+
# http://apache.org/licenses/LICENSE-2.0
12+
# Unless required by applicable law or agreed to in writing, software distributed
13+
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
14+
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
15+
# specific language governing permissions and limitations under the License.
16+
17+
import pytest
18+
19+
from fetchcode import package
20+
21+
22+
@pytest.mark.parametrize(
23+
"version,expected,page_count",
24+
[(None, ["1.0", "2.0"], 2), ("2.0", ["2.0"], 2), ("1.0", ["1.0"], 1)],
25+
)
26+
def test_bitbucket_tag_pagination(monkeypatch, version, expected, page_count):
27+
base = "https://api.bitbucket.org/2.0/repositories/example/project"
28+
first = base + "/refs/tags"
29+
second = first + "?page=2"
30+
responses = {
31+
base: {"links": {"tags": {"href": first}}},
32+
first: {"values": [{"name": "1.0"}], "next": second},
33+
second: {"values": [{"name": "2.0"}]},
34+
}
35+
calls = []
36+
37+
def response(url):
38+
calls.append(url)
39+
return responses[url]
40+
41+
monkeypatch.setattr(package, "get_response", response)
42+
purl = "pkg:bitbucket/example/project" + ("@" + version if version else "")
43+
result = list(package.get_bitbucket_data_from_purl(purl))
44+
assert [item.version for item in result] == expected
45+
assert len(calls) == 1 + page_count

0 commit comments

Comments
 (0)