Merge pull request #206 from alexfikl/bitbucket-order-tags

Bitbucket: Add support for queries and sorting
This commit is contained in:
依云 2022-02-08 14:40:59 +08:00 committed by GitHub
commit acb56d7827
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 77 additions and 12 deletions

View File

@ -467,11 +467,27 @@ use_max_tag
Set this to ``true`` to check for the max tag on BitBucket. Will return the biggest one Set this to ``true`` to check for the max tag on BitBucket. Will return the biggest one
sorted by old ``pkg_resources.parse_version``. Will return the tag name instead of date. sorted by old ``pkg_resources.parse_version``. Will return the tag name instead of date.
use_sorted_tags
If ``true``, tags are queried and sorted according to the ``query`` and
``sort`` keys. Will return the tag name instead of the date.
query
A query string use to filter tags when ``use_sorted_tags`` set (see
`here <https://developer.atlassian.com/cloud/bitbucket/rest/intro/#querying>`__
for examples). The string does not need to be escaped.
sort
A field used to sort the tags when ``use_sorted_tags`` is set (see
`here <https://developer.atlassian.com/cloud/bitbucket/rest/intro/#filtering>`__
for examples). Defaults to ``-target.date`` (sorts tags in descending order
by date).
max_page max_page
How many pages do we search for the max tag? Default is 3. This works when How many pages do we search for the max tag? Default is 3. This works when
``use_max_tag`` is set. ``use_max_tag`` is set.
This source supports :ref:`list options` when ``use_max_tag`` is set. This source supports :ref:`list options` when ``use_max_tag`` or
``use_sorted_tags`` is set.
Check GitLab Check GitLab
~~~~~~~~~~~~ ~~~~~~~~~~~~

View File

@ -1,34 +1,61 @@
# MIT licensed # MIT licensed
# Copyright (c) 2013-2020 lilydjwg <lilydjwg@gmail.com>, et al. # Copyright (c) 2013-2020 lilydjwg <lilydjwg@gmail.com>, et al.
from nvchecker.api import sort_version_keys from typing import Any, List
from urllib.parse import urlencode
# doc: https://confluence.atlassian.com/display/BITBUCKET/commits+or+commit+Resource from nvchecker.api import VersionResult, Entry, AsyncCache
# doc: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-commits/#api-repositories-workspace-repo-slug-commits-get
BITBUCKET_URL = 'https://bitbucket.org/api/2.0/repositories/%s/commits/%s' BITBUCKET_URL = 'https://bitbucket.org/api/2.0/repositories/%s/commits/%s'
# doc: https://developer.atlassian.com/cloud/bitbucket/rest/api-group-refs/#api-repositories-workspace-repo-slug-refs-tags-get
BITBUCKET_MAX_TAG = 'https://bitbucket.org/api/2.0/repositories/%s/refs/tags' BITBUCKET_MAX_TAG = 'https://bitbucket.org/api/2.0/repositories/%s/refs/tags'
async def get_version(name, conf, *, cache, **kwargs): async def get_version(
name: str, conf: Entry, *,
cache: AsyncCache,
**kwargs: Any,
) -> VersionResult:
repo = conf['bitbucket'] repo = conf['bitbucket']
br = conf.get('branch', '') br = conf.get('branch', '')
use_max_tag = conf.get('use_max_tag', False) use_max_tag = conf.get('use_max_tag', False)
use_sorted_tags = conf.get('use_sorted_tags', False)
if use_max_tag: if use_sorted_tags or use_max_tag:
parameters = {'fields': 'values.name,next'}
if use_sorted_tags:
parameters['sort'] = conf.get('sort', '-target.date')
if 'query' in conf:
parameters['q'] = conf['query']
if use_sorted_tags:
url = BITBUCKET_MAX_TAG % repo url = BITBUCKET_MAX_TAG % repo
url += '?' + urlencode(parameters)
version = await _get_tags(url, max_page=1, cache=cache)
elif use_max_tag:
url = BITBUCKET_MAX_TAG % repo
url += '?' + urlencode(parameters)
max_page = conf.get('max_page', 3) max_page = conf.get('max_page', 3)
data = await _get_tags(url, max_page=max_page, cache=cache) version = await _get_tags(url, max_page=max_page, cache=cache)
else: else:
url = BITBUCKET_URL % (repo, br) url = BITBUCKET_URL % (repo, br)
data = await cache.get_json(url) data = await cache.get_json(url)
if use_max_tag:
version = data
else:
version = data['values'][0]['date'].split('T', 1)[0].replace('-', '') version = data['values'][0]['date'].split('T', 1)[0].replace('-', '')
return version return version
async def _get_tags(url, *, max_page, cache): async def _get_tags(
ret = [] url: str, *,
max_page: int,
cache: AsyncCache,
) -> List[str]:
ret: List[str] = []
for _ in range(max_page): for _ in range(max_page):
data = await cache.get_json(url) data = await cache.get_json(url)

View File

@ -24,3 +24,25 @@ async def test_bitbucket_max_tag_with_ignored(get_version):
"use_max_tag": True, "use_max_tag": True,
"ignored": "1.6.0 1.7.0", "ignored": "1.6.0 1.7.0",
}) == "v1.5" }) == "v1.5"
async def test_bitbucket_sorted_tags(get_version):
assert await get_version("example", {
"source": "bitbucket",
"bitbucket": "prawee/git-tag",
"use_sorted_tags": True,
}) == "1.7.0"
assert await get_version("example", {
"source": "bitbucket",
"bitbucket": "prawee/git-tag",
"use_sorted_tags": True,
"query": 'name~"v"',
}) == "v1.5"
assert await get_version("example", {
"source": "bitbucket",
"bitbucket": "berkeleylab/gasnet",
"use_sorted_tags": True,
"query": 'name~"CVS/BERKELEY_UPC" AND name!~"rc"',
"prefix": "CVS/BERKELEY_UPC_",
}) == "2_18_0"