#!/usr/bin/env python3 """ Commit using Gitea API directly (bypassing git.exe issues) This uses Gitea's REST API to create commits directly. """ import os import sys import base64 import requests from datetime import datetime # Gitea configuration GITEA_URL = "https://git.mtrcompute.com" USERNAME = "jleu3482" PASSWORD = "jleu1212" REPO_OWNER = "jleu3482" REPO_NAME = "railseek6" def get_auth_token(): """Get authentication token from Gitea""" auth_url = f"{GITEA_URL}/api/v1/users/{USERNAME}/tokens" auth_data = { "name": f"auto-commit-{datetime.now().strftime('%Y%m%d-%H%M%S')}", "scopes": ["repo", "write:repo"] } try: response = requests.post( auth_url, json=auth_data, auth=(USERNAME, PASSWORD) ) if response.status_code == 201: token = response.json()["sha1"] print(f"✓ Authentication token created") return token else: print(f"❌ Failed to create token: {response.status_code} - {response.text}") return None except Exception as e: print(f"❌ Error creating token: {e}") return None def get_file_content(filepath): """Read file content and encode as base64""" try: with open(filepath, 'rb') as f: content = f.read() return base64.b64encode(content).decode('utf-8') except Exception as e: print(f"❌ Error reading file {filepath}: {e}") return None def create_commit_via_api(token, description): """Create a commit using Gitea API""" # First, get the current tree repo_url = f"{GITEA_URL}/api/v1/repos/{REPO_OWNER}/{REPO_NAME}" # Get list of files to add files_to_add = [] for root, dirs, files in os.walk("."): # Skip .git directory and other hidden directories if '.git' in root: continue for file in files: filepath = os.path.join(root, file) rel_path = os.path.relpath(filepath, ".") # Skip large files and binary files if os.path.getsize(filepath) > 10 * 1024 * 1024: # 10MB limit print(f"⚠ Skipping large file: {rel_path}") continue # Check if it's a text file try: with open(filepath, 'rb') as f: content = f.read(1024) # Simple binary detection if b'\x00' in content: print(f"⚠ Skipping binary file: {rel_path}") continue except: continue content_b64 = get_file_content(filepath) if content_b64: files_to_add.append({ "path": rel_path.replace("\\", "/"), "content": content_b64 }) print(f"Found {len(files_to_add)} files to commit") # Create commit via API commit_url = f"{repo_url}/contents" headers = { "Authorization": f"token {token}", "Content-Type": "application/json" } timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") commit_message = f"{description}\n\nAuto-commit at: {timestamp}" successful_commits = 0 for file_info in files_to_add[:10]: # Limit to 10 files for testing file_data = { "message": commit_message, "content": file_info["content"], "branch": "main" } try: response = requests.put( f"{commit_url}/{file_info['path']}", json=file_data, headers=headers ) if response.status_code in [201, 200]: successful_commits += 1 print(f"✓ Committed: {file_info['path']}") else: print(f"❌ Failed to commit {file_info['path']}: {response.status_code}") except Exception as e: print(f"❌ Error committing {file_info['path']}: {e}") return successful_commits def main(): """Main function""" if len(sys.argv) < 2: print("Usage: python gitea_api_commit.py \"Description of changes\"") print("Example: python gitea_api_commit.py \"Added document download endpoint\"") sys.exit(1) description = sys.argv[1] print("=" * 60) print("GITEA API AUTO-COMMIT") print("=" * 60) print(f"Description: {description}") print(f"Repository: {GITEA_URL}/{REPO_OWNER}/{REPO_NAME}") print() # Get authentication token print("Authenticating with Gitea...") token = get_auth_token() if not token: print("❌ Authentication failed") sys.exit(1) # Create commit via API print("\nCreating commit via API...") successful = create_commit_via_api(token, description) print() print("=" * 60) print("SUMMARY") print("=" * 60) print(f"✓ Repository: {GITEA_URL}/{REPO_OWNER}/{REPO_NAME}") print(f"✓ Commit: {description}") print(f"✓ Files committed: {successful}") print(f"✓ Timestamp: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print() print("View repository at: https://git.mtrcompute.com/jleu3482/railseek6") print("=" * 60) if __name__ == "__main__": main()