From be430b3516354726a077c472b9eb5a73ff7107fe Mon Sep 17 00:00:00 2001 From: Slavek Kabrda Date: Mar 14 2019 09:43:44 +0000 Subject: Make sure that TemporaryClone.push also pushes tags --- diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 9109539..ae5a971 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -1059,6 +1059,8 @@ class TemporaryClone(object): command.append("--force") environ = {} + command.append("--follow-tags") + try: _log.debug( "Running a git push of %s to %s" diff --git a/tests/__init__.py b/tests/__init__.py index 718ae47..2999dbb 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -931,6 +931,27 @@ def add_commit_git_repo(folder, ncommits=10, filename='sources', shutil.rmtree(newfolder) +def add_tag_git_repo(folder, tagname, obj_hash, message): + """ Add a tag to the given object of the given repo annotated by given message. """ + repo, newfolder, branch_ref_obj = _clone_and_top_commits( + folder, 'master', branch_ref=True) + + tag_sha = repo.create_tag( + tagname, + obj_hash, + repo.get(obj_hash).type, + pygit2.Signature('Alice Author', 'alice@authors.tld'), + message, + ) + + # Push to origin + ori_remote = repo.remotes[0] + PagureRepo.push(ori_remote, 'refs/tags/%s:refs/tags/%s' % (tagname, tagname)) + + shutil.rmtree(newfolder) + return tag_sha + + def add_content_to_git( folder, branch='master', filename='sources', content='foo', message=None): diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index d0a613d..0e90044 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -16,6 +16,7 @@ import shutil import sys import os +import pygit2 import markdown from mock import patch, MagicMock @@ -2304,6 +2305,76 @@ class PagureLibtests(tests.Modeltests): ['feature1', 'feature2', 'master'] ) + def test_fork_project_preserves_tags(self): + """ Test the fork_project of pagure.lib.query pushes tags to the fork. """ + gitfolder = os.path.join(self.path, 'repos') + docfolder = os.path.join(gitfolder, 'docs') + ticketfolder = os.path.join(gitfolder, 'tickets') + requestfolder = os.path.join(gitfolder, 'requests') + pagure.config.config['GIT_FOLDER'] = gitfolder + + projects = pagure.lib.query.search_projects(self.session) + self.assertEqual(len(projects), 0) + + # Create a new project + task = pagure.lib.query.new_project( + session=self.session, + user='pingou', + name='testproject', + repospanner_region=None, + blacklist=[], + allowed_prefix=[], + description='description for testproject', + parent_id=None, + ) + self.session.commit() + self.assertEqual( + task.get(), + {'endpoint': 'ui_ns.view_repo', + 'repo': 'testproject', + 'namespace': None}) + + projects = pagure.lib.query.search_projects(self.session) + self.assertEqual(len(projects), 1) + + project = pagure.lib.query._get_project(self.session, 'testproject') + gitrepo = os.path.join(gitfolder, project.path) + docrepo = os.path.join(docfolder, project.path) + ticketrepo = os.path.join(ticketfolder, project.path) + requestrepo = os.path.join(requestfolder, project.path) + + # Add content to the main repo into three branches + tests.add_content_git_repo(gitrepo, 'master') + + # Add a tag + tagged_commit = pygit2.Repository(gitrepo).revparse_single('master').hex + tag_sha = tests.add_tag_git_repo(gitrepo, '1.2.3', tagged_commit, 'release 1.2.3') + + # Fork + task = pagure.lib.query.fork_project( + session=self.session, + user='foo', + repo=project, + ) + self.session.commit() + self.assertEqual( + task.get(), + {'endpoint': 'ui_ns.view_repo', + 'repo': 'testproject', + 'namespace': None, + 'username': 'foo'}) + + projects = pagure.lib.query.search_projects(self.session) + self.assertEqual(len(projects), 2) + + project = pagure.lib.query._get_project( + self.session, 'testproject', user='foo') + # Check the tag is there + fork_obj = pygit2.Repository(project.repopath('main')) + tag = fork_obj.get(tag_sha) + self.assertEqual(fork_obj[tag.target].hex, tagged_commit) + self.assertEqual(tag.message, 'release 1.2.3') + def test_fork_project_namespaced(self): """ Test the fork_project of pagure.lib on a namespaced project. """ gitfolder = os.path.join(self.path, 'repos')