Compare commits

...

7 Commits

Author SHA1 Message Date
d93074f184 Ruff after aider
All checks were successful
Run Python tests (through Pytest) / Test (push) Successful in 24s
Verify Python project can be installed, loaded and have version checked / Test (push) Successful in 22s
2025-04-15 23:39:01 +02:00
0ae3b5777a refactor: use get_commit_messages in has_commits_on_branch 2025-04-15 23:38:57 +02:00
b1c1011c9c Initial ruff pass 2025-04-15 23:38:24 +02:00
0049067919 Enable multi-api-key secrets v2
All checks were successful
Run Python tests (through Pytest) / Test (push) Successful in 25s
Verify Python project can be installed, loaded and have version checked / Test (push) Successful in 23s
2025-04-15 23:32:18 +02:00
9dfbc5efa4 Enable multi-api-key secrets
Some checks failed
Run Python tests (through Pytest) / Test (push) Failing after 24s
Verify Python project can be installed, loaded and have version checked / Test (push) Successful in 22s
2025-04-15 23:27:55 +02:00
f28df768e7 Re-enable Aider now that system is usable again 2025-04-15 23:25:26 +02:00
d03a8aa9df Disable labels for nwo 2025-04-15 23:19:57 +02:00
5 changed files with 93 additions and 27 deletions

View File

