From db724b051ed19c9605d3467ea9d29eb239d93ecf Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 01 2015 15:54:14 +0000 Subject: [PATCH 1/3] Handle the situation where there are multiple branch of the same name in the same repo In those case, git/pygit2 does not know which branch to take so in those case we take the ref of the branch from the origin repo. --- diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index 003d58a..7d2db13 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -205,9 +205,13 @@ def mergeable_request_pull(): try: branch_ref = new_repo.lookup_reference( request.branch).resolve() - except ValueError: - branch_ref = new_repo.lookup_reference( - 'refs/heads/%s' % request.branch).resolve() + except (ValueError, KeyError): + try: + branch_ref = new_repo.lookup_reference( + 'refs/heads/%s' % request.branch).resolve() + except (ValueError, KeyError): + branch_ref = new_repo.lookup_reference( + 'remote/origin/%s' % request.branch).resolve() refname = '%s:%s' % (branch_ref.name, branch_ref.name) if ( diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 4ae7cbb..1b41c9d 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -770,9 +770,13 @@ def merge_pull_request(session, repo, request, username, request_folder): try: branch_ref = new_repo.lookup_reference( request.branch).resolve() - except ValueError: - branch_ref = new_repo.lookup_reference( - 'refs/heads/%s' % request.branch).resolve() + except (ValueError, KeyError): + try: + branch_ref = new_repo.lookup_reference( + 'refs/heads/%s' % request.branch).resolve() + except (ValueError, KeyError): + branch_ref = new_repo.lookup_reference( + 'remote/origin/%s' % request.branch).resolve() refname = '%s:%s' % (branch_ref.name, branch_ref.name) if ( From 74e2ba30a20b17cde519785967a7c3e025cb5784 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 02 2015 06:44:17 +0000 Subject: [PATCH 2/3] Rework the way we find the references of a specific branch This should avoid running into problems when there are in the same repo, from two different remotes a branch with the same name. --- diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index 7d2db13..de052f3 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -202,16 +202,19 @@ def mergeable_request_pull(): if merge is None: mergecode = new_repo.merge_analysis(repo_commit.oid)[0] - try: + refs = new_repo.listall_references() + if request.branch in refs: branch_ref = new_repo.lookup_reference( request.branch).resolve() - except (ValueError, KeyError): - try: - branch_ref = new_repo.lookup_reference( - 'refs/heads/%s' % request.branch).resolve() - except (ValueError, KeyError): - branch_ref = new_repo.lookup_reference( - 'remote/origin/%s' % request.branch).resolve() + elif 'refs/heads/%s' % request.branch in refs: + branch_ref = new_repo.lookup_reference( + 'refs/heads/%s' % request.branch).resolve() + elif 'refs/remotes/origin/%s' % request.branch in refs: + branch_ref = new_repo.lookup_reference( + 'refs/remotes/origin/%s' % request.branch).resolve() + else: + raise pagure.exceptions.PagureException( + 'No refs found for %s' % request.branch) refname = '%s:%s' % (branch_ref.name, branch_ref.name) if ( diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 1b41c9d..2e46d7d 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -767,16 +767,19 @@ def merge_pull_request(session, repo, request, username, request_folder): if merge is None: mergecode = new_repo.merge_analysis(repo_commit.oid)[0] - try: + refs = new_repo.listall_references() + if request.branch in refs: branch_ref = new_repo.lookup_reference( request.branch).resolve() - except (ValueError, KeyError): - try: - branch_ref = new_repo.lookup_reference( - 'refs/heads/%s' % request.branch).resolve() - except (ValueError, KeyError): - branch_ref = new_repo.lookup_reference( - 'remote/origin/%s' % request.branch).resolve() + elif 'refs/heads/%s' % request.branch in refs: + branch_ref = new_repo.lookup_reference( + 'refs/heads/%s' % request.branch).resolve() + elif 'refs/remotes/origin/%s' % request.branch in refs: + branch_ref = new_repo.lookup_reference( + 'refs/remotes/origin/%s' % request.branch).resolve() + else: + raise pagure.exceptions.PagureException( + 'No refs found for %s' % request.branch) refname = '%s:%s' % (branch_ref.name, branch_ref.name) if ( From c5726779a352aa98a5395ce50a8ed48328788149 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jun 02 2015 06:51:35 +0000 Subject: [PATCH 3/3] Create a dedicated get_branch_ref method to find a reference of a branch --- diff --git a/pagure/internal/__init__.py b/pagure/internal/__init__.py index de052f3..6e80331 100644 --- a/pagure/internal/__init__.py +++ b/pagure/internal/__init__.py @@ -24,6 +24,7 @@ PV = flask.Blueprint('internal_ns', __name__, url_prefix='/pv') import pagure import pagure.forms import pagure.lib +import pagure.lib.git import pagure.ui.fork from pagure import is_repo_admin, authenticated @@ -202,19 +203,7 @@ def mergeable_request_pull(): if merge is None: mergecode = new_repo.merge_analysis(repo_commit.oid)[0] - refs = new_repo.listall_references() - if request.branch in refs: - branch_ref = new_repo.lookup_reference( - request.branch).resolve() - elif 'refs/heads/%s' % request.branch in refs: - branch_ref = new_repo.lookup_reference( - 'refs/heads/%s' % request.branch).resolve() - elif 'refs/remotes/origin/%s' % request.branch in refs: - branch_ref = new_repo.lookup_reference( - 'refs/remotes/origin/%s' % request.branch).resolve() - else: - raise pagure.exceptions.PagureException( - 'No refs found for %s' % request.branch) + branch_ref = pagure.lib.git.get_branch_ref(new_repo, request.branch) refname = '%s:%s' % (branch_ref.name, branch_ref.name) if ( diff --git a/pagure/lib/git.py b/pagure/lib/git.py index 2e46d7d..6ae3dee 100644 --- a/pagure/lib/git.py +++ b/pagure/lib/git.py @@ -733,6 +733,25 @@ def get_username(abspath): return username +def get_branch_ref(repo, branchname): + ''' Return the reference to the specified branch or raises an exception. + ''' + branch_ref = None + refs = repo.listall_references() + if branchname in refs: + branch_ref = repo.lookup_reference(branchname).resolve() + elif 'refs/heads/%s' % branchname in refs: + branch_ref = repo.lookup_reference( + 'refs/heads/%s' % branchname).resolve() + elif 'refs/remotes/origin/%s' % branchname in refs: + branch_ref = repo.lookup_reference( + 'refs/remotes/origin/%s' % branchname).resolve() + else: + raise pagure.exceptions.PagureException( + 'No refs found for %s' % branchname) + return branch_ref + + def merge_pull_request(session, repo, request, username, request_folder): ''' Merge the specified pull-request. ''' @@ -767,19 +786,7 @@ def merge_pull_request(session, repo, request, username, request_folder): if merge is None: mergecode = new_repo.merge_analysis(repo_commit.oid)[0] - refs = new_repo.listall_references() - if request.branch in refs: - branch_ref = new_repo.lookup_reference( - request.branch).resolve() - elif 'refs/heads/%s' % request.branch in refs: - branch_ref = new_repo.lookup_reference( - 'refs/heads/%s' % request.branch).resolve() - elif 'refs/remotes/origin/%s' % request.branch in refs: - branch_ref = new_repo.lookup_reference( - 'refs/remotes/origin/%s' % request.branch).resolve() - else: - raise pagure.exceptions.PagureException( - 'No refs found for %s' % request.branch) + branch_ref = get_branch_ref(new_repo, request.branch) refname = '%s:%s' % (branch_ref.name, branch_ref.name) if (