From 3e8be54131293825b3eb1126be9bf8bafad0d01b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 14 2016 09:18:33 +0000 Subject: [PATCH 1/3] Fix forking a repo with a namespace Fixes https://pagure.io/pagure/issue/1533 --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 253bed4..a50f4f9 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1487,7 +1487,8 @@ def fork_project(session, user, repo, gitfolder, ''' Fork a given project into the user's forks. ''' reponame = os.path.join(gitfolder, repo.path) forkreponame = '%s.git' % os.path.join( - gitfolder, 'forks', user, repo.name) + gitfolder, 'forks', user, + repo.namespace if repo.namespace else '', repo.name) if os.path.exists(forkreponame): raise pagure.exceptions.RepoExistsException( @@ -1497,6 +1498,7 @@ def fork_project(session, user, repo, gitfolder, project = model.Project( name=repo.name, + namespace=repo.namespace, description=repo.description, user_id=user_obj.id, parent_id=repo.id, @@ -1570,7 +1572,9 @@ def fork_project(session, user, repo, gitfolder, ), ) - return 'Repo "%s" cloned to "%s/%s"' % (repo.name, user, repo.name) + return 'Repo "{0}" cloned to "{1}/{0}"'.format( + '%s/%s' % (repo.namespace, repo.name) if repo.namespace else repo.name, + user) def search_projects( From 1cfa05046d27027e2926784408eb99c1ba254dbc Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 14 2016 09:18:33 +0000 Subject: [PATCH 2/3] Include the namespace in the message returned in pagure.lib.new_project --- diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index a50f4f9..3ce0f09 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1180,7 +1180,9 @@ def new_project(session, user, name, blacklist, allowed_prefix, ), ) - return 'Project "%s" created' % name + return 'Project "%s" created' % ( + '%s/%s' % (project.namespace, project.name) if project.namespace + else project.name) def new_issue(session, repo, title, content, user, ticketfolder, From 8ce9c7e1c85b63ca6a260e71a2f8af98c89108d7 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Nov 14 2016 09:18:33 +0000 Subject: [PATCH 3/3] Add unit-tests to pagure.lib.fork_project for namespaced projects --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 4eff467..9f1fc36 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -1296,6 +1296,169 @@ class PagureLibtests(tests.Modeltests): projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 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') + docfolder = os.path.join(self.path, 'docs') + ticketfolder = os.path.join(self.path, 'tickets') + requestfolder = os.path.join(self.path, 'requests') + pagure.APP.config['GIT_FOLDER'] = gitfolder + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 0) + + # Create a new project + msg = pagure.lib.new_project( + session=self.session, + user='pingou', + name='testproject', + namespace='foonamespace', + blacklist=[], + allowed_prefix=['foonamespace'], + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + description='description for testproject', + parent_id=None, + ) + self.session.commit() + self.assertEqual(msg, 'Project "foonamespace/testproject" created') + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 1) + + repo = pagure.lib.get_project( + self.session, 'testproject', namespace='foonamespace') + gitrepo = os.path.join(gitfolder, repo.path) + docrepo = os.path.join(docfolder, repo.path) + ticketrepo = os.path.join(ticketfolder, repo.path) + requestrepo = os.path.join(requestfolder, repo.path) + + self.assertTrue(os.path.exists(gitrepo)) + self.assertTrue(os.path.exists(docrepo)) + self.assertTrue(os.path.exists(ticketrepo)) + self.assertTrue(os.path.exists(requestrepo)) + + # Git repo exists + grepo = '%s.git' % os.path.join( + gitfolder, 'forks', 'foo', 'foonamespace', 'testproject') + os.makedirs(grepo) + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.fork_project, + session=self.session, + user='foo', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.rollback() + shutil.rmtree(grepo) + + # Doc repo exists + grepo = '%s.git' % os.path.join( + docfolder, 'forks', 'foo', 'foonamespace', 'testproject') + os.makedirs(grepo) + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.fork_project, + session=self.session, + user='foo', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.rollback() + shutil.rmtree(grepo) + + # Ticket repo exists + grepo = '%s.git' % os.path.join( + ticketfolder, 'forks', 'foo', 'foonamespace', 'testproject') + os.makedirs(grepo) + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.fork_project, + session=self.session, + user='foo', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.rollback() + shutil.rmtree(grepo) + + # Request repo exists + grepo = '%s.git' % os.path.join( + requestfolder, 'forks', 'foo', 'foonamespace', 'testproject') + os.makedirs(grepo) + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.fork_project, + session=self.session, + user='foo', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.rollback() + shutil.rmtree(grepo) + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 1) + + # Fork worked + + msg = pagure.lib.fork_project( + session=self.session, + user='foo', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.commit() + self.assertEqual( + msg, + 'Repo "foonamespace/testproject" cloned to ' + '"foo/foonamespace/testproject"') + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 2) + + # Fork a fork + + repo = pagure.lib.get_project( + self.session, 'testproject', + namespace='foonamespace', user='foo') + + msg = pagure.lib.fork_project( + session=self.session, + user='pingou', + repo=repo, + gitfolder=gitfolder, + docfolder=docfolder, + ticketfolder=ticketfolder, + requestfolder=requestfolder, + ) + self.session.commit() + self.assertEqual( + msg, + 'Repo "foonamespace/testproject" cloned to ' + '"pingou/foonamespace/testproject"') + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 3) + @patch('pagure.lib.notify.send_email') def test_new_pull_request(self, mockemail): """ test new_pull_request of pagure.lib. """