diff --git a/aider_gitea/__main__.py b/aider_gitea/__main__.py index 44a357e..828428e 100644 --- a/aider_gitea/__main__.py +++ b/aider_gitea/__main__.py @@ -126,6 +126,7 @@ def parse_args(): parser.add_argument("--owner", required=True, help="Owner of the repository") parser.add_argument("--repo", required=True, help="Repository name") parser.add_argument("--base-branch", default="main", help="Base branch to use for new branches (default: main)") + parser.add_argument("--daemon", action="store_true", help="Run in daemon mode, continuously checking for new issues.") return parser.parse_args() def push_changes(cwd: Path, branch_name: str, issue_number: str, issue_title: str, issue_description: str, base_branch: str) -> None: @@ -175,23 +176,30 @@ def main(): logger.info("No issues found.") return - for issue in issues: - issue_number = issue.get("number") - issue_description = issue.get("body", "") - title = issue.get("title", f"Issue {issue_number}") - issue_text = f"{title}\n{issue_description}" - if seen_issues_db.has_seen(issue_text): - logger.info(f"Skipping already processed issue #{issue_number}: {title}") - continue + while True: + for issue in issues: + issue_number = issue.get("number") + issue_description = issue.get("body", "") + title = issue.get("title", f"Issue {issue_number}") + issue_text = f"{title}\n{issue_description}" + if seen_issues_db.has_seen(issue_text): + logger.info(f"Skipping already processed issue #{issue_number}: {title}") + continue - branch_name = generate_branch_name(issue_number, title) - seen_issues_db.mark_as_seen(issue_text) - try: - with tempfile.TemporaryDirectory() as tmpdirname: - process_issue(args, Path(tmpdirname), branch_name, title, issue_description, issue_number) - except Exception: - logger.exception('Error processing issue') - sys.exit(1) + branch_name = generate_branch_name(issue_number, title) + seen_issues_db.mark_as_seen(issue_text) + try: + with tempfile.TemporaryDirectory() as tmpdirname: + process_issue(args, Path(tmpdirname), branch_name, title, issue_description, issue_number) + except Exception: + logger.exception('Error processing issue') + sys.exit(1) + + if not args.daemon: + break + + logger.info("Daemon mode: sleeping for 60 seconds before checking for new issues.") + time.sleep(60) if __name__ == "__main__": main() diff --git a/test/test_daemon_mode.py b/test/test_daemon_mode.py new file mode 100644 index 0000000..0f2ab30 --- /dev/null +++ b/test/test_daemon_mode.py @@ -0,0 +1,33 @@ +import unittest +from unittest.mock import patch, MagicMock +import aider_gitea.__main__ as main_module + +class TestDaemonMode(unittest.TestCase): + + @patch('aider_gitea.__main__.GiteaClient') + @patch('aider_gitea.__main__.SeenIssuesDB') + @patch('aider_gitea.__main__.process_issue') + def test_daemon_mode(self, mock_process_issue, MockSeenIssuesDB, MockGiteaClient): + mock_args = MagicMock() + mock_args.daemon = True + mock_args.gitea_url = "http://example.com" + mock_args.owner = "owner" + mock_args.repo = "repo" + mock_args.base_branch = "main" + + mock_client = MockGiteaClient.return_value + mock_client.get_issues.return_value = [ + {"number": 1, "title": "Test Issue", "body": "This is a test issue", "labels": [{"name": "aider"}]} + ] + + mock_db = MockSeenIssuesDB.return_value + mock_db.has_seen.return_value = False + + with patch('time.sleep', return_value=None): + with self.assertRaises(SystemExit): + main_module.main() + + mock_process_issue.assert_called_once() + +if __name__ == '__main__': + unittest.main()