Merge pull request #206 from alexfikl/bitbucket-order-tags
Bitbucket: Add support for queries and sorting
This commit is contained in:
commit
acb56d7827
|
@ -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
|
||||||
~~~~~~~~~~~~
|
~~~~~~~~~~~~
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue