import os import time 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" 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 git_fetch() -> bool: # Fetch the latest changes subprocess.run(["git", "fetch"], cwd=GIT_REPO_PATH) # Check if the local branch is behind the remote branch result = subprocess.run( ["git", "status", "-uno"], cwd=GIT_REPO_PATH, capture_output=True, text=True, ) # If output contains "Your branch is behind", there are updates if "Your branch is behind" in result.stdout: return True return False def update_repo(): # Make dir logging.debug(f"Making dirs {GIT_REPO_PATH}") if get_git_hash() is 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() is None: logging.info(f"Cloning '{url}'.") subprocess.run(["git", "clone", url, GIT_REPO_PATH, "--recurse-submodules"]) else: # Check if fetch indicates a need for an update if git_fetch(): logging.info(f"Fetch and pull '{url}'.") subprocess.run(["git", "reset", "--hard"], cwd=GIT_REPO_PATH) subprocess.run(["git", "pull"], cwd=GIT_REPO_PATH) logging.info(f"Update submodules '{url}'.") subprocess.run( ["git", "submodule", "update", "--init", "--recursive"], cwd=GIT_REPO_PATH, ) return True return False def build_pages(): logging.info("Cleaning files") subprocess.run(["rm", "-rf", f"{PUB_PATH}/*"]) subprocess.run(["rm", "-rf", f"{GIT_REPO_PATH}/public/*"]) logging.info("Building pages") subprocess.run(["hugo"], cwd=GIT_REPO_PATH) logging.info("Copying files") subprocess.run(["cp", "-r", 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() # Update repo logging.info("Updating repo") if not update_repo(): logging.debug("Nothing to do") return # 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() logging.info(f"Done in {time.time() - startime}!") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) main()