From 36dac8b03068e506d38ddcb79689ad036fb2a041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Strausmann?= Date: Thu, 30 Jul 2026 19:33:31 +0000 Subject: [PATCH] refactor(stacks): plumb sourceType through requireComposeFile to avoid redundant lookup startStack, restartStack, stopStack, and downStack each ran a separate getStackSource query just to determine isGitStack for useOverrideFile, even though requireComposeFile -> getStackComposeFile already looks up the same stack_sources record. Return sourceType from getStackComposeFile (GetComposeFileResult) and requireComposeFile (RequireComposeResult), and have all four callers read result.sourceType instead of querying the database again. No behavior change: useOverrideFile is still set to true exactly when the stack's source type is 'git'. --- src/lib/server/stacks.ts | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/lib/server/stacks.ts b/src/lib/server/stacks.ts index e7df13f..dee423f 100644 --- a/src/lib/server/stacks.ts +++ b/src/lib/server/stacks.ts @@ -479,6 +479,8 @@ export interface GetComposeFileResult { composePath?: string | null; envPath?: string | null; suggestedEnvPath?: string; + /** Stack source type (internal/git/external), from the stack_sources lookup already done here */ + sourceType?: StackSourceType; } /** @@ -538,7 +540,8 @@ export async function getStackComposeFile( stackDir, composePath: source.composePath, envPath: source.envPath, - suggestedEnvPath + suggestedEnvPath, + sourceType: source.sourceType }; } catch (error) { const message = error instanceof Error ? error.message : 'Unknown error'; @@ -572,7 +575,8 @@ export async function getStackComposeFile( stackDir, // Always return the actual resolved paths for display composePath: actualComposePath, - envPath: envExists ? envFilePath : null + envPath: envExists ? envFilePath : null, + sourceType: source.sourceType }; } } @@ -2013,6 +2017,8 @@ export interface RequireComposeResult { composePath?: string; /** Full path to the env file (for --env-file flag) */ envPath?: string; + /** Stack source type (internal/git/external), plumbed through from getStackComposeFile to avoid a redundant getStackSource lookup in callers */ + sourceType?: StackSourceType; } /** @@ -2087,7 +2093,8 @@ export async function requireComposeFile( nonSecretVars, stackDir: composeResult.stackDir, composePath: composeResult.composePath ?? undefined, - envPath: envFilePath ?? undefined + envPath: envFilePath ?? undefined, + sourceType: composeResult.sourceType }; } @@ -2172,9 +2179,10 @@ export async function startStack( return fallback; } - // Check if this is a git stack - git stacks need useOverrideFile to write .env.dockhand - const source = await getStackSource(stackName, envId); - const isGitStack = source?.sourceType === 'git'; + // Git stacks need useOverrideFile to write .env.dockhand with DB overrides. + // sourceType is plumbed through from requireComposeFile (which already looked + // it up via getStackComposeFile/getStackSource) to avoid a redundant DB lookup. + const isGitStack = result.sourceType === 'git'; const opts: ComposeCommandOptions = { stackName, envId, workingDir: result.stackDir, composePath: result.composePath, envPath: result.envPath, useOverrideFile: isGitStack }; @@ -2212,9 +2220,9 @@ export async function stopStack( return fallback; } - // Check if this is a git stack - git stacks need useOverrideFile to write .env.dockhand - const source = await getStackSource(stackName, envId); - const isGitStack = source?.sourceType === 'git'; + // Git stacks need useOverrideFile to write .env.dockhand with DB overrides. + // sourceType is plumbed through from requireComposeFile to avoid a redundant DB lookup. + const isGitStack = result.sourceType === 'git'; const composeResult = await executeComposeCommand( 'stop', @@ -2256,8 +2264,8 @@ export async function restartStack( // Git stacks need useOverrideFile to write .env.dockhand with DB overrides. // Non-git stacks still pass nonSecretVars for legacy support (stacks without // .env files on disk get vars injected via shell env at executeLocalCompose). - const source = await getStackSource(stackName, envId); - const isGitStack = source?.sourceType === 'git'; + // sourceType is plumbed through from requireComposeFile to avoid a redundant DB lookup. + const isGitStack = result.sourceType === 'git'; const opts: ComposeCommandOptions = { stackName, envId, workingDir: result.stackDir, composePath: result.composePath, envPath: result.envPath, useOverrideFile: isGitStack }; @@ -2293,9 +2301,9 @@ export async function downStack( return withContainerFallback(stackName, envId, 'stop'); } - // Check if this is a git stack - git stacks need useOverrideFile to write .env.dockhand - const source = await getStackSource(stackName, envId); - const isGitStack = source?.sourceType === 'git'; + // Git stacks need useOverrideFile to write .env.dockhand with DB overrides. + // sourceType is plumbed through from requireComposeFile to avoid a redundant DB lookup. + const isGitStack = result.sourceType === 'git'; const composeResult = await executeComposeCommand( 'down',