diff --git a/cumulusci_ado/cumulusci_plugin.yml b/cumulusci_ado/cumulusci_plugin.yml index 4bff1bc..97f70d3 100644 --- a/cumulusci_ado/cumulusci_plugin.yml +++ b/cumulusci_ado/cumulusci_plugin.yml @@ -17,6 +17,7 @@ plugins: organisation_artifact: False # When True artifacts are created at Organisation level otherwise, its project level. feed_name: SFCore Packages # Default feed name for salesforce packages artifact_folder_path: # Artifact folder in repo to upload for salesforce packages + pull_request_approve_on_merge: True # When True, the created pull request is approved on merge. services: azure_devops: description: Configure connection for Azure DevOps Server diff --git a/cumulusci_ado/vcs/ado/adapter.py b/cumulusci_ado/vcs/ado/adapter.py index ff8017a..fafcefb 100644 --- a/cumulusci_ado/vcs/ado/adapter.py +++ b/cumulusci_ado/vcs/ado/adapter.py @@ -29,6 +29,7 @@ GitStatusContext, GitTargetVersionDescriptor, GitVersionDescriptor, + IdentityRefWithVote, TeamProjectReference, ) from azure.devops.v7_0.upack_api.models import JsonPatchOperation, PackageVersionDetails @@ -476,6 +477,40 @@ def merge(self) -> None: # Set auto-complete with completion options self.set_auto_complete(completion_options) + if self.repo.config("pull_request_approve_on_merge"): + self.approve_pull_request() + + def approve_pull_request(self) -> None: + """Approves the pull request.""" + try: + reviewer_id = ( + self.pull_request.created_by.id + if self.pull_request.created_by + else None + ) + if not reviewer_id: + raise AzureDevOpsServiceError( + "Cannot approve pull request because reviewer identity is missing." + ) + + reviewer_vote = IdentityRefWithVote(id=reviewer_id, vote=10) + reviewer = self.repo.git_client.create_pull_request_reviewer( + reviewer=reviewer_vote, + repository_id=self.repo.id, + pull_request_id=self.number, + reviewer_id=reviewer_id, + project=self.repo.project_id, + ) + self.repo.logger.info( + f"{reviewer.display_name or reviewer.id or 'Unknown'} approved pull request #{self.number}." + ) + except AzureDevOpsServiceError as e: + e.message = f"Failed to approve pull request #{self.number}: {e.message}" + raise AzureDevOpsServiceError(e) + except Exception as ex: + message = f"Unexpected error during pull request approval: {str(ex)}" + raise Exception(message) + def set_auto_complete( self, completion_options: GitPullRequestCompletionOptions ) -> None: