123 lines
4.1 KiB
Python
123 lines
4.1 KiB
Python
|
#!/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()
|