diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index c2b6323ce..8d3c9c01a 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -2,6 +2,7 @@ import difflib import json +import os import re import textwrap from datetime import datetime @@ -661,3 +662,12 @@ def find_line_number_of_relevant_line_in_file(diff_files: List[FilePatchInfo], absolute_position = start2 + delta - 1 break return position, absolute_position + +def github_output(output_data: dict, key_name: str): + if get_settings().github_action_config.enable_output is False: + return + + output = os.getenv('GITHUB_OUTPUT') + key_data = output_data.get(key_name, {}) + with open(output, 'w') as f: + f.write(f"{key_name}={json.dumps(key_data, indent=None, ensure_ascii=False)}") diff --git a/pr_agent/servers/github_action_runner.py b/pr_agent/servers/github_action_runner.py index d4278156e..6f9b62753 100644 --- a/pr_agent/servers/github_action_runner.py +++ b/pr_agent/servers/github_action_runner.py @@ -59,6 +59,8 @@ async def run_action(): get_settings().set("OPENAI.ORG", OPENAI_ORG) get_settings().set("GITHUB.USER_TOKEN", GITHUB_TOKEN) get_settings().set("GITHUB.DEPLOYMENT_TYPE", "user") + enable_output = get_setting_or_env("GITHUB_ACTION_CONFIG.ENABLE_OUTPUT", False) + get_settings().set("GITHUB_ACTION_CONFIG.ENABLE_OUTPUT", enable_output) # Load the event payload try: diff --git a/pr_agent/settings/configuration.toml b/pr_agent/settings/configuration.toml index 837c71d38..0f43ccd84 100644 --- a/pr_agent/settings/configuration.toml +++ b/pr_agent/settings/configuration.toml @@ -133,6 +133,7 @@ try_fix_invalid_inline_comments = true # auto_review = true # set as env var in .github/workflows/pr-agent.yaml # auto_describe = true # set as env var in .github/workflows/pr-agent.yaml # auto_improve = true # set as env var in .github/workflows/pr-agent.yaml +# enable_output = true # set as env var in .github/workflows/pr-agent.yaml [github_app] # these toggles allows running the github app from custom deployments diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index 4d1739a54..38c2ef5ca 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -8,7 +8,7 @@ from pr_agent.algo.ai_handlers.litellm_ai_handler import LiteLLMAIHandler from pr_agent.algo.pr_processing import get_pr_diff, retry_with_fallback_models from pr_agent.algo.token_handler import TokenHandler -from pr_agent.algo.utils import convert_to_markdown, load_yaml, ModelType +from pr_agent.algo.utils import convert_to_markdown, github_output, load_yaml, ModelType from pr_agent.config_loader import get_settings from pr_agent.git_providers import get_git_provider from pr_agent.git_providers.git_provider import IncrementalPR, get_main_pr_language @@ -192,6 +192,7 @@ def _prepare_pr_review(self) -> str: data = load_yaml(self.prediction.strip(), keys_fix_yaml=["estimated_effort_to_review_[1-5]:", "security_concerns:", "possible_issues:", "relevant_file:", "relevant_line:", "suggestion:"]) + github_output(data, 'review') if 'code_feedback' in data: code_feedback = data['code_feedback'] diff --git a/tests/unittest/test_github_output.py b/tests/unittest/test_github_output.py new file mode 100644 index 000000000..8b6d912b4 --- /dev/null +++ b/tests/unittest/test_github_output.py @@ -0,0 +1,31 @@ +import os +import json +from pr_agent.algo.utils import get_settings, github_output + +class TestGitHubOutput: + def test_github_output_enabled(self, monkeypatch, tmp_path): + get_settings().set('GITHUB_ACTION_CONFIG.ENABLE_OUTPUT', True) + monkeypatch.setenv('GITHUB_OUTPUT', str(tmp_path / 'output')) + output_data = {'key1': {'value1': 1, 'value2': 2}} + key_name = 'key1' + + github_output(output_data, key_name) + + with open(str(tmp_path / 'output.json'), 'r') as f: + env_value = f.read() + + actual_key = env_value.split('=')[0] + actual_data = json.loads(env_value.split('=')[1]) + + assert actual_key == key_name + assert actual_data == output_data[key_name] + + def test_github_output_disabled(self, monkeypatch, tmp_path): + get_settings().set('GITHUB_ACTION_CONFIG.ENABLE_OUTPUT', False) + monkeypatch.setenv('GITHUB_OUTPUT', str(tmp_path / 'output')) + output_data = {'key1': {'value1': 1, 'value2': 2}} + key_name = 'key1' + + github_output(output_data, key_name) + + assert not os.path.exists(str(tmp_path / 'output')) \ No newline at end of file