HugoHost/update-site.py

129 lines
3.6 KiB
Python

import os
import time
import shutil
import logging
import subprocess
from datetime import datetime
# Define file paths
GIT_REPO_PATH = "/app/site"
PUB_PATH = "/app/public"
FOOTER_FILE_PATH = "/app/site/themes/kitsune-theme/layouts/partials/footer.html"
HASH_FILE_PATH = "/app/current-git-hash.txt"
def get_git_hash() -> str:
try:
result = subprocess.run(
["git", "rev-parse", "HEAD"],
cwd=GIT_REPO_PATH,
capture_output=True,
text=True,
)
except FileNotFoundError:
logging.warning(
f"No site found at {GIT_REPO_PATH}, assuming first-start. Will clone."
)
return None
r_hash = result.stdout.strip()
return r_hash if len(r_hash) > 3 else None
def update_repo():
# Make dir
logging.info(f"Making dirs {GIT_REPO_PATH}")
if get_git_hash() == None and os.path.exists(GIT_REPO_PATH):
logging.warning("Clearing file path")
subprocess.run(["rm", "-rv", f"{GIT_REPO_PATH}/*"])
os.makedirs(GIT_REPO_PATH, exist_ok=True)
# Clone
url = os.environ.get("GIT_REPO_URL", "").strip('"')
if get_git_hash() == None:
logging.info(f"Cloning '{url}'.")
subprocess.run(["git", "clone", url, GIT_REPO_PATH, "--recurse-submodules"])
else:
logging.info(f"Fetch '{url}'.")
subprocess.run(["git", "fetch"], cwd=GIT_REPO_PATH)
logging.info(f"Pull '{url}'.")
subprocess.run(["git", "fetch"], cwd=GIT_REPO_PATH)
logging.info(f"Update submodules '{url}'.")
subprocess.run(
["git", "submodule", "update", "--init", "--recursive"], cwd=GIT_REPO_PATH
)
# Return new hash
return get_git_hash()
def build_pages():
logging.info("Cleaning files")
subprocess.run(["rm", "-rv", f"{PUB_PATH}/."])
subprocess.run(["rm", "-rv", f"{GIT_REPO_PATH}/public/."])
logging.info("Building pages")
subprocess.run(["hugo"], cwd=GIT_REPO_PATH)
logging.info("Copying files")
subprocess.run(["cp", "-rv", f"{GIT_REPO_PATH}/public/.", PUB_PATH])
def update_footer(last_build_time, git_hash):
with open(FOOTER_FILE_PATH, "r") as file:
footer_content = file.read()
build_info = f"Last Build: {last_build_time}, Git Hash: {git_hash}"
new_footer_content = footer_content.replace("<!-- BUILD_METADATA -->", build_info)
with open(FOOTER_FILE_PATH, "w") as file:
file.write(new_footer_content)
def main():
# Time!
startime = time.time()
# Get the current Git hash
current_git_hash = get_git_hash()
last_git_hash = ""
# Check if the Git hash file exists
if not os.path.exists(HASH_FILE_PATH):
logging.warning(f"Hash at {HASH_FILE_PATH} doesn't exist!")
else:
with open(HASH_FILE_PATH, "r") as file:
last_git_hash = file.read().strip()
if current_git_hash == last_git_hash and current_git_hash != None:
logging.info(
f"No new changes detected. Skipping rebuild for {current_git_hash}."
)
return
# Update repo
logging.info("Updating repo")
current_git_hash = update_repo()
# Update footer with build metadata
last_build_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
update_footer(last_build_time, current_git_hash)
# Rebuild site
logging.info("Building the site")
build_pages()
# Store the new Git hash
with open(HASH_FILE_PATH, "w") as file:
file.write(current_git_hash)
logging.info(f"Done in {time.time() - startime}!")
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()