#!/usr/bin/env python3 import os import sys import click import requests import subprocess from dotenv import load_dotenv # Load environment variables load_dotenv() # Get Gitea configuration from environment GITEA_URL = os.getenv('GITEA_URL') GITEA_TOKEN = os.getenv('GITEA_TOKEN') class GiteaAPI: def __init__(self, base_url, token): self.base_url = base_url.rstrip('/') self.token = token self.session = requests.Session() self.session.headers.update({ 'Authorization': f'token {token}', 'Content-Type': 'application/json', }) def create_repository(self, name, description="", private=False): """Create a new repository on Gitea.""" endpoint = f"{self.base_url}/api/v1/user/repos" data = { "name": name, "description": description, "private": private, "auto_init": True } response = self.session.post(endpoint, json=data) if response.status_code == 201: return response.json() else: response.raise_for_status() def validate_environment(): """Validate that required environment variables are set.""" if not GITEA_URL: click.echo("Error: GITEA_URL environment variable is not set") sys.exit(1) if not GITEA_TOKEN: click.echo("Error: GITEA_TOKEN environment variable is not set") sys.exit(1) def is_git_repository(): """Check if current directory is a git repository.""" try: subprocess.run(['git', 'rev-parse', '--git-dir'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True) return True except subprocess.CalledProcessError: return False def set_git_remote(repo_url): """Set or update the git remote 'origin' for the current repository.""" try: # Check if remote exists result = subprocess.run(['git', 'remote'], stdout=subprocess.PIPE, text=True, check=True) if 'origin' in result.stdout.split(): # Remove existing origin subprocess.run(['git', 'remote', 'remove', 'origin'], check=True) # Add new origin subprocess.run(['git', 'remote', 'add', 'origin', repo_url], check=True) click.echo(f"Successfully set remote 'origin' to: {repo_url}") return True except subprocess.CalledProcessError as e: click.echo(f"Error setting git remote: {str(e)}") return False @click.group() def cli(): """Gitea CLI - Command line interface for Gitea""" pass @cli.command() @click.option('--name', required=True, help='Name of the repository') @click.option('--description', default="", help='Repository description') @click.option('--private', is_flag=True, default=False, help='Make repository private') @click.option('--set-remote', is_flag=True, default=False, help='Set the remote origin for the current git repository') def create_repo(name, description, private, set_remote): """Create a new repository on Gitea.""" validate_environment() try: gitea = GiteaAPI(GITEA_URL, GITEA_TOKEN) repo = gitea.create_repository(name, description, private) click.echo(f"Successfully created repository: {repo['html_url']}") if set_remote: if not is_git_repository(): click.echo("Error: Current directory is not a git repository") sys.exit(1) clone_url = repo['clone_url'] # Replace HTTPS URL with token-based URL for authentication if clone_url.startswith('https://'): parsed_url = clone_url.split('://') clone_url = f"{parsed_url[0]}://oauth2:{GITEA_TOKEN}@{parsed_url[1]}" set_git_remote(clone_url) except requests.exceptions.RequestException as e: click.echo(f"Error creating repository: {str(e)}") sys.exit(1) if __name__ == '__main__': cli()