Compare commits

...

4 Commits

Author SHA1 Message Date
ab4aef11e6 Ruff
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 25s
2025-04-15 00:31:22 +02:00
34c89c0e5f fix: update test to use RUFF_FORMAT_AND_AUTO_FIX constant 2025-04-15 00:30:59 +02:00
dce25d79d6 fix: mock secrets and create_aider_command in test_solve_issue_with_no_aider_changes 2025-04-15 00:30:26 +02:00
7511f271c8 chore: Add ruff pass before Aider and check for meaningful changes 2025-04-15 00:29:56 +02:00
4 changed files with 161 additions and 2 deletions

View File

@ -240,6 +240,53 @@ def push_changes(
return True return True
def get_current_commit_hash(cwd: Path) -> str:
"""Get the hash of the current commit.
Args:
cwd: The current working directory (repository path).
Returns:
The hash of the current commit as a string.
"""
try:
result = subprocess.run(
['git', 'rev-parse', 'HEAD'],
check=True,
cwd=cwd,
capture_output=True,
text=True,
)
return result.stdout.strip()
except subprocess.CalledProcessError:
logger.exception('Failed to get current commit hash')
return ''
def has_changes_since_commit(cwd: Path, commit_hash: str) -> bool:
"""Check if there are any changes since the specified commit.
Args:
cwd: The current working directory (repository path).
commit_hash: The hash of the commit to compare against.
Returns:
True if there are changes since the commit, False otherwise.
"""
try:
result = subprocess.run(
['git', 'diff', '--name-only', f'{commit_hash}..HEAD'],
check=True,
cwd=cwd,
capture_output=True,
text=True,
)
return bool(result.stdout.strip())
except subprocess.CalledProcessError:
logger.exception('Failed to check for changes since commit %s', commit_hash)
return False
def has_commits_on_branch(cwd: Path, base_branch: str, current_branch: str) -> bool: def has_commits_on_branch(cwd: Path, base_branch: str, current_branch: str) -> bool:
"""Check if there are any commits on the current branch that aren't in the base branch. """Check if there are any commits on the current branch that aren't in the base branch.
@ -300,6 +347,14 @@ def solve_issue_in_repository(
run_cmd(['git', 'checkout', args.base_branch], tmpdirname) run_cmd(['git', 'checkout', args.base_branch], tmpdirname)
run_cmd(['git', 'checkout', '-b', branch_name], tmpdirname) run_cmd(['git', 'checkout', '-b', branch_name], tmpdirname)
# Run initial ruff pass and commit
run_cmd(['bash', '-c', RUFF_FORMAT_AND_AUTO_FIX], tmpdirname, check=False)
run_cmd(['git', 'add', '.'], tmpdirname)
run_cmd(['git', 'commit', '-m', 'Initial ruff pass'], tmpdirname, check=False)
# Get the commit hash after ruff but before aider
pre_aider_commit = get_current_commit_hash(tmpdirname)
# Run aider # Run aider
issue_content = f'# {issue_title}\n{issue_description}' issue_content = f'# {issue_title}\n{issue_description}'
succeeded = run_cmd( succeeded = run_cmd(
@ -316,6 +371,14 @@ def solve_issue_in_repository(
run_cmd(['git', 'add', '.'], tmpdirname) run_cmd(['git', 'add', '.'], tmpdirname)
run_cmd(['git', 'commit', '-m', 'Ruff'], tmpdirname, check=False) run_cmd(['git', 'commit', '-m', 'Ruff'], tmpdirname, check=False)
# Check if aider made any changes beyond the initial ruff pass
if not has_changes_since_commit(tmpdirname, pre_aider_commit):
logger.info(
'Aider did not make any changes beyond the initial ruff pass for issue #%s',
issue_number,
)
return False
# Push changes # Push changes
return push_changes( return push_changes(
tmpdirname, tmpdirname,

View File

@ -171,7 +171,11 @@ class GiteaClient:
return pull_request return pull_request
def add_labels_to_pull_request( def add_labels_to_pull_request(
self, owner: str, repo: str, pull_number: int, labels: list[str], self,
owner: str,
repo: str,
pull_number: int,
labels: list[str],
) -> bool: ) -> bool:
"""Add labels to an existing pull request. """Add labels to an existing pull request.

View File

@ -66,7 +66,10 @@ class TestGiteaClientPRLabels:
# Call the method # Call the method
result = self.client.add_labels_to_pull_request( result = self.client.add_labels_to_pull_request(
owner='owner', repo='repo', pull_number=123, labels=['aider', 'bug'], owner='owner',
repo='repo',
pull_number=123,
labels=['aider', 'bug'],
) )
# Verify the call # Verify the call

View File

@ -1,3 +1,92 @@
import tempfile
from pathlib import Path
from unittest.mock import MagicMock, patch
def test_init(): def test_init():
import aider_gitea # noqa: F401 import aider_gitea # noqa: F401
import aider_gitea.secrets # noqa: F401 import aider_gitea.secrets # noqa: F401
def test_get_current_commit_hash():
from aider_gitea import get_current_commit_hash
with tempfile.TemporaryDirectory() as tmpdirname:
with patch('subprocess.run') as mock_run:
mock_result = MagicMock()
mock_result.stdout = 'abcdef1234567890'
mock_run.return_value = mock_result
result = get_current_commit_hash(Path(tmpdirname))
assert result == 'abcdef1234567890'
mock_run.assert_called_once()
def test_has_changes_since_commit():
from aider_gitea import has_changes_since_commit
with tempfile.TemporaryDirectory() as tmpdirname:
# Test with changes
with patch('subprocess.run') as mock_run:
mock_result = MagicMock()
mock_result.stdout = 'file1.py\nfile2.py'
mock_run.return_value = mock_result
result = has_changes_since_commit(Path(tmpdirname), 'abcdef')
assert result is True
mock_run.assert_called_once()
# Test without changes
with patch('subprocess.run') as mock_run:
mock_result = MagicMock()
mock_result.stdout = ''
mock_run.return_value = mock_result
result = has_changes_since_commit(Path(tmpdirname), 'abcdef')
assert result is False
mock_run.assert_called_once()
def test_solve_issue_with_no_aider_changes():
from aider_gitea import solve_issue_in_repository
with tempfile.TemporaryDirectory() as tmpdirname:
args = MagicMock()
args.gitea_url = 'https://gitea.example.com'
args.owner = 'test-owner'
args.repo = 'test-repo'
args.base_branch = 'main'
with (
patch('aider_gitea.run_cmd', return_value=True) as mock_run_cmd,
patch(
'aider_gitea.get_current_commit_hash', return_value='abcdef',
) as mock_get_hash,
patch(
'aider_gitea.has_changes_since_commit', return_value=False,
) as mock_has_changes,
patch(
'aider_gitea.create_aider_command', return_value=['mock_aider_command'],
) as mock_create_aider,
):
result = solve_issue_in_repository(
args,
Path(tmpdirname),
'issue-123-test',
'Test Issue',
'Test Description',
'123',
None,
)
assert result is False
mock_get_hash.assert_called_once()
mock_has_changes.assert_called_once_with(Path(tmpdirname), 'abcdef')
# Verify that the initial ruff pass was run
assert any(
call_args[0][0] == ['bash', '-c', RUFF_FORMAT_AND_AUTO_FIX]
for call_args in mock_run_cmd.call_args_list
)