From 273144b509bf23a3144112ee14d1cf14a02ebc66 Mon Sep 17 00:00:00 2001 From: Jon Michael Aanes Date: Sun, 13 Apr 2025 23:19:36 +0200 Subject: [PATCH] Iterate all user repos --- aider_gitea/__init__.py | 13 +++++++--- aider_gitea/__main__.py | 51 ++++++++++++------------------------- aider_gitea/gitea_client.py | 16 ++++++++---- 3 files changed, 36 insertions(+), 44 deletions(-) diff --git a/aider_gitea/__init__.py b/aider_gitea/__init__.py index 0fb58f7..df5812c 100644 --- a/aider_gitea/__init__.py +++ b/aider_gitea/__init__.py @@ -10,7 +10,14 @@ When such an issue is found, it: 3. Runs tests and code quality checks. 4. Creates a pull request with the solution. -## Example Usage +## Usage + +An application token must be supplied for the `gitea_token` secret. This must +have the following permissions: + +- `read:issue`: To be able to read issues on the specified repository. +- `write:repository`: To be able to create pull requests. +- `read:user`: Needed to iterate all user's repositories. ### Command Line @@ -67,7 +74,6 @@ import sys import tempfile from pathlib import Path -from . import secrets from ._version import __version__ # noqa: F401 logger = logging.getLogger(__name__) @@ -153,12 +159,11 @@ def push_changes( branch_name: str, issue_number: str, issue_title: str, - issue_description: str, base_branch: str, ) -> bool: # Check if there are any commits on the branch before pushing if not has_commits_on_branch(cwd, base_branch, branch_name): - logger.info(f'No commits made on branch {branch_name}, skipping push') + logger.info('No commits made on branch %s, skipping push', branch_name) return False cmd = [ 'git', diff --git a/aider_gitea/__main__.py b/aider_gitea/__main__.py index a10730b..f9daebc 100644 --- a/aider_gitea/__main__.py +++ b/aider_gitea/__main__.py @@ -55,43 +55,24 @@ def main(): seen_issues_db = SeenIssuesDB() client = GiteaClient(args.gitea_url, secrets.gitea_token()) - if args.daemon: - logger.info( - f'Starting daemon mode, checking for new issues every {args.interval} seconds', - ) - try: - while True: - if args.repo: - logger.info('Checking for new issues...') - handle_issues(args, client, seen_issues_db) - logger.info(f'Sleeping for {args.interval} seconds...') - time.sleep(args.interval) - else: - repositories = client.get_user_repositories(args.owner) - for repo in repositories: - args_copy = argparse.Namespace() - args_copy.gitea_url = args.gitea_url - args_copy.owner = args.owner - args_copy.repo = repo - args_copy.base_branch = args.base_branch - handle_issues(args_copy, client, seen_issues_db) - time.sleep(args.interval) - except KeyboardInterrupt: - logger.exception('Daemon stopped by user') + if args.repo: + repositories = [args.repo] else: - # One-off run - if args.repo: - handle_issues(args, client, seen_issues_db) - else: - repositories = client.get_user_repositories(args.owner) - for repo in repositories: - args_copy = argparse.Namespace() - args_copy.gitea_url = args.gitea_url - args_copy.owner = args.owner - args_copy.repo = repo - args_copy.base_branch = args.base_branch - handle_issues(args_copy, client, seen_issues_db) + repositories = client.iter_user_repositories(args.owner, True) + while True: + logger.info('Checking for new issues...') + for repo in repositories: + args_copy = argparse.Namespace() + args_copy.gitea_url = args.gitea_url + args_copy.owner = args.owner + args_copy.repo = repo + args_copy.base_branch = args.base_branch + handle_issues(args_copy, client, seen_issues_db) + if not args.daemon: + break + logger.info('Sleeping for %d seconds...', args.interval) + time.sleep(args.interval) if __name__ == '__main__': main() diff --git a/aider_gitea/gitea_client.py b/aider_gitea/gitea_client.py index dd25cd4..d04e78a 100644 --- a/aider_gitea/gitea_client.py +++ b/aider_gitea/gitea_client.py @@ -1,5 +1,6 @@ import logging +from typing import Iterator import requests logger = logging.getLogger(__name__) @@ -81,7 +82,7 @@ class GiteaClient: response.raise_for_status() return True - def get_issues(self, owner: str, repo: str) -> list: + def get_issues(self, owner: str, repo: str) -> list[dict[str,str]]: """ Download issues from the specified repository and filter those with the 'aider' label. @@ -107,7 +108,7 @@ class GiteaClient: ] return issues - def get_user_repositories(self, owner: str) -> list: + def iter_user_repositories(self, owner: str, only_those_with_issues: bool = False) -> Iterator[str]: """ Get a list of repositories for a given user. @@ -117,8 +118,13 @@ class GiteaClient: Returns: list: A list of repository names. """ - url = f'{self.gitea_url}/users/{owner}/repos' + url = f'{self.gitea_url}/user/repos' response = self.session.get(url) response.raise_for_status() - repos = response.json() - return [repo['name'] for repo in repos] + + for repo in response.json(): + if only_those_with_issues and not repo['has_issues']: + continue + if repo['owner']['login'].lower() != owner.lower(): + continue + yield repo['name']