Deamon mode to continuously monitor a specific repository for new issues. #20

Closed
Jmaa wants to merge 4 commits from jmaa/issue-19-deamon-mode-to-continuously-monitor-a-specific-repository-for-new-issues into main
2 changed files with 57 additions and 16 deletions
Showing only changes of commit da494564ea - Show all commits

View File

@ -126,6 +126,7 @@ def parse_args():
parser.add_argument("--owner", required=True, help="Owner of the repository") parser.add_argument("--owner", required=True, help="Owner of the repository")
parser.add_argument("--repo", required=True, help="Repository name") 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("--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() 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: 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.") logger.info("No issues found.")
return return
for issue in issues: while True:
issue_number = issue.get("number") for issue in issues:
issue_description = issue.get("body", "") issue_number = issue.get("number")
title = issue.get("title", f"Issue {issue_number}") issue_description = issue.get("body", "")
issue_text = f"{title}\n{issue_description}" title = issue.get("title", f"Issue {issue_number}")
if seen_issues_db.has_seen(issue_text): issue_text = f"{title}\n{issue_description}"
logger.info(f"Skipping already processed issue #{issue_number}: {title}") if seen_issues_db.has_seen(issue_text):
continue logger.info(f"Skipping already processed issue #{issue_number}: {title}")
continue
branch_name = generate_branch_name(issue_number, title) branch_name = generate_branch_name(issue_number, title)
seen_issues_db.mark_as_seen(issue_text) seen_issues_db.mark_as_seen(issue_text)
try: try:
with tempfile.TemporaryDirectory() as tmpdirname: with tempfile.TemporaryDirectory() as tmpdirname:
process_issue(args, Path(tmpdirname), branch_name, title, issue_description, issue_number) process_issue(args, Path(tmpdirname), branch_name, title, issue_description, issue_number)
except Exception: except Exception:
logger.exception('Error processing issue') logger.exception('Error processing issue')
sys.exit(1) 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__": if __name__ == "__main__":
main() main()

33
test/test_daemon_mode.py Normal file
View File

@ -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()