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_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()