mirror of
https://github.com/qodo-ai/pr-agent.git
synced 2025-12-11 18:35:18 +00:00
Compare commits
6 commits
2000651fdb
...
702215dc79
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
702215dc79 | ||
|
|
bf5da9a9fb | ||
|
|
7b9e8bff3b | ||
|
|
d80e229bdf | ||
|
|
1315fa651b | ||
|
|
ab808fd114 |
3 changed files with 100 additions and 46 deletions
|
|
@ -56,7 +56,7 @@ A `PR Code Verified` label indicates the PR code meets ticket requirements, but
|
||||||
|
|
||||||
-
|
-
|
||||||
|
|
||||||
By default, the tool will automatically validate if the PR complies with the referenced ticket.
|
By default, the `review` tool will automatically validate if the PR complies with the referenced ticket.
|
||||||
If you want to disable this feedback, add the following line to your configuration file:
|
If you want to disable this feedback, add the following line to your configuration file:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
|
@ -75,6 +75,33 @@ A `PR Code Verified` label indicates the PR code meets ticket requirements, but
|
||||||
|
|
||||||
the `review` tool will also validate that the PR code doesn't contain any additional content that is not related to the ticket. If it does, the PR will be labeled at best as `PR Code Verified`, and the `review` tool will provide a comment with the additional unrelated content found in the PR code.
|
the `review` tool will also validate that the PR code doesn't contain any additional content that is not related to the ticket. If it does, the PR will be labeled at best as `PR Code Verified`, and the `review` tool will provide a comment with the additional unrelated content found in the PR code.
|
||||||
|
|
||||||
|
### Compliance tool
|
||||||
|
|
||||||
|
The `compliance` tool also uses ticket context to validate that PR changes fulfill the requirements specified in linked tickets.
|
||||||
|
|
||||||
|
#### Configuration options
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
By default, the `compliance` tool will automatically validate if the PR complies with the referenced ticket.
|
||||||
|
If you want to disable ticket compliance checking in the compliance tool, add the following line to your configuration file:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[pr_compliance]
|
||||||
|
require_ticket_analysis_review=false
|
||||||
|
```
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
If you set:
|
||||||
|
```toml
|
||||||
|
[pr_compliance]
|
||||||
|
check_pr_additional_content=true
|
||||||
|
```
|
||||||
|
(default: `false`)
|
||||||
|
|
||||||
|
the `compliance` tool will also validate that the PR code doesn't contain any additional content that is not related to the ticket.
|
||||||
|
|
||||||
## GitHub/Gitlab Issues Integration
|
## GitHub/Gitlab Issues Integration
|
||||||
|
|
||||||
Qodo Merge will automatically recognize GitHub/Gitlab issues mentioned in the PR description and fetch the issue content.
|
Qodo Merge will automatically recognize GitHub/Gitlab issues mentioned in the PR description and fetch the issue content.
|
||||||
|
|
|
||||||
|
|
@ -329,6 +329,10 @@ enable_global_pr_compliance = true
|
||||||
???+ example "Ticket compliance options"
|
???+ example "Ticket compliance options"
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><b>require_ticket_analysis_review</b></td>
|
||||||
|
<td>If set to true, the tool will fetch and analyze ticket context for compliance validation. Default is true.</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><b>enable_ticket_labels</b></td>
|
<td><b>enable_ticket_labels</b></td>
|
||||||
<td>If set to true, the tool will add ticket compliance labels to the PR. Default is false.</td>
|
<td>If set to true, the tool will add ticket compliance labels to the PR. Default is false.</td>
|
||||||
|
|
|
||||||
|
|
@ -123,17 +123,42 @@ class PRCodeSuggestions:
|
||||||
await self.publish_no_suggestions()
|
await self.publish_no_suggestions()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Filter data by suggestions_score_threshold
|
||||||
|
score_threshold = max(1, int(get_settings().pr_code_suggestions.suggestions_score_threshold))
|
||||||
|
data['code_suggestions'] = [
|
||||||
|
d for d in data['code_suggestions']
|
||||||
|
if int(d.get('score', 0)) >= score_threshold
|
||||||
|
]
|
||||||
|
|
||||||
|
if not data['code_suggestions']:
|
||||||
|
await self.publish_no_suggestions()
|
||||||
|
return
|
||||||
|
|
||||||
# publish the suggestions
|
# publish the suggestions
|
||||||
if get_settings().config.publish_output:
|
if get_settings().config.publish_output:
|
||||||
# If a temporary comment was published, remove it
|
# If a temporary comment was published, remove it
|
||||||
self.git_provider.remove_initial_comment()
|
self.git_provider.remove_initial_comment()
|
||||||
|
|
||||||
# Publish table summarized suggestions
|
# Logic for Inline Suggestions
|
||||||
if ((not get_settings().pr_code_suggestions.commitable_code_suggestions) and
|
dual_threshold = int(get_settings().pr_code_suggestions.dual_publishing_score_threshold)
|
||||||
self.git_provider.is_supported("gfm_markdown")):
|
if get_settings().pr_code_suggestions.commitable_code_suggestions or dual_threshold > 0:
|
||||||
|
await self.push_inline_code_suggestions(data)
|
||||||
|
|
||||||
|
# Logic for Table Suggestions
|
||||||
|
if self.git_provider.is_supported("gfm_markdown") and \
|
||||||
|
(not get_settings().pr_code_suggestions.commitable_code_suggestions or dual_threshold > 0):
|
||||||
|
|
||||||
|
data_for_table = data
|
||||||
|
# dual publishing mode
|
||||||
|
if dual_threshold > 0:
|
||||||
|
data_for_table = {'code_suggestions': []}
|
||||||
|
for suggestion in data['code_suggestions']:
|
||||||
|
if int(suggestion.get('score', 0)) >= dual_threshold:
|
||||||
|
data_for_table['code_suggestions'].append(suggestion)
|
||||||
|
|
||||||
|
if data_for_table['code_suggestions']:
|
||||||
# generate summarized suggestions
|
# generate summarized suggestions
|
||||||
pr_body = self.generate_summarized_suggestions(data)
|
pr_body = self.generate_summarized_suggestions(data_for_table)
|
||||||
get_logger().debug(f"PR output", artifact=pr_body)
|
get_logger().debug(f"PR output", artifact=pr_body)
|
||||||
|
|
||||||
# require self-review
|
# require self-review
|
||||||
|
|
@ -168,14 +193,12 @@ class PRCodeSuggestions:
|
||||||
self.git_provider.edit_comment(self.progress_response, body=pr_body)
|
self.git_provider.edit_comment(self.progress_response, body=pr_body)
|
||||||
else:
|
else:
|
||||||
self.git_provider.publish_comment(pr_body)
|
self.git_provider.publish_comment(pr_body)
|
||||||
|
|
||||||
# dual publishing mode
|
|
||||||
if int(get_settings().pr_code_suggestions.dual_publishing_score_threshold) > 0:
|
|
||||||
await self.dual_publishing(data)
|
|
||||||
else:
|
else:
|
||||||
await self.push_inline_code_suggestions(data)
|
|
||||||
if self.progress_response:
|
if self.progress_response:
|
||||||
self.git_provider.remove_comment(self.progress_response)
|
self.git_provider.remove_comment(self.progress_response)
|
||||||
|
else:
|
||||||
|
if self.progress_response and not (get_settings().pr_code_suggestions.commitable_code_suggestions or dual_threshold > 0):
|
||||||
|
self.git_provider.remove_comment(self.progress_response)
|
||||||
else:
|
else:
|
||||||
get_logger().info('Code suggestions generated for PR, but not published since publish_output is False.')
|
get_logger().info('Code suggestions generated for PR, but not published since publish_output is False.')
|
||||||
pr_body = self.generate_summarized_suggestions(data)
|
pr_body = self.generate_summarized_suggestions(data)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue