From d0c53a430f4a11fd20de2475a953d2c8add26a2e Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 1/12] Fix unaccessible fork after the main repo is deleted A new column `_is_fork` is introduced into the `projects` which keeps a track on the repo being `fork` or `not`. This changes the function `is_fork` and `fullname` by altering the condition. This is done to maintain the `integrity` of the FK parent_id. The changes in UI is to check if the main repo is deleted how the UI should function. Also if `repo.is_fork` is true and parent doesn't exist this was throwing error while mapping repo path hence the check for `repo.parent` is included. Alembic script is included for the migration of the database. --- diff --git a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py new file mode 100644 index 0000000..d3bf208 --- /dev/null +++ b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py @@ -0,0 +1,41 @@ +"""Add is_fork column to projects + +Revision ID: 1d18843a1994 +Revises: 43df5e588a87 +Create Date: 2016-07-17 22:02:14.495146 + +""" + +# revision identifiers, used by Alembic. +revision = '1d18843a1994' +down_revision = '43df5e588a87' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ''' Add is_fork column to project table''' + + op.add_column( + 'projects', + sa.Column( + '__is_fork', sa.Boolean, + default=False, + nullable=True) + ) + + op.execute('''UPDATE "projects" ''' + '''SET __is_fork=TRUE WHERE parent_id IS NOT NULL;''') + op.execute('''UPDATE "projects" ''' + '''SET __is_fork=FALSE WHERE parent_id IS NULL;''') + + + op.alter_column( + 'projects', + column_name='__is_fork', new_column_name='_is_fork', + nullable=False, existing_nullable=True) + +def downgrade(): + ''' Revert the _is_fork column added''' + op.drop_column('projects', '_is_fork') diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 10086e5..bbe7ec3 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1412,6 +1412,7 @@ def fork_project(session, user, repo, gitfolder, description=repo.description, user_id=user_obj.id, parent_id=repo.id, + _is_fork = True, hook_token=pagure.lib.login.id_generator(40) ) @@ -1542,11 +1543,11 @@ def search_projects( if fork is not None: if fork is True: projects = projects.filter( - model.Project.parent_id != None + model.Project._is_fork == True ) elif fork is False: projects = projects.filter( - model.Project.parent_id == None + model.Project._is_fork == False ) if tags: @@ -1615,11 +1616,11 @@ def get_project(session, name, user=None): ).filter( model.User.id == model.Project.user_id ).filter( - model.Project.parent_id != None + model.Project._is_fork == True ) else: query = query.filter( - model.Project.parent_id == None + model.Project._is_fork == False ) return query.first() @@ -2939,11 +2940,11 @@ def is_watching(session, user, reponame, repouser=None): ).filter( model.User.id == model.Project.user_id ).filter( - model.Project.parent_id != None + model.Project._is_fork == True ) else: query = query.filter( - model.Project.parent_id == None + model.Project._is_fork == False ) watcher = query.first() diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 0ca61e3..2cf01f5 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -308,6 +308,7 @@ class Project(BASE): # The hook_token is used to sign the notification sent via web-hook hook_token = sa.Column(sa.String(40), nullable=False, unique=True) avatar_email = sa.Column(sa.Text, nullable=True) + _is_fork = sa.Column(sa.Boolean, default=False, nullable=False) parent_id = sa.Column( sa.Integer, sa.ForeignKey( @@ -354,7 +355,7 @@ class Project(BASE): @property def is_fork(self): ''' Return a boolean specifying if the project is a fork or not ''' - return self.parent_id is not None + return self._is_fork @property def fullname(self): @@ -362,7 +363,7 @@ class Project(BASE): project forked, otherwise it returns the project name. ''' str_name = self.name - if self.parent_id: + if self._is_fork: str_name = "forks/%s/%s" % (self.user.user, str_name) return str_name diff --git a/pagure/templates/repo_master.html b/pagure/templates/repo_master.html index dce98ff..70c626f 100644 --- a/pagure/templates/repo_master.html +++ b/pagure/templates/repo_master.html @@ -67,7 +67,7 @@ {% endif %} - {% if repo.is_fork %} + {% if repo.is_fork and repo.parent %}
Forked from {% if repo.parent.is_fork %} diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index da6d644..d3f431d 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -117,7 +117,7 @@ def view_repo(repo, username=None): repo=repo.name, identifier=branchname, filename='')) diff_commits = [] - if repo.is_fork: + if repo.is_fork and repo.parent: parentname = os.path.join( APP.config['GIT_FOLDER'], repo.parent.path) else: From 907098b31f708eb705351a5e7a508d223ad0716e Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 2/12] Fix to make test happy with introduction of is_fork column --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index c82e550..c3cf892 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -579,6 +579,7 @@ class PagureFlaskForktests(tests.Modeltests): name='test', description='test project #1', hook_token='aaabbb', + is_fork=True, parent_id=1, ) self.session.add(item) @@ -662,6 +663,7 @@ class PagureFlaskForktests(tests.Modeltests): name='test', description='test project #1', hook_token='aaabbb', + is_fork=True, parent_id=1, ) self.session.add(item) @@ -918,6 +920,7 @@ index 9f44358..2a552bb 100644 name='test', description='test project #1', hook_token='aaabbb', + is_fork=True, parent_id=1, ) self.session.add(item) @@ -1032,6 +1035,7 @@ index 0000000..2a552bb name='test', description='test project #1', hook_token='aaabbb', + is_fork=True, parent_id=1, ) self.session.add(item) diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index fb23dc9..0efa5d7 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -860,6 +860,7 @@ class PagureFlaskRepotests(tests.Modeltests): # Turn that repo into a fork repo = pagure.lib.get_project(self.session, 'test') repo.parent_id = 2 + repo.is_fork = True self.session.add(repo) self.session.commit() @@ -886,6 +887,7 @@ class PagureFlaskRepotests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbmmm', ) @@ -989,6 +991,7 @@ class PagureFlaskRepotests(tests.Modeltests): # Turn that repo into a fork repo = pagure.lib.get_project(self.session, 'test') repo.parent_id = 2 + repo.is_fork = True self.session.add(repo) self.session.commit() @@ -1015,6 +1018,7 @@ class PagureFlaskRepotests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbnnn', ) @@ -1082,6 +1086,7 @@ class PagureFlaskRepotests(tests.Modeltests): # Turn that repo into a fork repo = pagure.lib.get_project(self.session, 'test') repo.parent_id = 2 + repo.is_fork = True self.session.add(repo) self.session.commit() @@ -1108,6 +1113,7 @@ class PagureFlaskRepotests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbooo', ) @@ -1402,6 +1408,7 @@ class PagureFlaskRepotests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbppp', ) @@ -1516,6 +1523,7 @@ class PagureFlaskRepotests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbqqq', ) @@ -1622,6 +1630,7 @@ class PagureFlaskRepotests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbkkk', ) @@ -1756,6 +1765,7 @@ index 0000000..11980b1 user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbblll', ) @@ -1862,6 +1872,7 @@ index 0000000..fb7093d user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbfff', ) @@ -2073,6 +2084,7 @@ index 0000000..fb7093d user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=2, hook_token='aaabbbjjj', ) @@ -2322,6 +2334,7 @@ index 0000000..fb7093d user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=2, hook_token='aaabbbjjj', ) @@ -2653,6 +2666,7 @@ index 0000000..fb7093d user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbppp', ) @@ -3157,6 +3171,7 @@ index 0000000..fb7093d name='test', description='test project #1', hook_token='aaabbb', + is_fork=True, parent_id=1, ) self.session.add(item) diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 85fc630..5eb56aa 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -996,6 +996,7 @@ class PagureLibtests(tests.Modeltests): user_id=2, # foo name='test', description='test project #1', + is_fork=True, parent_id=1, hook_token='aaabbbttt', ) @@ -1005,6 +1006,7 @@ class PagureLibtests(tests.Modeltests): user_id=2, # foo name='test2', description='test project #2', + is_fork=True, parent_id=2, hook_token='aaabbbuuu', ) @@ -1305,6 +1307,7 @@ class PagureLibtests(tests.Modeltests): user_id=1, # pingou name='test', description='test project #1', + is_fork=True, parent_id=1, hook_token='aaabbbrrr', ) diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index 730e512..6d2302f 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -67,6 +67,7 @@ class PagureLibGittests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #2', + is_fork=True, parent_id=1, hook_token='aaabbbvvv', ) @@ -202,6 +203,7 @@ repo requests/forks/pingou/test3 user_id=1, # pingou name='test2', description='test project #2', + is_fork=True, parent_id=1, hook_token='aaabbbvvv', ) diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py index 9e21ca4..7457430 100644 --- a/tests/test_pagure_lib_model.py +++ b/tests/test_pagure_lib_model.py @@ -76,6 +76,7 @@ class PagureLibModeltests(tests.Modeltests): user_id=1, # pingou name='test', description='test project #1', + is_fork=True, parent_id=1, hook_token='aaabbbyyy', ) diff --git a/tests/test_zzz_pagure_flask_ui_old_commit.py b/tests/test_zzz_pagure_flask_ui_old_commit.py index 4b4063a..c38de81 100644 --- a/tests/test_zzz_pagure_flask_ui_old_commit.py +++ b/tests/test_zzz_pagure_flask_ui_old_commit.py @@ -152,6 +152,7 @@ class PagureFlaskRepoOldUrltests(tests.Modeltests): user_id=1, # pingou name='test3', description='test project #3', + is_fork=True, parent_id=1, hook_token='aaabbbkkk', ) From 5e95dabd64ddfb7c22e909fc11db2a8f0afc8162 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 3/12] Fix alembic for the is_fork column --- diff --git a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py index d3bf208..5f875d4 100644 --- a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py +++ b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py @@ -26,16 +26,15 @@ def upgrade(): ) op.execute('''UPDATE "projects" ''' - '''SET __is_fork=TRUE WHERE parent_id IS NOT NULL;''') + '''SET _is_fork=TRUE WHERE parent_id IS NOT NULL;''') op.execute('''UPDATE "projects" ''' - '''SET __is_fork=FALSE WHERE parent_id IS NULL;''') - + '''SET _is_fork=FALSE WHERE parent_id IS NULL;''') op.alter_column( 'projects', - column_name='__is_fork', new_column_name='_is_fork', + column_name='_is_fork', new_column_name='is_fork', nullable=False, existing_nullable=True) def downgrade(): ''' Revert the _is_fork column added''' - op.drop_column('projects', '_is_fork') + op.drop_column('projects', 'is_fork') From 20a2e157209c32b17fa6dc005580b770307c9b47 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 4/12] is_fork is available to use after deleting is_fork property --- diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 2cf01f5..94347b8 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -308,7 +308,7 @@ class Project(BASE): # The hook_token is used to sign the notification sent via web-hook hook_token = sa.Column(sa.String(40), nullable=False, unique=True) avatar_email = sa.Column(sa.Text, nullable=True) - _is_fork = sa.Column(sa.Boolean, default=False, nullable=False) + is_fork = sa.Column(sa.Boolean, default=False, nullable=False) parent_id = sa.Column( sa.Integer, sa.ForeignKey( @@ -353,17 +353,12 @@ class Project(BASE): return '%s.git' % self.fullname @property - def is_fork(self): - ''' Return a boolean specifying if the project is a fork or not ''' - return self._is_fork - - @property def fullname(self): ''' Return the name of the git repo as user/project if it is a project forked, otherwise it returns the project name. ''' str_name = self.name - if self._is_fork: + if self.is_fork: str_name = "forks/%s/%s" % (self.user.user, str_name) return str_name From 3e1439e114a6fca9c77a9a0de573ea8a0d6e6457 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 5/12] Fix the new changes to be used in 'lib' and other files --- diff --git a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py index 5f875d4..7457766 100644 --- a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py +++ b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py @@ -20,7 +20,7 @@ def upgrade(): op.add_column( 'projects', sa.Column( - '__is_fork', sa.Boolean, + '_is_fork', sa.Boolean, default=False, nullable=True) ) diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index 6ac1b29..b8d0801 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -273,7 +273,7 @@ def get_pull_request_ready_branch(): branch = repo_obj.lookup_branch(branchname) diff_commits = [] - if repo.is_fork: + if repo.is_fork and repo.parent: parentpath = os.path.join( pagure.APP.config['GIT_FOLDER'], repo.parent.path) if repo.parent.is_fork: diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index bbe7ec3..596d5c8 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1412,7 +1412,7 @@ def fork_project(session, user, repo, gitfolder, description=repo.description, user_id=user_obj.id, parent_id=repo.id, - _is_fork = True, + is_fork = True, hook_token=pagure.lib.login.id_generator(40) ) @@ -1543,11 +1543,11 @@ def search_projects( if fork is not None: if fork is True: projects = projects.filter( - model.Project._is_fork == True + model.Project.is_fork == True ) elif fork is False: projects = projects.filter( - model.Project._is_fork == False + model.Project.is_fork == False ) if tags: @@ -1616,11 +1616,11 @@ def get_project(session, name, user=None): ).filter( model.User.id == model.Project.user_id ).filter( - model.Project._is_fork == True + model.Project.is_fork == True ) else: query = query.filter( - model.Project._is_fork == False + model.Project.is_fork == False ) return query.first() @@ -2940,11 +2940,11 @@ def is_watching(session, user, reponame, repouser=None): ).filter( model.User.id == model.Project.user_id ).filter( - model.Project._is_fork == True + model.Project.is_fork == True ) else: query = query.filter( - model.Project._is_fork == False + model.Project.is_fork == False ) watcher = query.first() From 778e695bd37b1e3a1ccda6041348a0e48e54a109 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 6/12] Fix avoid making Pr and Pep8 convention --- diff --git a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py index 7457766..d10f299 100644 --- a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py +++ b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py @@ -20,19 +20,18 @@ def upgrade(): op.add_column( 'projects', sa.Column( - '_is_fork', sa.Boolean, + 'is_fork', sa.Boolean, default=False, nullable=True) ) op.execute('''UPDATE "projects" ''' - '''SET _is_fork=TRUE WHERE parent_id IS NOT NULL;''') + '''SET is_fork=TRUE WHERE parent_id IS NOT NULL;''') op.execute('''UPDATE "projects" ''' - '''SET _is_fork=FALSE WHERE parent_id IS NULL;''') + '''SET is_fork=FALSE WHERE parent_id IS NULL;''') op.alter_column( - 'projects', - column_name='_is_fork', new_column_name='is_fork', + 'projects', 'is_fork', nullable=False, existing_nullable=True) def downgrade(): diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index b8d0801..3f13ed8 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -273,7 +273,11 @@ def get_pull_request_ready_branch(): branch = repo_obj.lookup_branch(branchname) diff_commits = [] - if repo.is_fork and repo.parent: + + if repo.is_fork and not repo.parent: + return None + + if repo.is_fork: parentpath = os.path.join( pagure.APP.config['GIT_FOLDER'], repo.parent.path) if repo.parent.is_fork: diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 596d5c8..1f22ace 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -1412,7 +1412,7 @@ def fork_project(session, user, repo, gitfolder, description=repo.description, user_id=user_obj.id, parent_id=repo.id, - is_fork = True, + is_fork=True, hook_token=pagure.lib.login.id_generator(40) ) diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index d3f431d..58816c2 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -198,7 +198,7 @@ def view_repo_branch(repo, branchname, username=None): diff_commits = [] - if repo.is_fork: + if repo.is_fork and repo.parent: parentname = os.path.join( APP.config['GIT_FOLDER'], repo.parent.path) else: From e483128f552e3fbe81c825783de8a22b90141074 Mon Sep 17 00:00:00 2001 From: farhaanbukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 7/12] Add feature to make fork independent after deletion of main repo --- diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index 3f13ed8..828e50e 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -274,10 +274,7 @@ def get_pull_request_ready_branch(): diff_commits = [] - if repo.is_fork and not repo.parent: - return None - - if repo.is_fork: + if repo.is_fork and repo.parent: parentpath = os.path.join( pagure.APP.config['GIT_FOLDER'], repo.parent.path) if repo.parent.is_fork: diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 58816c2..1b114b4 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1326,6 +1326,7 @@ def delete_repo(repo, username=None): 'You are not allowed to change the settings for this project') try: + reponame = repo.fullname for issue in repo.issues: for comment in issue.comments: SESSION.delete(comment) @@ -1333,6 +1334,18 @@ def delete_repo(repo, username=None): SESSION.delete(issue) SESSION.delete(repo) SESSION.commit() + + projects = pagure.lib.search_projects(SESSION, fork=True, pattern=reponame) + + if projects: + for project in projects: + project_settings = project.settings + project_settings['pull_requests'] = True + project_settings['issue_tracker'] = True + project.settings = project_settings + SESSION.add(project) + SESSION.commit() + except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) From bea4ff4423dda7e575734911dba5df92f831eecb Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 8/12] Fix changes for deleted fork in UI As pingou told that "fork should be fork" so removing the ability to send PR or have issue tracker for forks whoes main repo is deleted and a clear message saying the "Main repo is deleted" in the UI. --- diff --git a/pagure/templates/repo_master.html b/pagure/templates/repo_master.html index 70c626f..da5ee5d 100644 --- a/pagure/templates/repo_master.html +++ b/pagure/templates/repo_master.html @@ -78,6 +78,10 @@ {{ repo.parent.fullname }}
+ {% elif repo.is_fork and not repo.parent %} +
+ Main repo is deleted +
{% endif %}
{% if repo.description %}{{ repo.description | safe }}{% else %}-{% endif -%} diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 1b114b4..46e30f7 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1326,7 +1326,6 @@ def delete_repo(repo, username=None): 'You are not allowed to change the settings for this project') try: - reponame = repo.fullname for issue in repo.issues: for comment in issue.comments: SESSION.delete(comment) @@ -1335,17 +1334,6 @@ def delete_repo(repo, username=None): SESSION.delete(repo) SESSION.commit() - projects = pagure.lib.search_projects(SESSION, fork=True, pattern=reponame) - - if projects: - for project in projects: - project_settings = project.settings - project_settings['pull_requests'] = True - project_settings['issue_tracker'] = True - project.settings = project_settings - SESSION.add(project) - SESSION.commit() - except SQLAlchemyError as err: # pragma: no cover SESSION.rollback() APP.logger.exception(err) From 72ffb0a085f56a38bd093880b1b623b6c7176d1d Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 9/12] Fix alembic, repo_master and commit endpoint for unaccesible fork --- diff --git a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py index d10f299..dd1a7ca 100644 --- a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py +++ b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py @@ -1,7 +1,7 @@ """Add is_fork column to projects Revision ID: 1d18843a1994 -Revises: 43df5e588a87 +Revises: 17cd553ebd51 Create Date: 2016-07-17 22:02:14.495146 """ diff --git a/pagure/templates/repo_master.html b/pagure/templates/repo_master.html index da5ee5d..1fa75be 100644 --- a/pagure/templates/repo_master.html +++ b/pagure/templates/repo_master.html @@ -80,7 +80,7 @@
{% elif repo.is_fork and not repo.parent %}
- Main repo is deleted + Fork from a deleted repository
{% endif %}
diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 46e30f7..6d75e65 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -322,7 +322,7 @@ def view_commits(repo, branchname=None, username=None): diff_commits = [] diff_commits_full = [] - if repo.is_fork: + if repo.is_fork and repo.parent: parentname = os.path.join( APP.config['GIT_FOLDER'], repo.parent.path) else: From 7fedd0cc8661c119e86f6bcb375fbba3681841b0 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 10/12] Adding test for unaccessible fork --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index c3cf892..11b97a2 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1972,6 +1972,50 @@ index 0000000..2a552bb 'Fork and Edit\n \n', output.data) + @patch('pagure.lib.notify.send_email') + def test_fork_without_main_repo(self, send_email): + """ Test the fork without the main repo. """ + send_email.return_value = True + + tests.create_projects(self.session) + item = pagure.lib.model.Project( + user_id=2, # foo + name='test', + description='test project #1', + hook_token='aaabbb', + is_fork=True, + ) + self.session.add(item) + self.session.commit() + + tests.create_projects_git( + os.path.join(tests.HERE, 'repos', 'forks', 'foo'), bare=True) + + # Create a git repo to play with + gitrepo = os.path.join(tests.HERE, 'repos', 'test.git') + self.assertFalse(os.path.exists(gitrepo)) + os.makedirs(gitrepo) + repo = pygit2.init_repository(gitrepo, bare=True) + + # Create a fork of this repo + newpath = tempfile.mkdtemp(prefix='pagure-fork-test') + gitrepo = os.path.join(tests.HERE, 'repos', 'forks', 'foo', 'test.git') + new_repo = pygit2.clone_repository(gitrepo, newpath) + tests.add_content_git_repo(gitrepo) + + # UI test for deleted main + output = self.app.get('/fork/foo/test') + self.assertEqual(output.status_code, 200) + self.assertIn('Fork from a deleted repository\n', output.data) + + output = self.app.get('/fork/foo/test/pull-requests') + self.assertEqual(output.status_code, 200) + + # Testing commit endpoint + output = self.app.get('/fork/foo/test/commits/master') + self.assertEqual(output.status_code, 200) + self.assertIn('Commits 2\n \n', output.data) + shutil.rmtree(newpath) if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskForktests) From 6279ea85ab37d649996274b9023bf36bd2c8bff0 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 11/12] Fix test and add more endpoints to check --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 11b97a2..909cc59 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1978,16 +1978,31 @@ index 0000000..2a552bb send_email.return_value = True tests.create_projects(self.session) + + # Create a fork with no parent i.e parent_id = None item = pagure.lib.model.Project( user_id=2, # foo name='test', description='test project #1', hook_token='aaabbb', is_fork=True, + parent_id=None, ) self.session.add(item) self.session.commit() + # Get fork project + project = pagure.lib.get_project(self.session, 'test', 'foo') + + # Pull-requests and issue-trackers are off for forks + # lib function is not used here so mannually turning them off + project_settings = project.settings + project_settings['pull_requests'] = False + project_settings['issue_tracker'] = False + project.settings = project_settings + self.session.add(project) + self.session.commit() + tests.create_projects_git( os.path.join(tests.HERE, 'repos', 'forks', 'foo'), bare=True) @@ -2008,13 +2023,19 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 200) self.assertIn('Fork from a deleted repository\n', output.data) - output = self.app.get('/fork/foo/test/pull-requests') - self.assertEqual(output.status_code, 200) - # Testing commit endpoint output = self.app.get('/fork/foo/test/commits/master') self.assertEqual(output.status_code, 200) self.assertIn('Commits 2\n \n', output.data) + + # Test pull-request endpoint + output = self.app.get('/fork/foo/test/pull-requests') + self.assertEqual(output.status_code, 404) + + # Test issue-tracker endpoint + output = self.app.get('/fork/foo/test/issues') + self.assertEqual(output.status_code, 404) + shutil.rmtree(newpath) if __name__ == '__main__': From 874f86753ad1572e651bf0d93c6b6d7f5ebffd08 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Aug 31 2016 09:23:35 +0000 Subject: [PATCH 12/12] Update migration file --- diff --git a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py index dd1a7ca..71e76f2 100644 --- a/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py +++ b/alembic/versions/1d18843a1994_add_is_fork_column_to_projects.py @@ -1,14 +1,14 @@ """Add is_fork column to projects Revision ID: 1d18843a1994 -Revises: 17cd553ebd51 +Revises: 32d636cb5e00 Create Date: 2016-07-17 22:02:14.495146 """ # revision identifiers, used by Alembic. revision = '1d18843a1994' -down_revision = '43df5e588a87' +down_revision = '32d636cb5e00' from alembic import op import sqlalchemy as sa