Deamon mode to continuously monitor a specific repository for new issues. #20
|
@ -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
33
test/test_daemon_mode.py
Normal 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()
|
Loading…
Reference in New Issue
Block a user