From e723053c41fef5d8113f1a1325f745a863771c0f Mon Sep 17 00:00:00 2001 From: Felix Yan Date: Wed, 23 Dec 2015 21:02:06 +0800 Subject: [PATCH] Add ignored_tags support Ignore certain tags while sorting. This option must be used together with use_max_tag. This can be useful to avoid some known badly versioned tags, so the newer tags won't be "overriden" by the old broken ones. --- README.rst | 15 +++++++++++++++ nvchecker/source/bitbucket.py | 7 ++++--- nvchecker/source/github.py | 10 ++++++---- nvchecker/source/gitlab.py | 10 ++++++---- tests/test_bitbucket.py | 3 +++ tests/test_github.py | 3 +++ tests/test_gitlab.py | 3 +++ 7 files changed, 40 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 272cd2e..e51d777 100644 --- a/README.rst +++ b/README.rst @@ -174,6 +174,11 @@ use_max_tag this option includes both annotated tags and lightweight ones, and return the biggest one sorted by ``pkg_resources.parse_version``. +ignored_tags + Ignore certain tags while sorting. Tags are separate by whitespaces. This option must be + used together with use_max_tag. This can be useful to avoid some known badly versioned + tags, so the newer tags won't be "overridden" by the old broken ones. + An environment variable ``NVCHECKER_GITHUB_TOKEN`` can be set to a GitHub OAuth token in order to request more frequently than anonymously. Check BitBucket @@ -190,6 +195,11 @@ use_max_tag Set this to ``true`` to check for the max tag on BitBucket. Will return the biggest one sorted by ``pkg_resources.parse_version``. +ignored_tags + Ignore certain tags while sorting. Tags are separate by whitespaces. This option must be + used together with use_max_tag. This can be useful to avoid some known badly versioned + tags, so the newer tags won't be "overridden" by the old broken ones. + Check GitCafe ------------- Check `GitCafe `_ for updates. The version returned is in date format ``%Y%m%d``, e.g. ``20130701``. @@ -216,6 +226,11 @@ use_max_tag Set this to ``true`` to check for the max tag on BitBucket. Will return the biggest one sorted by ``pkg_resources.parse_version``. +ignored_tags + Ignore certain tags while sorting. Tags are separate by whitespaces. This option must be + used together with use_max_tag. This can be useful to avoid some known badly versioned + tags, so the newer tags won't be "overridden" by the old broken ones. + host Hostname for self-hosted GitLab instance. diff --git a/nvchecker/source/bitbucket.py b/nvchecker/source/bitbucket.py index 5179e69..f1fc189 100644 --- a/nvchecker/source/bitbucket.py +++ b/nvchecker/source/bitbucket.py @@ -13,18 +13,19 @@ def get_version(name, conf, callback): repo = conf.get('bitbucket') br = conf.get('branch', '') use_max_tag = conf.getboolean('use_max_tag', False) + ignored_tags = conf.get("ignored_tags", "").split() if use_max_tag: url = BITBUCKET_MAX_TAG % repo else: url = BITBUCKET_URL % (repo, br) request = HTTPRequest(url, user_agent='lilydjwg/nvchecker') AsyncHTTPClient().fetch(request, - callback=partial(_bitbucket_done, name, use_max_tag, callback)) + callback=partial(_bitbucket_done, name, use_max_tag, ignored_tags, callback)) -def _bitbucket_done(name, use_max_tag, callback, res): +def _bitbucket_done(name, use_max_tag, ignored_tags, callback, res): data = json.loads(res.body.decode('utf-8')) if use_max_tag: - data = list(data) + data = [tag for tag in data if tag not in ignored_tags] data.sort(key=parse_version) version = data[-1] else: diff --git a/nvchecker/source/github.py b/nvchecker/source/github.py index 7665cbc..05c2fa6 100644 --- a/nvchecker/source/github.py +++ b/nvchecker/source/github.py @@ -14,6 +14,7 @@ def get_version(name, conf, callback): br = conf.get('branch', 'master') use_latest_release = conf.getboolean('use_latest_release', False) use_max_tag = conf.getboolean('use_max_tag', False) + ignored_tags = conf.get("ignored_tags", "").split() if use_latest_release: url = GITHUB_LATEST_RELEASE % repo elif use_max_tag: @@ -25,15 +26,16 @@ def get_version(name, conf, callback): headers['Authorization'] = 'token %s' % os.environ['NVCHECKER_GITHUB_TOKEN'] request = HTTPRequest(url, headers=headers, user_agent='lilydjwg/nvchecker') AsyncHTTPClient().fetch(request, - callback=partial(_github_done, name, use_latest_release, use_max_tag, callback)) + callback=partial(_github_done, name, use_latest_release, use_max_tag, ignored_tags, callback)) -def _github_done(name, use_latest_release, use_max_tag, callback, res): +def _github_done(name, use_latest_release, use_max_tag, ignored_tags, callback, res): data = json.loads(res.body.decode('utf-8')) if use_latest_release: version = data['tag_name'] elif use_max_tag: - data.sort(key=lambda tag: parse_version(tag["name"])) - version = data[-1]["name"] + data = [tag["name"] for tag in data if tag["name"] not in ignored_tags] + data.sort(key=parse_version) + version = data[-1] else: version = data[0]['commit']['committer']['date'].split('T', 1)[0].replace('-', '') callback(name, version) diff --git a/nvchecker/source/gitlab.py b/nvchecker/source/gitlab.py index 34fade7..055bf8d 100644 --- a/nvchecker/source/gitlab.py +++ b/nvchecker/source/gitlab.py @@ -17,6 +17,7 @@ def get_version(name, conf, callback): br = conf.get('branch', 'master') host = conf.get('host', "gitlab.com") use_max_tag = conf.getboolean('use_max_tag', False) + ignored_tags = conf.get("ignored_tags", "").split() env_name = "NVCHECKER_GITLAB_TOKEN_" + host.upper().replace(".", "_").replace("/", "_") token = conf.get('token', os.environ.get(env_name, None)) @@ -33,13 +34,14 @@ def get_version(name, conf, callback): headers = {"PRIVATE-TOKEN": token} request = HTTPRequest(url, headers=headers, user_agent='lilydjwg/nvchecker') AsyncHTTPClient().fetch(request, - callback=partial(_gitlab_done, name, use_max_tag, callback)) + callback=partial(_gitlab_done, name, use_max_tag, ignored_tags, callback)) -def _gitlab_done(name, use_max_tag, callback, res): +def _gitlab_done(name, use_max_tag, ignored_tags, callback, res): data = json.loads(res.body.decode('utf-8')) if use_max_tag: - data.sort(key=lambda tag: parse_version(tag["name"])) - version = data[-1]["name"] + data = [tag["name"] for tag in data if tag["name"] not in ignored_tags] + data.sort(key=parse_version) + version = data[-1] else: version = data[0]['created_at'].split('T', 1)[0].replace('-', '') callback(name, version) diff --git a/tests/test_bitbucket.py b/tests/test_bitbucket.py index 69fb242..497665b 100644 --- a/tests/test_bitbucket.py +++ b/tests/test_bitbucket.py @@ -7,3 +7,6 @@ class BitBucketTest(ExternalVersionTestCase): def test_bitbucket_max_tag(self): self.assertEqual(self.sync_get_version("example", {"bitbucket": "prawee/git-tag", "use_max_tag": 1}), "1.7.0") + + def test_bitbucket_max_tag_with_ignored_tags(self): + self.assertEqual(self.sync_get_version("example", {"bitbucket": "prawee/git-tag", "use_max_tag": 1, "ignored_tags": "1.6.0 1.7.0"}), "v1.5") diff --git a/tests/test_github.py b/tests/test_github.py index a3e8ffb..2d2146d 100644 --- a/tests/test_github.py +++ b/tests/test_github.py @@ -14,3 +14,6 @@ class GitHubTest(ExternalVersionTestCase): def test_github_max_tag(self): self.assertEqual(self.sync_get_version("example", {"github": "harry-sanabria/ReleaseTestRepo", "use_max_tag": 1}), "second_release") + + def test_github_max_tag_with_ignored_tags(self): + self.assertEqual(self.sync_get_version("example", {"github": "harry-sanabria/ReleaseTestRepo", "use_max_tag": 1, "ignored_tags": "second_release release3"}), "first_release") diff --git a/tests/test_gitlab.py b/tests/test_gitlab.py index daf8185..19e0b71 100644 --- a/tests/test_gitlab.py +++ b/tests/test_gitlab.py @@ -14,3 +14,6 @@ class GitLabTest(ExternalVersionTestCase): def test_gitlab_max_tag(self): self.assertEqual(self.sync_get_version("example", {"gitlab": "gitlab-org/gitlab-test", "use_max_tag": 1}), "v1.1.0") + + def test_gitlab_max_tag_with_ignored_tags(self): + self.assertEqual(self.sync_get_version("example", {"gitlab": "gitlab-org/gitlab-test", "use_max_tag": 1, "ignored_tags": "v1.1.0"}), "v1.0.0")