From 798807a9c2acb8faf93d5598c7ab85b7d92535c1 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Fri, 10 Jul 2026 21:32:53 -0400 Subject: [PATCH] some saved by cahcing git path resolution. --- scripts/duffle.lua | 9 +++++++-- scripts/duffle_paths.lua | 14 ++++++++++++-- scripts/passes/duffle_paths.lua | 14 ++++++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/scripts/duffle.lua b/scripts/duffle.lua index d9ff1c6..d751d75 100644 --- a/scripts/duffle.lua +++ b/scripts/duffle.lua @@ -98,10 +98,14 @@ local BYTE_DIGIT_9 = 57 -- '9' -- `C:\\projects\\Pikuma\\ps1\\...` breaks portability. Git gives us -- the canonical repo root regardless of where it lives. ---- Resolve the repo root via `git rev-parse --show-toplevel`. Returns a ---- path with a trailing separator, or nil if not in a git repo. +--- Resolve the repo root via `git rev-parse --show-toplevel` (cached). +--- Returns a path with a trailing separator, or nil if not in a git repo. --- @return string|nil local function find_repo_root() + -- Cached in `package.loaded` (process-global) so all 8 entry scripts + -- + passes scripts share one git call. Without this, git rev-parse + -- runs once per script load = 8 × ~150ms = 1.2s wasted per build. + if package.loaded.__duffle_repo_root__ then return package.loaded.__duffle_repo_root__ end local p = io.popen("git rev-parse --show-toplevel 2>nul") local root if p then @@ -110,6 +114,7 @@ local function find_repo_root() end if not root or root == "" then return nil end if not root:match("[/\\]$") then root = root .. "/" end + package.loaded.__duffle_repo_root__ = root return root end diff --git a/scripts/duffle_paths.lua b/scripts/duffle_paths.lua index 957b52a..454d681 100644 --- a/scripts/duffle_paths.lua +++ b/scripts/duffle_paths.lua @@ -28,10 +28,18 @@ local M = {} ---- Resolve the repo root via git. Returns a normalized path with a ---- trailing forward-slash, or nil if not in a git repo. +-- Cache key for the repo root. Stored in `package.loaded` (process- +-- global) so all 8 entry scripts + passes scripts share one git call. +-- Without this cache, `git rev-parse --show-toplevel` runs once per +-- script load = 8 × ~150ms = 1.2s wasted per build on Windows. +local CACHE_KEY = "__duffle_repo_root__" + +--- Resolve the repo root via git (cached after first call). +--- Returns a normalized path with a trailing forward-slash, or nil +--- if not in a git repo. --- @return string|nil local function find_repo_root() + if package.loaded[CACHE_KEY] then return package.loaded[CACHE_KEY] end local p = io.popen("git rev-parse --show-toplevel 2>nul") local root if p then @@ -43,11 +51,13 @@ local function find_repo_root() -- `\` + `/` confuses LuaJIT's file APIs). root = root:gsub("\\", "/") if not root:match("/$") then root = root .. "/" end + package.loaded[CACHE_KEY] = root return root end --- Set `package.path` (for `require("duffle")` + `require("passes.X")`) --- and `package.cpath` (for `lpeg.dll` on Windows). +--- Idempotent: safe to call multiple times (just re-sets the same paths). function M.setup() local repo_root = find_repo_root() if not repo_root then diff --git a/scripts/passes/duffle_paths.lua b/scripts/passes/duffle_paths.lua index 957b52a..454d681 100644 --- a/scripts/passes/duffle_paths.lua +++ b/scripts/passes/duffle_paths.lua @@ -28,10 +28,18 @@ local M = {} ---- Resolve the repo root via git. Returns a normalized path with a ---- trailing forward-slash, or nil if not in a git repo. +-- Cache key for the repo root. Stored in `package.loaded` (process- +-- global) so all 8 entry scripts + passes scripts share one git call. +-- Without this cache, `git rev-parse --show-toplevel` runs once per +-- script load = 8 × ~150ms = 1.2s wasted per build on Windows. +local CACHE_KEY = "__duffle_repo_root__" + +--- Resolve the repo root via git (cached after first call). +--- Returns a normalized path with a trailing forward-slash, or nil +--- if not in a git repo. --- @return string|nil local function find_repo_root() + if package.loaded[CACHE_KEY] then return package.loaded[CACHE_KEY] end local p = io.popen("git rev-parse --show-toplevel 2>nul") local root if p then @@ -43,11 +51,13 @@ local function find_repo_root() -- `\` + `/` confuses LuaJIT's file APIs). root = root:gsub("\\", "/") if not root:match("/$") then root = root .. "/" end + package.loaded[CACHE_KEY] = root return root end --- Set `package.path` (for `require("duffle")` + `require("passes.X")`) --- and `package.cpath` (for `lpeg.dll` on Windows). +--- Idempotent: safe to call multiple times (just re-sets the same paths). function M.setup() local repo_root = find_repo_root() if not repo_root then