diff --git a/docs/usage.rst b/docs/usage.rst index 52f7536..86e3434 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -467,11 +467,27 @@ use_max_tag 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. +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 `__ + 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 `__ + for examples). Defaults to ``-target.date`` (sorts tags in descending order + by date). + max_page How many pages do we search for the max tag? Default is 3. This works when ``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 ~~~~~~~~~~~~ @@ -848,7 +864,7 @@ Check `Open Vsx `_ for updates. openvsx The extension's Unique Identifier on open-vsx.org, e.g. ``ritwickdey.LiveServer``. - + Check Visual Studio Code Marketplace ~~~~~~~~~~~~~~~ :: diff --git a/nvchecker_source/bitbucket.py b/nvchecker_source/bitbucket.py index 5919709..6039454 100644 --- a/nvchecker_source/bitbucket.py +++ b/nvchecker_source/bitbucket.py @@ -1,34 +1,61 @@ # MIT licensed # Copyright (c) 2013-2020 lilydjwg , 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' +# 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' -async def get_version(name, conf, *, cache, **kwargs): +async def get_version( + name: str, conf: Entry, *, + cache: AsyncCache, + **kwargs: Any, +) -> VersionResult: repo = conf['bitbucket'] br = conf.get('branch', '') 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 += '?' + 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) - data = await _get_tags(url, max_page=max_page, cache=cache) + version = await _get_tags(url, max_page=max_page, cache=cache) else: url = BITBUCKET_URL % (repo, br) data = await cache.get_json(url) - if use_max_tag: - version = data - else: version = data['values'][0]['date'].split('T', 1)[0].replace('-', '') + return version -async def _get_tags(url, *, max_page, cache): - ret = [] +async def _get_tags( + url: str, *, + max_page: int, + cache: AsyncCache, +) -> List[str]: + ret: List[str] = [] for _ in range(max_page): data = await cache.get_json(url) diff --git a/tests/test_bitbucket.py b/tests/test_bitbucket.py index 6ba99a5..8efb01d 100644 --- a/tests/test_bitbucket.py +++ b/tests/test_bitbucket.py @@ -24,3 +24,25 @@ async def test_bitbucket_max_tag_with_ignored(get_version): "use_max_tag": True, "ignored": "1.6.0 1.7.0", }) == "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"