diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 0c5f18c..949bf0c 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -16,6 +16,7 @@ import os import shutil import subprocess import tempfile +import re import pygit2 import werkzeug @@ -1194,6 +1195,8 @@ def get_git_tags(project): def get_git_tags_objects(project): """ Returns the list of references of the tags created in the git repositorie the specified project. + The list is sorted using the tag name and returns the highest release + version first. """ repopath = pagure.get_repo_path(project) repo_obj = PagureRepo(repopath) @@ -1203,4 +1206,23 @@ def get_git_tags_objects(project): if 'refs/tags/' in tag and repo_obj.lookup_reference(tag) ] - return tags + sorted_tags = [] + tags_sort = {} + + for tag in tags: + #Split the git tag name using any non-alphanumeric character + #and store each element returned in a tuple. + splitted_tag = re.split('[^a-zA-Z0-9]+', tag.name) + sorting_tuple = () + for item in splitted_tag: + #Cast the result to an integer when possible + if item.isdigit(): + sorting_tuple += (int(item),) + else: + sorting_tuple += (item,) + tags_sort[sorting_tuple] = tag + + for tag in sorted(tags_sort, reverse = True): + sorted_tags.append(tags_sort[tag]) + + return sorted_tags diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index ec1a5ed..0ccf964 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -38,7 +38,7 @@ import pagure import pagure.ui.plugins from pagure import (APP, SESSION, LOG, __get_file_in_tree, login_required, is_repo_admin, admin_session_timedout) -import re + # pylint: disable=E1101 @@ -724,30 +724,13 @@ def view_tags(repo, username=None): flask.abort(404, 'Project not found') tags = pagure.lib.git.get_git_tags_objects(repo) - - sorting_tuple = () - sorted_tags = [] - tags_sort = {} - - for tag in tags: - splitted_tag = re.split('\W+',tag.name) - for item in splitted_tag : - if item.isdigit(): - sorting_tuple +=(int(item),) - else: - sorting_tuple += (item,) - tags_sort [sorting_tuple] = tag - sorting_tuple = () - - for tag in sorted(tags_sort, reverse = True): - sorted_tags.append(tags_sort[tag]) - + return flask.render_template( 'releases.html', select='tags', username=username, repo=repo, - tags=sorted_tags, + tags=tags, repo_admin=is_repo_admin(repo), ) diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 2615f6e..096c366 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -1313,6 +1313,115 @@ index 0000000..60f7480 os.path.join(tests.HERE, 'forks', 'pingou', 'foo.test.git')) self.assertEqual(repo_name, 'pingou') + def test_get_git_tags_objects(self): + """ Test the get_git_tags_objects method of pagure.lib.git. """ + tests.create_projects(self.session) + tests.create_projects_git(os.path.join(tests.HERE, 'repos'), bare=True) + project = pagure.lib.get_project(self.session, 'test') + + def get_tag_name(tags): + """ Return a list of the tag names """ + output = [] + for tag in tags: + output.append(tag.name) + return output + + #Case 1 - project does not contains tags + exp = [] + tags = pagure.lib.git.get_git_tags_objects(project) + self.assertEqual(exp,get_tag_name(tags)) + + #Case 2 - Simple sort + exp = ['0.1.0', '0.0.21', '0.0.12', '0.0.11', '0.0.3', '0.0.2', '0.0.1'] + + tests.add_readme_git_repo(os.path.join(os.path.join(tests.HERE, 'repos'), 'test.git')) + repo = pygit2.Repository(os.path.join(os.path.join(tests.HERE, 'repos'), 'test.git')) + first_commit = repo.revparse_single('HEAD') + tagger = pygit2.Signature('Alice Doe', 'adoe@example.com', 12347, 0) + repo.create_tag( + "0.0.1", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.1") + repo.create_tag( + "0.1.0", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.1.0") + repo.create_tag( + "0.0.2", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.2") + repo.create_tag( + "0.0.3", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.3") + repo.create_tag( + "0.0.11", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.11") + repo.create_tag( + "0.0.12", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.12") + repo.create_tag( + "0.0.21", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.21") + + tags = pagure.lib.git.get_git_tags_objects(project) + self.assertEqual(exp,get_tag_name(tags)) + + #Case 3 Sorting with alpha and beta + exp = ['0.1.0', '0.0.21', '0.0.12-beta', '0.0.12-alpha', '0.0.12', '0.0.11', '0.0.3', '0.0.2', '0.0.1'] + + repo.create_tag( + "0.0.12-alpha", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.12") + repo.create_tag( + "0.0.12-beta", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0.12") + + tags = pagure.lib.git.get_git_tags_objects(project) + self.assertEqual(exp,get_tag_name(tags)) + + #Case 4 - Sorting with different splitting characters + project = pagure.lib.get_project(self.session, 'test2') + exp = ['15.1-0_0', '1.0-0_14', '1.0-0_2', '1.0-0_1', '0.1-1_0', '0.1-0_0', '0.0-2_0', '0.0-1_34', '0.0-1_11', '0.0-1_3', '0.0-1_2', '0.0-1_1'] + tests.add_readme_git_repo(os.path.join(os.path.join(tests.HERE, 'repos'), 'test2.git')) + repo = pygit2.Repository(os.path.join(os.path.join(tests.HERE, 'repos'), 'test2.git')) + first_commit = repo.revparse_single('HEAD') + tagger = pygit2.Signature('Alice Doe', 'adoe@example.com', 12347, 0) + repo.create_tag( + "0.0-1_1", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0-1_1") + repo.create_tag( + "0.0-1_3", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0-1_3") + repo.create_tag( + "0.0-1_11", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0-1_11") + repo.create_tag( + "0.0-1_2", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0-1_2") + repo.create_tag( + "0.1-0_0", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.1-0_0") + repo.create_tag( + "0.1-1_0", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.1-1_0") + repo.create_tag( + "0.0-1_34", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0-1_34") + repo.create_tag( + "0.0-2_0", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 0.0-2_0") + repo.create_tag( + "1.0-0_1", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 1.0-0_1") + repo.create_tag( + "1.0-0_14", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 1.0-0_14") + repo.create_tag( + "1.0-0_2", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 1.0-0_2") + repo.create_tag( + "15.1-0_0", first_commit.oid.hex, pygit2.GIT_OBJ_COMMIT, tagger, + "Release 15.1-0_0") + + tags = pagure.lib.git.get_git_tags_objects(project) + self.assertEqual(exp,get_tag_name(tags)) if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureLibGittests)