From 49fca2b3b90c72c1df42b7107460f2580333bcda Mon Sep 17 00:00:00 2001 From: Matt Troutman Date: Sat, 5 Apr 2025 17:40:26 -0500 Subject: [PATCH] no message --- .gitignore | 36 ++++++ README.md | 97 ++++++++++++++ add-font-submodule.py | 269 +++++++++++++++++++++++++++++++++++++++ add-font.py | 150 ---------------------- font-buffalo.zip | Bin 32402 -> 0 bytes font-buffalo/Buffalo.otf | Bin 0 -> 50064 bytes remove-font.py | 173 +++++++++++++++++++++++++ requirements.txt | 2 + 8 files changed, 577 insertions(+), 150 deletions(-) create mode 100644 README.md create mode 100755 add-font-submodule.py delete mode 100644 add-font.py delete mode 100644 font-buffalo.zip create mode 100644 font-buffalo/Buffalo.otf create mode 100755 remove-font.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore index 485dee6..9bfbf58 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,37 @@ .idea + +# Environment variables +.env + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# macOS +.DS_Store +.AppleDouble +.LSOverride +._* + +# Temporary files +*.tmp +*.temp +.venv diff --git a/README.md b/README.md new file mode 100644 index 0000000..5239d89 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# Homebrew Fonts Tap + +This repository contains a collection of custom fonts for use with Homebrew. + +## Installation + +```bash +brew tap trtmn-fonts/fonts +brew install font- +``` + +## Available Fonts + +This tap provides a variety of custom fonts. To see all available fonts, run: + +```bash +brew search trtmn-fonts/fonts/font- +``` + +## Adding New Fonts + +To add a new font to this tap, follow these steps: + +1. **Create a Gitea API Token**: + - Go to your Gitea profile settings + - Navigate to "Applications" > "Generate New Token" + - Name the token (e.g., "Homebrew Fonts") + - Select the necessary permissions (at minimum: `repo`) + - Generate and copy the token + +2. **Set Up Environment Variables**: + - Create a `.env` file in the root of this repository with the following content: + ``` + GITEA_URL=http://clancy.genet-godzilla.ts.net:3002 + GITEA_USERNAME=trtmn-fonts + GITEA_API_TOKEN=your_api_token_here + ``` + - Replace `your_api_token_here` with your actual Gitea API token + - **Important**: Do not commit the `.env` file to version control if it contains sensitive information + +3. **Install Required Python Packages**: + ```bash + pip install -r requirements.txt + ``` + +4. **Run the Add Font Script**: + ```bash + python3 add-font-submodule.py + ``` + - Follow the prompts to enter the font name and location of the font files + - The script will: + - Create a new repository on Gitea for the font + - Add the font as a submodule to this repository + - Create a Homebrew formula for the font + - Update the font index + +5. **Push Changes to Gitea**: + ```bash + git push + ``` + +## Removing Fonts + +To remove a font from this tap, follow these steps: + +1. **Ensure Environment Variables are Set**: + - Make sure your `.env` file is properly configured (see "Adding New Fonts" section) + +2. **Run the Remove Font Script**: + ```bash + python3 remove-font.py + ``` + - Replace `` with the name of the font to remove + - The script will: + - Ask for confirmation before proceeding + - Remove the font submodule + - Delete the font repository from Gitea + - Update the font index + +3. **Push Changes to Gitea**: + ```bash + git push + ``` + +## Repository Structure + +- `Formula/`: Contains Homebrew formulas for each font +- `fonts/`: Contains submodules for each font repository +- `fonts/index.json`: Index of all available fonts +- `add-font-submodule.py`: Script for adding new fonts +- `remove-font.py`: Script for removing fonts +- `.env`: Configuration file for Gitea credentials (not tracked by git) +- `requirements.txt`: Python dependencies + +## License + +This project is licensed under the MIT License - see the LICENSE file for details. \ No newline at end of file diff --git a/add-font-submodule.py b/add-font-submodule.py new file mode 100755 index 0000000..120ef87 --- /dev/null +++ b/add-font-submodule.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python3 +import os +import sys +import shutil +import subprocess +import hashlib +import zipfile +import tempfile +import json +import requests +from pathlib import Path +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + +def create_gitea_repo(gitea_url, gitea_username, gitea_token, repo_name, description): + """Create a new repository on Gitea using the API.""" + api_url = f"{gitea_url}/api/v1/user/repos" + headers = { + "Authorization": f"token {gitea_token}", + "Content-Type": "application/json" + } + data = { + "name": repo_name, + "description": description, + "private": False, + "auto_init": False + } + + print(f"Creating repository {repo_name} on Gitea...") + response = requests.post(api_url, headers=headers, json=data) + + if response.status_code == 201: + print(f"Repository {repo_name} created successfully.") + return response.json() + else: + print(f"Error creating repository: {response.status_code} - {response.text}") + return None + +def create_zip(font_files, zip_path): + """Create a zip file with the font files.""" + print(f"Creating zip file at {zip_path} with the following font files:") + with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: + for font_file in font_files: + print(f" - {font_file}") + # Add each font file to the zip with its original name (no path) + arcname = os.path.basename(font_file) + zipf.write(font_file, arcname=arcname) + print(f"Zip file created at {zip_path}") + +def generate_sha256(zip_path): + """Generate SHA256 hash for the zip file.""" + sha256_hash = hashlib.sha256() + with open(zip_path, "rb") as f: + # Read in 4k chunks to hash + for byte_block in iter(lambda: f.read(4096), b""): + sha256_hash.update(byte_block) + return sha256_hash.hexdigest() + +def create_font_repo(font_name, font_files, gitea_url, gitea_username, gitea_token): + """Create a new repository for the font and set it up with the necessary files.""" + # Create a temporary directory for the font repository + with tempfile.TemporaryDirectory() as temp_dir: + # Create the zip file + zip_filename = f"{font_name}.zip" + zip_path = os.path.join(temp_dir, zip_filename) + create_zip(font_files, zip_path) + + # Generate SHA256 hash for the zip file + sha256_hash = generate_sha256(zip_path) + print(f"SHA256 hash generated: {sha256_hash}") + + # Create the repository on Gitea + repo_name = f"font-{font_name}" + description = f"Font files for {font_name}" + repo_data = create_gitea_repo(gitea_url, gitea_username, gitea_token, repo_name, description) + + if not repo_data: + print("Failed to create repository on Gitea.") + return None, None, None + + # Clone the repository + repo_url = repo_data["clone_url"] + repo_path = os.path.join(temp_dir, repo_name) + subprocess.run(["git", "clone", repo_url, repo_path], check=True) + + # Copy the zip file to the repository + shutil.copy(zip_path, os.path.join(repo_path, zip_filename)) + + # Create a README.md file + with open(os.path.join(repo_path, "README.md"), "w") as f: + f.write(f"# {font_name} Font\n\n") + f.write(f"This repository contains the font files for {font_name}.\n\n") + f.write(f"SHA256: {sha256_hash}\n") + + # Commit and push the changes + subprocess.run(["git", "-C", repo_path, "add", "."], check=True) + subprocess.run(["git", "-C", repo_path, "commit", "-m", f"Add {font_name} font files"], check=True) + subprocess.run(["git", "-C", repo_path, "push"], check=True) + + # Create a local copy of the zip file for the formula + local_zip_path = os.path.join(os.getcwd(), zip_filename) + shutil.copy(zip_path, local_zip_path) + + return repo_path, sha256_hash, zip_filename + +def create_formula(font_name, sha256_hash, gitea_url, gitea_username, zip_filename): + """Create the Homebrew formula for the font.""" + # Get the font filename without extension (assuming it's a valid font file in the zip) + font_file = os.path.basename(font_files[0]) # Assumes the first font file is the primary font file + + # Convert font_name to CamelCase for the class name + class_name = ''.join(word.capitalize() for word in font_name.split('-')) + + # Create the formula content + formula_content = f"""class {class_name} < Formula + desc "A custom font" + homepage "{gitea_url}/{gitea_username}/font-{font_name}" + url "{gitea_url}/{gitea_username}/font-{font_name}/raw/branch/master/{zip_filename}" + sha256 "{sha256_hash}" + version "1.0.0" + + def install + (share/"fonts").install "{font_file}" + end + + test do + # Test installation by checking that the font exists + system "fc-list | grep '{font_file.split('.')[0]}'" + end +end +""" + + # Create the formula directory if it doesn't exist + formula_dir = os.path.join(os.getcwd(), "Formula") + os.makedirs(formula_dir, exist_ok=True) + + # Write the formula to a file + formula_path = os.path.join(formula_dir, f"font-{font_name}.rb") + with open(formula_path, "w") as f: + f.write(formula_content) + + print(f"Formula created at {formula_path}") + return formula_path + +def add_submodule(font_name, gitea_url, gitea_username): + """Add the font repository as a submodule.""" + # Create the fonts directory if it doesn't exist + fonts_dir = os.path.join(os.getcwd(), "fonts") + os.makedirs(fonts_dir, exist_ok=True) + + # Add the submodule + submodule_path = os.path.join(fonts_dir, font_name) + repo_url = f"{gitea_url}/{gitea_username}/font-{font_name}.git" + + # Check if the submodule already exists + if os.path.exists(submodule_path): + print(f"Submodule {submodule_path} already exists. Removing it first.") + subprocess.run(["git", "submodule", "deinit", "-f", submodule_path], check=True) + subprocess.run(["git", "rm", "-f", submodule_path], check=True) + subprocess.run(["rm", "-rf", f".git/modules/{submodule_path}"], check=True) + + # Add the submodule + print(f"Adding submodule {submodule_path}...") + subprocess.run(["git", "submodule", "add", repo_url, submodule_path], check=True) + + return submodule_path + +def update_submodule_index(font_name, submodule_path): + """Update the submodule index file.""" + # Create the index file if it doesn't exist + index_path = os.path.join(os.getcwd(), "fonts", "index.json") + if not os.path.exists(index_path): + with open(index_path, "w") as f: + json.dump({"fonts": []}, f, indent=2) + + # Read the index file + with open(index_path, "r") as f: + index = json.load(f) + + # Add the font to the index + font_info = { + "name": font_name, + "path": submodule_path, + "formula": f"font-{font_name}" + } + + # Check if the font is already in the index + for i, font in enumerate(index.get("fonts", [])): + if font["name"] == font_name: + index["fonts"][i] = font_info + break + else: + # Add the font to the index + if "fonts" not in index: + index["fonts"] = [] + index["fonts"].append(font_info) + + # Write the updated index back to the file + with open(index_path, "w") as f: + json.dump(index, f, indent=2) + + print(f"Index updated at {index_path}") + +def main(): + # Get the Gitea URL from environment variable or prompt + gitea_url = os.getenv("GITEA_URL") + if not gitea_url: + gitea_url = input("Enter your Gitea URL (e.g., http://clancy.genet-godzilla.ts.net:3002): ") + + # Get the Gitea username from environment variable or prompt + gitea_username = os.getenv("GITEA_USERNAME") + if not gitea_username: + gitea_username = input("Enter your Gitea username: ") + + # Get the Gitea token from environment variable or prompt + gitea_token = os.getenv("GITEA_API_TOKEN") + if not gitea_token: + gitea_token = input("Enter your Gitea API token: ") + + # Get the font name + font_name = input("Enter the name of the font (e.g., FiraCode): ").lower() + + # Get the font files + font_folder = input("Enter the location of the font folder: ").strip("'\"") # Strip quotes from the input + print(f"Looking for font files in: {font_folder}") + + # Check if the folder exists + if not os.path.exists(font_folder): + print(f"Error: The folder '{font_folder}' does not exist.") + return + + # Find all the font files in the provided folder + font_files = [os.path.join(font_folder, f) for f in os.listdir(font_folder) if f.endswith(('ttf', 'otf'))] + + if not font_files: + print("No font files found in the provided folder.") + return + + print(f"Found {len(font_files)} font files:") + for font_file in font_files: + print(f" - {os.path.basename(font_file)}") + + # Create the font repository + font_repo_path, sha256_hash, zip_filename = create_font_repo(font_name, font_files, gitea_url, gitea_username, gitea_token) + + if not font_repo_path: + print("Failed to create font repository. Exiting.") + return + + # Create the formula + formula_path = create_formula(font_name, sha256_hash, gitea_url, gitea_username, zip_filename) + + # Add the submodule + submodule_path = add_submodule(font_name, gitea_url, gitea_username) + + # Update the submodule index + update_submodule_index(font_name, submodule_path) + + # Stage and commit the changes + subprocess.run(["git", "add", formula_path, "fonts/index.json", submodule_path], check=True) + subprocess.run(["git", "commit", "-m", f"Add {font_name} font as submodule"], check=True) + + print(f"Font {font_name} has been added successfully as a submodule.") + print("Remember to push your changes to Gitea manually.") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/add-font.py b/add-font.py deleted file mode 100644 index 9b7d164..0000000 --- a/add-font.py +++ /dev/null @@ -1,150 +0,0 @@ -import os -import hashlib -import zipfile -from pathlib import Path -import shutil -import subprocess - - -def get_font_files(font_folder): - """Find all .ttf and .otf files in the given folder.""" - font_files = [] - for root, _, files in os.walk(font_folder): - for file in files: - if file.lower().endswith(('.ttf', '.otf')): - font_files.append(os.path.join(root, file)) - return font_files - - -def generate_sha256(file_path): - """Generate the sha256 hash of the given file.""" - sha256_hash = hashlib.sha256() - with open(file_path, "rb") as f: - for byte_block in iter(lambda: f.read(4096), b""): - sha256_hash.update(byte_block) - return sha256_hash.hexdigest() - - -def create_zip(font_files, font_folder, zip_path): - """Create a zip file from the font files.""" - print(f"Creating zip file at {zip_path} with the following font files:") - for font_file in font_files: - print(f" - {font_file}") - - with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: - for file in font_files: - # Add the font file with its relative path - arcname = os.path.relpath(file, font_folder) - zipf.write(file, arcname) - print(f"Added {file} to the zip as {arcname}") - - -def create_ruby_file(font_name, zip_path, sha256_hash): - """Generate a Ruby formula file for the font.""" - formula_content = f"""class {font_name} < Formula - desc "Font for {font_name}" - homepage "https://github.com/{font_name}" - url "{zip_path}" - sha256 "{sha256_hash}" - version "latest" - - def install - (share/"fonts").install Dir["*.ttf", "*.otf"] - end - - test do - assert_predicate share/"fonts/{font_name}-Regular.ttf", :exist? - end -end -""" - formula_path = f"./{font_name}/{font_name.lower()}.rb" - with open(formula_path, 'w') as formula_file: - formula_file.write(formula_content) - print(f"Ruby file created at {formula_path}") - - return formula_path - - -def move_formula_to_formula_folder(formula_path): - """Move the formula file to the Formula directory in the tap.""" - formula_folder = "./Formula" - if not os.path.exists(formula_folder): - os.makedirs(formula_folder) - - shutil.move(formula_path, os.path.join(formula_folder, os.path.basename(formula_path))) - print(f"Moved {formula_path} to {formula_folder}/") - - -def font_exists(font_name): - """Check if the formula already exists in the Formula folder.""" - formula_path = f"./Formula/font-{font_name.lower()}.rb" - return os.path.exists(formula_path) - - -def stage_and_commit_changes(font_name, font_folder_path, formula_path): - """Stage only the new font zip file and the formula file, then commit.""" - try: - # Stage the new font zip file - zip_file_path = font_folder_path / f"{font_name.lower()}.zip" - subprocess.run(["git", "add", str(zip_file_path)], check=True) - - # Stage the formula file from the Formula folder - formula_in_formula_folder = f"./Formula/{font_name.lower()}.rb" - subprocess.run(["git", "add", formula_in_formula_folder], check=True) - - # Commit with a default message - commit_message = f"Add {font_name} font" - subprocess.run(["git", "commit", "-m", commit_message], check=True) - print(f"Changes staged and committed with message: '{commit_message}'") - except subprocess.CalledProcessError as e: - print(f"Error while staging or committing: {e}") - -def main(): - font_folder = input("Enter the location of the font folder: ").strip() - - if not os.path.isdir(font_folder): - print("The folder does not exist. Please provide a valid path.") - return - - font_files = get_font_files(font_folder) - if not font_files: - print("No .ttf or .otf font files found in the specified folder.") - return - - font_name = input("Enter the name of the font (e.g., FiraCode): ").strip() - - # Add the "font-" prefix to the font name - font_package_name = f"font-{font_name.lower()}" - - # Check if the font already exists in the Formula folder - if font_exists(font_name): - update = input( - f"The font '{font_package_name}' already exists. Do you want to update it? (y/n): ").strip().lower() - if update != 'y': - print("Font update canceled.") - return - - # Create the folder for the font - font_folder_path = Path(f"./{font_package_name}") - font_folder_path.mkdir(exist_ok=True) - - zip_path = f"./{font_package_name}/{font_package_name}.zip" - create_zip(font_files, font_folder, zip_path) - - sha256_hash = generate_sha256(zip_path) - print(f"SHA256 hash generated: {sha256_hash}") - - formula_path = create_ruby_file(font_package_name, zip_path, sha256_hash) - - # Move the formula to the Formula directory - move_formula_to_formula_folder(formula_path) - - # Stage and commit the changes (only the font and its formula) - stage_and_commit_changes(font_package_name, font_folder_path, formula_path) - - print(f"Font {font_package_name} has been added successfully.") - print("Remember to push your changes to GitHub manually.") - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/font-buffalo.zip b/font-buffalo.zip deleted file mode 100644 index af25da293af37dd472d183e553da993eb45b159f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32402 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ʏy@o$eWLa{TlpA@~Kh+Qb} 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 nJxIvhTj=LWSWhwqdT<)= 2: + # Get the last part which should be username/repo + last_part = parts[-1] + if '/' in last_part: + return last_part.split('/')[-1] + + print(f"Warning: Could not extract repository name from URL: {url}") + return None + except subprocess.CalledProcessError: + return None + +def delete_gitea_repo(gitea_url, gitea_username, gitea_token, repo_name): + """Delete a repository from Gitea using the API.""" + api_url = f"{gitea_url}/api/v1/repos/{gitea_username}/{repo_name}" + headers = { + "Authorization": f"token {gitea_token}", + "Content-Type": "application/json" + } + + print(f"Deleting repository {repo_name} from Gitea...") + response = requests.delete(api_url, headers=headers) + + if response.status_code == 204: + print(f"Repository {repo_name} deleted successfully.") + return True + else: + print(f"Error deleting repository: {response.status_code} - {response.text}") + return False + +def remove_font(font_name): + """Remove a font from the Homebrew tap and delete its repository from Gitea.""" + # Get Gitea credentials + gitea_url, gitea_username, gitea_token = get_gitea_credentials() + + # Check if the font exists + available_fonts = get_available_fonts() + if font_name not in available_fonts: + print(f"Error: Font '{font_name}' not found in the available fonts.") + print(f"Available fonts: {', '.join(available_fonts)}") + sys.exit(1) + + # Confirm deletion + print(f"\nWARNING: You are about to remove the font '{font_name}' and delete its repository from Gitea.") + print("This action cannot be undone.") + confirmation = input("Are you sure you want to proceed? (yes/no): ").lower() + + if confirmation != "yes": + print("Operation cancelled.") + sys.exit(0) + + # Get the repository name from the submodule + repo_name = get_repo_name_from_submodule(font_name) + if not repo_name: + print(f"Warning: Could not determine the repository name for font '{font_name}'.") + print("The repository will not be deleted from Gitea.") + repo_name = None + + # Remove the submodule + submodule_path = f"fonts/{font_name}" + if os.path.exists(submodule_path): + print(f"Removing submodule {submodule_path}...") + subprocess.run(["git", "submodule", "deinit", "-f", submodule_path], check=True) + subprocess.run(["git", "rm", "-f", submodule_path], check=True) + subprocess.run(["rm", "-rf", f".git/modules/{submodule_path}"], check=True) + + # Remove the formula + formula_path = f"Formula/font-{font_name}.rb" + if os.path.exists(formula_path): + print(f"Removing formula {formula_path}...") + subprocess.run(["git", "rm", "-f", formula_path], check=True) + + # Update the index.json file + index_path = Path("fonts/index.json") + with open(index_path, "r") as f: + index = json.load(f) + + # Remove the font from the index + index["fonts"] = [font for font in index.get("fonts", []) if font["name"] != font_name] + + # Write the updated index back to the file + with open(index_path, "w") as f: + json.dump(index, f, indent=2) + + # Delete the repository from Gitea if we found the name + if repo_name: + delete_gitea_repo(gitea_url, gitea_username, gitea_token, repo_name) + else: + print("Skipping repository deletion as the repository name could not be determined.") + + # Commit the changes + subprocess.run(["git", "add", "fonts/index.json"], check=True) + subprocess.run(["git", "commit", "-m", f"Remove {font_name} font"], check=True) + + print(f"\nFont '{font_name}' has been removed successfully.") + print("Remember to push your changes to Gitea manually.") + +def main(): + if len(sys.argv) != 2: + print("Usage: python3 remove-font.py ") + print("\nAvailable fonts:") + available_fonts = get_available_fonts() + for font in available_fonts: + print(f" - {font}") + sys.exit(1) + + font_name = sys.argv[1] + remove_font(font_name) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..76bcb73 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +requests>=2.25.1 +python-dotenv>=0.19.0 \ No newline at end of file