@ -155,15 +155,16 @@ def create_aider_command(issue: str) -> list[str]:
AIDER_LINT, AIDER_LINT,
'--auto-test', '--auto-test',
'--no-auto-lint', '--no-auto-lint',
'--api-key',
secrets.llm_api_key(),
'--read', '--read',
'CONVENTIONS.md', 'CONVENTIONS.md',
'--message', '--message',
LLM_MESSAGE_FORMAT.format(issue=issue), LLM_MESSAGE_FORMAT.format(issue=issue),
'--yes-always', '--yes',
] ]
for key in secrets.llm_api_keys():
l += ['--api-key', key]
if True: if True:
l.append('--cache-prompts') l.append('--cache-prompts')
@ -255,15 +256,9 @@ def has_commits_on_branch(cwd: Path, base_branch: str, current_branch: str) -> b
True if there are commits on the current branch not in the base branch, False otherwise. True if there are commits on the current branch not in the base branch, False otherwise.
""" """
try: try:
result = subprocess.run( commit_messages = get_commit_messages(cwd, base_branch, current_branch)
['git', 'log', f'{base_branch}..{current_branch}', '--oneline'], return bool(list(commit_messages))
check=True, except Exception:
cwd=cwd,
capture_output=True,
text=True,
)
return bool(result.stdout.strip())
except subprocess.CalledProcessError:
logger.exception('Failed to check commits on branch %s', current_branch) logger.exception('Failed to check commits on branch %s', current_branch)
return False return False
@ -283,6 +278,9 @@ def run_cmd(cmd: list[str], cwd: Path | None = None, check=True) -> bool:
return result.returncode == 0 return result.returncode == 0
SKIP_AIDER = False
def solve_issue_in_repository( def solve_issue_in_repository(
args, args,
tmpdirname: Path, tmpdirname: Path,
@ -292,6 +290,8 @@ def solve_issue_in_repository(
issue_number: str, issue_number: str,
gitea_client=None, gitea_client=None,
) -> bool: ) -> bool:
logger.info('### %s #####', issue_title)
repo_url = f'{args.gitea_url}:{args.owner}/{args.repo}.git'.replace( repo_url = f'{args.gitea_url}:{args.owner}/{args.repo}.git'.replace(
'https://', 'https://',
'git@', 'git@',
@ -320,11 +320,15 @@ def solve_issue_in_repository(
# Run aider # Run aider
issue_content = f'# {issue_title}\n{issue_description}' issue_content = f'# {issue_title}\n{issue_description}'
succeeded = run_cmd( if not SKIP_AIDER:
create_aider_command(issue_content), succeeded = run_cmd(
tmpdirname, create_aider_command(issue_content),
check=False, tmpdirname,
) check=False,
)
else:
logger.warning('Skipping aider command (for testing)')
succeeded = True
if not succeeded: if not succeeded:
logger.error('Aider invocation failed for issue #%s', issue_number) logger.error('Aider invocation failed for issue #%s', issue_number)
return False return False
@ -344,7 +348,7 @@ def solve_issue_in_repository(
) )
files_changed = result.stdout.strip() files_changed = result.stdout.strip()
if not files_changed: if not files_changed and not SKIP_AIDER:
logger.info( logger.info(
'Aider did not make any changes beyond the initial ruff pass for issue #%s', 'Aider did not make any changes beyond the initial ruff pass for issue #%s',
issue_number, issue_number,

View File

@ -163,7 +163,6 @@ class GiteaClient:
'body': body, 'body': body,
'head': head, 'head': head,
'base': base, 'base': base,
'labels': labels,
} }
response = self.session.post(url, json=json_data) response = self.session.post(url, json=json_data)

View File

@ -3,9 +3,9 @@ import secret_loader
SECRETS = secret_loader.SecretLoader() SECRETS = secret_loader.SecretLoader()
def llm_api_key(): def llm_api_keys() -> list[str]:
return SECRETS.load_or_fail('LLM_API_KEY') return SECRETS.load_or_fail('LLM_API_KEY').strip().split('\n')
def gitea_token(): def gitea_token() -> str:
return SECRETS.load_or_fail('GITEA_TOKEN') return SECRETS.load_or_fail('GITEA_TOKEN')

View File

@ -0,0 +1,54 @@
from pathlib import Path
from unittest.mock import patch
from aider_gitea import has_commits_on_branch
class TestHasCommitsOnBranch:
def setup_method(self):
self.cwd = Path('/tmp/test-repo')
self.base_branch = 'main'
self.current_branch = 'feature-branch'
@patch('aider_gitea.get_commit_messages')
def test_has_commits_true(self, mock_get_commit_messages):
# Setup mock to return some commit messages
mock_get_commit_messages.return_value = ['Commit 1', 'Commit 2']
# Test function returns True when there are commits
assert (
has_commits_on_branch(self.cwd, self.base_branch, self.current_branch)
is True
)
# Verify get_commit_messages was called with correct arguments
mock_get_commit_messages.assert_called_once_with(
self.cwd, self.base_branch, self.current_branch,
)
@patch('aider_gitea.get_commit_messages')
def test_has_commits_false(self, mock_get_commit_messages):
# Setup mock to return empty list
mock_get_commit_messages.return_value = []
# Test function returns False when there are no commits
assert (
has_commits_on_branch(self.cwd, self.base_branch, self.current_branch)
is False
)
# Verify get_commit_messages was called with correct arguments
mock_get_commit_messages.assert_called_once_with(
self.cwd, self.base_branch, self.current_branch,
)
@patch('aider_gitea.get_commit_messages')
def test_has_commits_exception(self, mock_get_commit_messages):
# Setup mock to raise an exception
mock_get_commit_messages.side_effect = Exception('Git command failed')
# Test function returns False when an exception occurs
assert (
has_commits_on_branch(self.cwd, self.base_branch, self.current_branch)
is False
)

View File

@ -19,12 +19,16 @@ class TestSolveIssueInRepository:
self.issue_description = 'This is a test issue' self.issue_description = 'This is a test issue'
self.issue_number = '123' self.issue_number = '123'
@patch('aider_gitea.secrets.llm_api_key', return_value='fake-api-key') @patch('aider_gitea.secrets.llm_api_keys', return_value='fake-api-key')
@patch('aider_gitea.run_cmd') @patch('aider_gitea.run_cmd')
@patch('aider_gitea.push_changes') @patch('aider_gitea.push_changes')
@patch('subprocess.run') @patch('subprocess.run')
def test_solve_issue_with_aider_changes( def test_solve_issue_with_aider_changes(
self, mock_subprocess_run, mock_push_changes, mock_run_cmd, mock_llm_api_key, self,
mock_subprocess_run,
mock_push_changes,
mock_run_cmd,
mock_llm_api_key,
): ):
# Setup mocks # Setup mocks
mock_run_cmd.return_value = True mock_run_cmd.return_value = True
@ -34,7 +38,8 @@ class TestSolveIssueInRepository:
mock_subprocess_run.side_effect = [ mock_subprocess_run.side_effect = [
MagicMock(stdout='abc123\n', returncode=0), # First git rev-parse MagicMock(stdout='abc123\n', returncode=0), # First git rev-parse
MagicMock( MagicMock(
stdout='file1.py\nfile2.py\n', returncode=0, stdout='file1.py\nfile2.py\n',
returncode=0,
), # git diff with changes ), # git diff with changes
] ]
@ -54,12 +59,16 @@ class TestSolveIssueInRepository:
assert mock_run_cmd.call_count >= 8 # Verify all expected commands were run assert mock_run_cmd.call_count >= 8 # Verify all expected commands were run
mock_push_changes.assert_called_once() mock_push_changes.assert_called_once()
@patch('aider_gitea.secrets.llm_api_key', return_value='fake-api-key') @patch('aider_gitea.secrets.llm_api_keys', return_value='fake-api-key')
@patch('aider_gitea.run_cmd') @patch('aider_gitea.run_cmd')
@patch('aider_gitea.push_changes') @patch('aider_gitea.push_changes')
@patch('subprocess.run') @patch('subprocess.run')
def test_solve_issue_without_aider_changes( def test_solve_issue_without_aider_changes(
self, mock_subprocess_run, mock_push_changes, mock_run_cmd, mock_llm_api_key, self,
mock_subprocess_run,
mock_push_changes,
mock_run_cmd,
mock_llm_api_key,
): ):
# Setup mocks # Setup mocks
mock_run_cmd.return_value = True mock_run_cmd.return_value = True