def METHOD_NAME(self, repo: CkanRepo, self_review: bool) -> bool:
    if not self_review and not self.approvers():
        print(f'PR #{self.pull_request.number} is not approved!')
        return False
    if not repo.on_primary_branch():
        print('Not on primary branch!')
        return False
    if not repo.primary_branch_up_to_date():
        print('Primary branch is not up to date!')
        return False
    branch = self.latest_commit(repo)
    if not branch:
        print(f'PR #{self.pull_request.number} commit {self.pull_request.head.sha} not found!')
        return False
    # Valid; do it!
    # repo.index.merge_tree doesn't auto resolve conflicts
    repo.git.merge(branch, no_commit=True, no_ff=True)
    repo.prepend_line(repo.changelog_path(), self.changelog_entry())
    repo.user_edit_file(repo.changelog_path())
    # repo.index.add() doesn't respect core.autocrlf
    repo.git.add(str(repo.changelog_path()))
    # repo.index.commit doesn't properly resolve a merge started via repo.git.merge
    repo.git.commit(m=self.merge_commit_message())
    return True