project1 / src /github_utils.py
23f2002267's picture
4th ai correction
069a92b
Raw
History Blame Contribute Delete
3.89 kB
import os
from github import Github
from github import GithubException
import httpx
# from dotenv import load_dotenv
from datetime import datetime
# load_dotenv()
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
USERNAME = os.getenv("GITHUB_USERNAME")
g = Github(GITHUB_TOKEN)
def create_repo(repo_name: str, description: str = ""):
"""
Create a public repository with the given name.
"""
user = g.get_user()
# if repo exists, return it
try:
repo = user.get_repo(repo_name)
print("Repo already exists:", repo.full_name)
return repo
except GithubException:
pass
repo = user.create_repo(
name=repo_name,
description=description,
private=False,
auto_init=False
)
print("Created repo:", repo.full_name)
return repo
def create_or_update_file(repo, path: str, content: str, message: str):
"""
Create a file or update if it already exists.
"""
try:
# Try to get file to see if exists
current = repo.get_contents(path)
sha = current.sha
repo.update_file(path, message, content, sha)
print(f"Updated {path} in {repo.full_name}")
except GithubException as e:
# If 404 (not found) then create
if e.status == 404:
repo.create_file(path, message, content)
print(f"Created {path} in {repo.full_name}")
else:
# some other error
raise
def create_or_update_binary_file(repo, path: str, binary_content, commit_message: str):
"""
Create or update a binary file in the repository.
This function handles binary data like images directly without encoding/decoding.
"""
try:
# Try to get file to see if exists
try:
current = repo.get_contents(path)
# Update existing file
repo.update_file(
path=path,
message=commit_message,
content=binary_content,
sha=current.sha
)
print(f"Updated binary file {path} in {repo.full_name}")
except GithubException as e:
# If file doesn't exist, create it
if e.status == 404:
repo.create_file(
path=path,
message=commit_message,
content=binary_content
)
print(f"Created binary file {path} in {repo.full_name}")
else:
# some other error
raise
return True
except Exception as e:
print(f"Error creating/updating binary file {path}: {e}")
return False
def enable_pages(repo_name: str, branch: str = "main"):
"""
Enable GitHub Pages via REST API; expects GITHUB_USERNAME in env.
"""
url = f"https://api.github.com/repos/{USERNAME}/{repo_name}/pages"
headers = {"Authorization": f"token {GITHUB_TOKEN}", "Accept": "application/vnd.github.v3+json"}
data = {"source": {"branch": branch, "path": "/"}}
try:
r = httpx.post(url, headers=headers, json=data, timeout=30.0)
if r.status_code in (201, 204):
print("✅ Pages enabled for", repo_name)
return True
else:
# GitHub sometimes returns 202 while building; treat 202 as success to allow polling
print("Pages API returned:", r.status_code, r.text)
return False
except Exception as e:
print("Failed to call Pages API:", e)
return False
def generate_mit_license(owner_name=None):
year = datetime.utcnow().year
owner = owner_name or USERNAME or "Owner"
return f"""MIT License
Copyright (c) {year} {owner}
Permission is hereby granted, free of charge, to any person obtaining a copy...
[Full MIT license text omitted here for brevity — replace in production with full license text]
"""