From 1b4eb0a18e87d12b364cfff9f645fe1f38de515f Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:09:47 +0200 Subject: [PATCH 1/6] Add more context in info log when running post render script --- src/command/render/project.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index bc5730f46c8..134896ed6ce 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -962,7 +962,7 @@ async function runScripts( const script = args[0]; if (progress && !quiet) { - info(colors.bold(colors.blue(`${script}`))); + info(colors.bold(colors.blue(`Running script '${script}'`))); } const handler = handlerForScript(script); From d888801dce7d12ac99236544256ab1783cae5cea Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:23:03 +0200 Subject: [PATCH 2/6] Let pre/post render script know if progress should be shown. This will allows scripts to be quiet --- src/command/render/project.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index 134896ed6ce..8708b27fc2b 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -328,6 +328,8 @@ export async function renderProject( ...(projectRenderConfig.behavior.renderAll ? { QUARTO_PROJECT_RENDER_ALL: "1" } : {}), + "QUARTO_PROJECT_SCRIPT_PROGRESS": + progress && !projectRenderConfig.options.flags?.quiet ? "1" : "0", }; // run pre-render step if we are rendering all files From 41c6c654985556303726d556a53759e4ca6e9afe Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:30:47 +0200 Subject: [PATCH 3/6] make it clearer that showing script progress consider also the `--quiet` option --- src/command/render/project.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index 8708b27fc2b..7628b7eab37 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -296,8 +296,10 @@ export async function renderProject( await ensureGitignore(context.dir); // determine whether pre and post render steps should show progress - const progress = !!projectRenderConfig.options.progress || - (projectRenderConfig.filesToRender.length > 1); + const progress = ( + !!projectRenderConfig.options.progress || + (projectRenderConfig.filesToRender.length > 1) + ) && !projectRenderConfig.options.flags?.quiet; // if there is an output dir then remove it if clean is specified if ( @@ -328,8 +330,7 @@ export async function renderProject( ...(projectRenderConfig.behavior.renderAll ? { QUARTO_PROJECT_RENDER_ALL: "1" } : {}), - "QUARTO_PROJECT_SCRIPT_PROGRESS": - progress && !projectRenderConfig.options.flags?.quiet ? "1" : "0", + "QUARTO_PROJECT_SCRIPT_PROGRESS": progress ? "1" : "0", }; // run pre-render step if we are rendering all files @@ -963,7 +964,7 @@ async function runScripts( const args = parseShellRunCommand(scripts[i]); const script = args[0]; - if (progress && !quiet) { + if (progress) { info(colors.bold(colors.blue(`Running script '${script}'`))); } From 9d313691a64d4a9da1df0b396883fc986702ba32 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:41:15 +0200 Subject: [PATCH 4/6] Set the env var in `runScript` directly which seems a better way to take into account `quiet` option in addition to progress. --- src/command/render/project.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index 7628b7eab37..4fa8227452f 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -296,10 +296,8 @@ export async function renderProject( await ensureGitignore(context.dir); // determine whether pre and post render steps should show progress - const progress = ( - !!projectRenderConfig.options.progress || - (projectRenderConfig.filesToRender.length > 1) - ) && !projectRenderConfig.options.flags?.quiet; + const progress = !!projectRenderConfig.options.progress || + (projectRenderConfig.filesToRender.length > 1); // if there is an output dir then remove it if clean is specified if ( @@ -330,7 +328,6 @@ export async function renderProject( ...(projectRenderConfig.behavior.renderAll ? { QUARTO_PROJECT_RENDER_ALL: "1" } : {}), - "QUARTO_PROJECT_SCRIPT_PROGRESS": progress ? "1" : "0", }; // run pre-render step if we are rendering all files @@ -960,24 +957,27 @@ async function runScripts( quiet: boolean, env?: { [key: string]: string }, ) { + // initialize the environment if needed + if (env) { + env = { + ...env, + }; + } else { + env = {}; + } + if (!env) throw new Error("should never get here"); + for (let i = 0; i < scripts.length; i++) { const args = parseShellRunCommand(scripts[i]); const script = args[0]; - if (progress) { + if (progress && !quiet) { info(colors.bold(colors.blue(`Running script '${script}'`))); + env["QUARTO_PROJECT_SCRIPT_PROGRESS"] = "1"; } const handler = handlerForScript(script); if (handler) { - if (env) { - env = { - ...env, - }; - } else { - env = {}; - } - if (!env) throw new Error("should never get here"); const input = Deno.env.get("QUARTO_USE_FILE_FOR_PROJECT_INPUT_FILES"); const output = Deno.env.get("QUARTO_USE_FILE_FOR_PROJECT_OUTPUT_FILES"); if (input) { From 775b4c2aca59f65f90574c3ddcf4a64a7a998de3 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 8 Apr 2025 20:49:35 +0200 Subject: [PATCH 5/6] Refactor by using a default handler --- src/command/render/project.ts | 60 +++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index 4fa8227452f..455943fb210 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -81,6 +81,7 @@ import { fileExecutionEngine } from "../../execute/engine.ts"; import { projectContextForDirectory } from "../../project/project-context.ts"; import { ProjectType } from "../../project/types/types.ts"; import { ProjectConfig as ProjectConfig_Project } from "../../resources/types/schema-types.ts"; +import { RunHandlerOptions } from "../../core/run/types.ts"; const noMutationValidations = ( projType: ProjectType, @@ -976,35 +977,38 @@ async function runScripts( env["QUARTO_PROJECT_SCRIPT_PROGRESS"] = "1"; } - const handler = handlerForScript(script); - if (handler) { - const input = Deno.env.get("QUARTO_USE_FILE_FOR_PROJECT_INPUT_FILES"); - const output = Deno.env.get("QUARTO_USE_FILE_FOR_PROJECT_OUTPUT_FILES"); - if (input) { - env["QUARTO_USE_FILE_FOR_PROJECT_INPUT_FILES"] = input; - } - if (output) { - env["QUARTO_USE_FILE_FOR_PROJECT_OUTPUT_FILES"] = output; - } + const handler = handlerForScript(script) ?? { + run: async ( + script: string, + args: string[], + _stdin?: string, + options?: RunHandlerOptions, + ) => { + return await execProcess({ + cmd: [script, ...args], + cwd: options?.cwd, + stdout: options?.stdout, + env: options?.env, + }); + }, + }; - const result = await handler.run(script, args.splice(1), undefined, { - cwd: projDir, - stdout: quiet ? "piped" : "inherit", - env, - }); - if (!result.success) { - throw new Error(); - } - } else { - const result = await execProcess({ - cmd: args, - cwd: projDir, - stdout: quiet ? "piped" : "inherit", - env, - }); - if (!result.success) { - throw new Error(); - } + const input = Deno.env.get("QUARTO_USE_FILE_FOR_PROJECT_INPUT_FILES"); + const output = Deno.env.get("QUARTO_USE_FILE_FOR_PROJECT_OUTPUT_FILES"); + if (input) { + env["QUARTO_USE_FILE_FOR_PROJECT_INPUT_FILES"] = input; + } + if (output) { + env["QUARTO_USE_FILE_FOR_PROJECT_OUTPUT_FILES"] = output; + } + + const result = await handler.run(script, args.slice(1), undefined, { + cwd: projDir, + stdout: quiet ? "piped" : "inherit", + env, + }); + if (!result.success) { + throw new Error(); } } if (scripts.length > 0) { From 45c8580a33df3dc4fd40927d3bda6d320c378993 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 8 Apr 2025 20:53:38 +0200 Subject: [PATCH 6/6] Use one env var per argument QUIET VS PROGRESS --- src/command/render/project.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index 455943fb210..0533fb62a33 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -968,13 +968,16 @@ async function runScripts( } if (!env) throw new Error("should never get here"); + // Pass some argument as environment + env["QUARTO_PROJECT_SCRIPT_PROGRESS"] = progress ? "1" : "0"; + env["QUARTO_PROJECT_SCRIPT_QUIET"] = quiet ? "1" : "0"; + for (let i = 0; i < scripts.length; i++) { const args = parseShellRunCommand(scripts[i]); const script = args[0]; if (progress && !quiet) { info(colors.bold(colors.blue(`Running script '${script}'`))); - env["QUARTO_PROJECT_SCRIPT_PROGRESS"] = "1"; } const handler = handlerForScript(script) ?? {