From 31a8f5302abbbcd7b2862dac793745f892a0f7c7 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Tue, 12 Mar 2024 17:02:45 +0200 Subject: [PATCH] Update get_pr_labels method to support label updates and prevent unnecessary label republishing --- pr_agent/git_providers/azuredevops_provider.py | 2 +- pr_agent/git_providers/bitbucket_provider.py | 2 +- pr_agent/git_providers/bitbucket_server_provider.py | 2 +- pr_agent/git_providers/codecommit_provider.py | 2 +- pr_agent/git_providers/gerrit_provider.py | 2 +- pr_agent/git_providers/git_provider.py | 2 +- pr_agent/git_providers/github_provider.py | 11 +++++++++-- pr_agent/git_providers/gitlab_provider.py | 2 +- pr_agent/git_providers/local_git_provider.py | 2 +- pr_agent/tools/pr_description.py | 10 +++++++--- pr_agent/tools/pr_reviewer.py | 11 +++++++---- 11 files changed, 31 insertions(+), 17 deletions(-) diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py index 3cded7215..a710c2544 100644 --- a/pr_agent/git_providers/azuredevops_provider.py +++ b/pr_agent/git_providers/azuredevops_provider.py @@ -165,7 +165,7 @@ def publish_labels(self, pr_types): except Exception as e: get_logger().exception(f"Failed to publish labels, error: {e}") - def get_pr_labels(self): + def get_pr_labels(self, update=False): try: labels = self.azure_devops_client.get_pull_request_labels( project=self.workspace_slug, diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py index c4873f888..3516516c0 100644 --- a/pr_agent/git_providers/bitbucket_provider.py +++ b/pr_agent/git_providers/bitbucket_provider.py @@ -404,5 +404,5 @@ def publish_labels(self, pr_types: list): pass # bitbucket does not support labels - def get_pr_labels(self): + def get_pr_labels(self, update=False): pass diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index 3b8168ea8..0f9e58d42 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -347,7 +347,7 @@ def publish_labels(self, pr_types: list): pass # bitbucket does not support labels - def get_pr_labels(self): + def get_pr_labels(self, update=False): pass def _get_pr_comments_url(self): diff --git a/pr_agent/git_providers/codecommit_provider.py b/pr_agent/git_providers/codecommit_provider.py index cbaf75f1c..f035351df 100644 --- a/pr_agent/git_providers/codecommit_provider.py +++ b/pr_agent/git_providers/codecommit_provider.py @@ -216,7 +216,7 @@ def publish_code_suggestions(self, code_suggestions: list) -> bool: def publish_labels(self, labels): return [""] # not implemented yet - def get_pr_labels(self): + def get_pr_labels(self, update=False): return [""] # not implemented yet def remove_initial_comment(self): diff --git a/pr_agent/git_providers/gerrit_provider.py b/pr_agent/git_providers/gerrit_provider.py index 5a6da1a29..8e33151a9 100644 --- a/pr_agent/git_providers/gerrit_provider.py +++ b/pr_agent/git_providers/gerrit_provider.py @@ -208,7 +208,7 @@ def get_issue_comments(self): Comment = namedtuple('Comment', ['body']) return Comments([Comment(c['message']) for c in reversed(comments)]) - def get_pr_labels(self): + def get_pr_labels(self, update=False): raise NotImplementedError( 'Getting labels is not implemented for the gerrit provider') diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index e8a78b4b3..9eb09a1a3 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -164,7 +164,7 @@ def publish_labels(self, labels): pass @abstractmethod - def get_pr_labels(self): + def get_pr_labels(self, update=False): pass def get_repo_labels(self): diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index 2f928f82e..b6d04bc0a 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -650,9 +650,16 @@ def publish_labels(self, pr_types): except Exception as e: get_logger().exception(f"Failed to publish labels, error: {e}") - def get_pr_labels(self): + def get_pr_labels(self, update=False): try: - return [label.name for label in self.pr.labels] + if not update: + labels =self.pr.labels + return [label.name for label in labels] + else: # obtain the latest labels. Maybe they changed while the AI was running + headers, labels = self.pr._requester.requestJsonAndCheck( + "GET", f"{self.pr.issue_url}/labels") + return [label['name'] for label in labels] + except Exception as e: get_logger().exception(f"Failed to get labels, error: {e}") return [] diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 5021896dd..3a2e1c850 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -419,7 +419,7 @@ def publish_labels(self, pr_types): def publish_inline_comments(self, comments: list[dict]): pass - def get_pr_labels(self): + def get_pr_labels(self, update=False): return self.mr.labels def get_repo_labels(self): diff --git a/pr_agent/git_providers/local_git_provider.py b/pr_agent/git_providers/local_git_provider.py index 83c507918..678a519ca 100644 --- a/pr_agent/git_providers/local_git_provider.py +++ b/pr_agent/git_providers/local_git_provider.py @@ -176,5 +176,5 @@ def get_pr_title(self): def get_issue_comments(self): raise NotImplementedError('Getting issue comments is not implemented for the local git provider') - def get_pr_labels(self): + def get_pr_labels(self, update=False): raise NotImplementedError('Getting labels is not implemented for the local git provider') diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py index 33674d00f..d5ca914c1 100644 --- a/pr_agent/tools/pr_description.py +++ b/pr_agent/tools/pr_description.py @@ -118,11 +118,15 @@ async def run(self): if get_settings().config.publish_output: # publish labels if get_settings().pr_description.publish_labels and self.git_provider.is_supported("get_labels"): - original_labels = self.git_provider.get_pr_labels() + original_labels = self.git_provider.get_pr_labels(update=True) get_logger().debug(f"original labels", artifact=original_labels) user_labels = get_user_labels(original_labels) - get_logger().debug(f"published labels:\n{pr_labels + user_labels}") - self.git_provider.publish_labels(pr_labels + user_labels) + new_labels = pr_labels + user_labels + get_logger().debug(f"published labels", artifact=new_labels) + if new_labels != original_labels: + self.git_provider.publish_labels(new_labels) + else: + get_logger().debug(f"Labels are the same, not updating") # publish description if get_settings().pr_description.publish_description_as_comment: diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index 854e351c6..696b62fb8 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -369,17 +369,20 @@ def set_review_labels(self, data): if security_concerns_bool: review_labels.append('Possible security concern') - current_labels = self.git_provider.get_pr_labels() + current_labels = self.git_provider.get_pr_labels(update=True) + get_logger().debug(f"Current labels:\n{current_labels}") if current_labels: current_labels_filtered = [label for label in current_labels if not label.lower().startswith('review effort [1-5]:') and not label.lower().startswith( 'possible security concern')] else: current_labels_filtered = [] - if current_labels or review_labels: - get_logger().debug(f"Current labels:\n{current_labels}") + new_labels = review_labels + current_labels_filtered + if (current_labels or review_labels) and new_labels != current_labels: get_logger().info(f"Setting review labels:\n{review_labels + current_labels_filtered}") - self.git_provider.publish_labels(review_labels + current_labels_filtered) + self.git_provider.publish_labels(new_labels) + else: + get_logger().info(f"Review labels are already set:\n{review_labels + current_labels_filtered}") except Exception as e: get_logger().error(f"Failed to set review labels, error: {e}")