scripts/customize.py (77 lines of code) (raw):

#!/usr/bin/env python3 # This script is run by the user using `make customize` after the repository # is cloned. If you are reading this because `make customize` failed, # skip down to the section headed "INITIALIZATION STEPS". from sh import git import datetime import re import sys from urllib.parse import quote import subprocess import requests BASE_OWNER = "googlefonts" BASE_REPONAME = "googlefonts-project-template" DUMMY_URL = "https://yourname.github.io/your-font-repository-name" LATEST_OFL = "https://raw.githubusercontent.com/googlefonts/googlefonts-project-template/main/OFL.txt" def repo_url(owner, name): return f"https://github.com/{owner}/{name}" def web_url(owner, name): return f"https://{owner}.github.io/{name}" def raw_url(owner, name): return f"https://raw.githubusercontent.com/{owner}/{name}" def lose(msg, e=None): print(msg) print("You will need to do the initialization steps manually.") print("Read scripts/customize.py for more instructions how to do this.") if e: print( "\nHere's an additional error message which may help diagnose the problem." ) raise e sys.exit(1) try: my_repo_url = git.remote("get-url", "origin") except Exception as e: lose("Could not use git to find my own repository URL", e) m = re.match(r"(?:https://github.com/|git@github.com:)(.*)/(.*)/?", str(my_repo_url)) if not m: lose( f"My git repository URL ({my_repo_url}) didn't look what I expected - are you hosting this on github?" ) owner, reponame = m[1], m[2] if owner == BASE_OWNER and reponame == BASE_REPONAME: print("I am being run on the upstream repository; don't do that") sys.exit() # INITIALIZATION STEPS # First, the README file contains URLs to pages in the `gh-pages` branch of the # repo. When initially cloned, these URLs will point to the # googlefonts/Unified-Font-Repository itself. But downstream users want links # and badges about their own font, not ours! So any URLs need to be adjusted to # refer to the end user's repository. # We will also pin the dependencies so future builds are reproducible. readme = open("README.md").read() ghpages_url = web_url(owner, reponame) project_url = repo_url(owner, reponame) print("Fixing URLs:", web_url(BASE_OWNER, BASE_REPONAME), "->", ghpages_url) readme = readme.replace(web_url(BASE_OWNER, BASE_REPONAME), ghpages_url) # In the badges, the URLs to raw.githubusercontent.com are URL-encoded as they # are passed to shields.io. readme = readme.replace( quote(raw_url(BASE_OWNER, BASE_REPONAME), safe=""), quote(raw_url(owner, reponame), safe=""), ) print("Fixing URLs:", DUMMY_URL, "->", ghpages_url) readme = readme.replace(f"`{DUMMY_URL}`", ghpages_url) with open("README.md", "w") as fh: fh.write(readme) git.add("README.md") # Fix the OFL year = datetime.date.today().year title = reponame.title() copyright = f"Copyright {year} The {title} Project Authors ({project_url})\n" print("Fetching the latest OFL..") ofl = requests.get(LATEST_OFL).text.splitlines() print("Writing an OFL for you") print(copyright) with open("OFL.txt", "w") as fh: fh.write(copyright) fh.write("\n".join(ofl[1:])) git.add("OFL.txt") # Pin the dependencies print("Pinning dependencies") dependencies = subprocess.check_output(["pip", "freeze"]) with open("requirements.txt", "wb") as dependency_file: dependency_file.write(dependencies) git.add("requirements.txt") # Did anything change? result = git.status("--porcelain") if any(line.startswith("M ") for line in result.splitlines()): git.commit("-m", "Customize repository") print("Pushing changes to GitHub") git.push() else: print("Nothing changed, no need to push")