diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index e5acd6b..fe8dec5 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -198,86 +198,17 @@ def mergeable_request_pull(): 'short_code': MERGE_OPTIONS[request.merge_status]['short_code'], 'message': MERGE_OPTIONS[request.merge_status]['message']}) - # Get the fork - repopath = pagure.get_repo_path(request.project_from) - fork_obj = pygit2.Repository(repopath) - - # Get the original repo - parentpath = pagure.get_repo_path(request.project) - - # Clone the original repo into a temp folder - newpath = tempfile.mkdtemp(prefix='pagure-pr-check') - new_repo = pygit2.clone_repository(parentpath, newpath) - - # Checkout the correct branch - branch_to = pagure.lib.git.get_branch_ref(new_repo, request.branch) - if not branch_to: - shutil.rmtree(newpath) - flask.abort( - 400, - 'Branch %s could not be found in the repo %s' % ( - request.branch, request.project.fullname - )) - new_repo.checkout(branch_to) - - branch = pagure.lib.git.get_branch_ref(fork_obj, request.branch_from) - if not branch: - shutil.rmtree(newpath) - flask.abort( - 400, - 'Branch %s could not be found in the repo %s' % ( - request.branch_from, request.project_from.fullname - )) - - repo_commit = fork_obj[branch.get_object().hex] - - ori_remote = new_repo.remotes[0] - # Add the fork as remote repo - reponame = '%s_%s' % (request.user.user, request.project.name) - remote = new_repo.create_remote(reponame, repopath) - - # Fetch the commits - remote.fetch() - - merge = new_repo.merge(repo_commit.oid) - if merge is None: - mergecode = new_repo.merge_analysis(repo_commit.oid)[0] - - if ( - (merge is not None and merge.is_uptodate) - or - (merge is None and - mergecode & pygit2.GIT_MERGE_ANALYSIS_UP_TO_DATE)): - - shutil.rmtree(newpath) - request.merge_status = 'NO_CHANGE' - pagure.SESSION.commit() - elif ( - (merge is not None and merge.is_fastforward) - or - (merge is None and - mergecode & pygit2.GIT_MERGE_ANALYSIS_FASTFORWARD)): - shutil.rmtree(newpath) - request.merge_status = 'FFORWARD' - pagure.SESSION.commit() + try: + merge_status = pagure.lib.git.merge_pull_request( + session=pagure.SESSION, + request=request, + username=flask.g.fas_user.username, + request_folder=None, + domerge=False) + except pagure.exceptions.PagureException as err: + flask.abort(400, err.message) - else: - tree = None - try: - tree = new_repo.index.write_tree() - except pygit2.GitError: - shutil.rmtree(newpath) - request.merge_status = 'CONFLICTS' - pagure.SESSION.commit() - return flask.jsonify({ - 'code': 'CONFLICTS', - 'short_code': MERGE_OPTIONS['CONFLICTS']['short_code'], - 'message': MERGE_OPTIONS['CONFLICTS']['message']}) - - shutil.rmtree(newpath) - request.merge_status = 'MERGE' - pagure.SESSION.commit() return flask.jsonify({ - 'code': request.merge_status, - 'short_code': MERGE_OPTIONS[request.merge_status]['short_code'], - 'message': MERGE_OPTIONS[request.merge_status]['message']}) + 'code': merge_status, + 'short_code': MERGE_OPTIONS[merge_status]['short_code'], + 'message': MERGE_OPTIONS[merge_status]['message']}) diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 9d57c7e..156972d 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -825,7 +825,8 @@ def get_branch_ref(repo, branchname): return branch_ref -def merge_pull_request(session, request, username, request_folder): +def merge_pull_request( + session, request, username, request_folder, domerge=True): ''' Merge the specified pull-request. ''' # Get the fork @@ -848,7 +849,7 @@ def merge_pull_request(session, request, username, request_folder): branch_ref = get_branch_ref(new_repo, request.branch) if not branch_ref: shutil.rmtree(newpath) - raise pagure.exceptions.PagureException( + raise pagure.exceptions.BranchNotFoundException( 'Branch %s could not be found in the repo %s' % ( request.branch, request.project.fullname )) @@ -858,7 +859,7 @@ def merge_pull_request(session, request, username, request_folder): branch = get_branch_ref(fork_obj, request.branch_from) if not branch: shutil.rmtree(newpath) - raise pagure.exceptions.PagureException( + raise pagure.exceptions.BranchNotFoundException( 'Branch %s could not be found in the repo %s' % ( request.branch_from, request.project_from.fullname )) @@ -883,32 +884,44 @@ def merge_pull_request(session, request, username, request_folder): or (merge is None and mergecode & pygit2.GIT_MERGE_ANALYSIS_UP_TO_DATE)): - pagure.lib.close_pull_request( - session, request, username, - requestfolder=request_folder) - try: - session.commit() - except SQLAlchemyError as err: # pragma: no cover - session.rollback() - APP.logger.exception(err) - shutil.rmtree(newpath) + + if domerge: + pagure.lib.close_pull_request( + session, request, username, + requestfolder=request_folder) + try: + session.commit() + except SQLAlchemyError as err: # pragma: no cover + session.rollback() + APP.logger.exception(err) + shutil.rmtree(newpath) + raise pagure.exceptions.PagureException( + 'Could not close this pull-request') raise pagure.exceptions.PagureException( - 'Could not close this pull-request') - raise pagure.exceptions.PagureException( - 'Nothing to do, changes were already merged') + 'Nothing to do, changes were already merged') + else: + request.merge_status = 'NO_CHANGE' + session.commit() + return 'NO_CHANGE' elif ( (merge is not None and merge.is_fastforward) or (merge is None and mergecode & pygit2.GIT_MERGE_ANALYSIS_FASTFORWARD)): - if merge is not None: - # This is depending on the pygit2 version - branch_ref.target = merge.fastforward_oid - elif merge is None and mergecode is not None: - branch_ref.set_target(repo_commit.oid.hex) - ori_remote.push(refname) + if domerge: + if merge is not None: + # This is depending on the pygit2 version + branch_ref.target = merge.fastforward_oid + elif merge is None and mergecode is not None: + branch_ref.set_target(repo_commit.oid.hex) + + ori_remote.push(refname) + else: + request.merge_status = 'FFORWARD' + session.commit() + return 'FFORWARD' else: tree = None @@ -916,7 +929,17 @@ def merge_pull_request(session, request, username, request_folder): tree = new_repo.index.write_tree() except pygit2.GitError: shutil.rmtree(newpath) - raise pagure.exceptions.PagureException('Merge conflicts!') + if domerge: + raise pagure.exceptions.PagureException('Merge conflicts!') + else: + request.merge_status = 'CONFLICTS' + session.commit() + return 'CONFLICTS' + + if not domerge: + request.merge_status = 'MERGE' + session.commit() + return 'MERGE' head = new_repo.lookup_reference('HEAD').get_object() new_repo.create_commit(