From eb891777144b1b3f29930f5f0981ef6f820fc65e Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:09:47 +0200 Subject: [PATCH 1/7] 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 1674883aee..8d97e09767 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 af9961355d3e6d27b72473697d6f1ba5c7a1b1bc Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:23:03 +0200 Subject: [PATCH 2/7] 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 8d97e09767..62df8aae90 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -330,6 +330,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 1ee3b56602881af972a6804108745684e759c1a6 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:30:47 +0200 Subject: [PATCH 3/7] 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 62df8aae90..17c65067df 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -298,8 +298,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 ( @@ -330,8 +332,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 c01594e471d0a69a69d98f60615f2a9db2164efd Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Thu, 3 Apr 2025 13:41:15 +0200 Subject: [PATCH 4/7] 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 17c65067df..cd6203f4d9 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -298,10 +298,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 ( @@ -332,7 +330,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 33ff1d93981ae648ccd099d367c73470c884d2e1 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 8 Apr 2025 20:49:35 +0200 Subject: [PATCH 5/7] Refactor by using a default handler --- src/command/render/project.ts | 38 ++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index cd6203f4d9..f5cd9c25a5 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 { Zod } from "../../resources/types/zod/schema-types.ts"; +import { RunHandlerOptions } from "../../core/run/types.ts"; const noMutationValidations = ( projType: ProjectType, @@ -976,16 +977,30 @@ 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 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.splice(1), undefined, { cwd: projDir, @@ -997,8 +1012,7 @@ async function runScripts( } } else { const result = await execProcess({ - cmd: args[0], - args: args.slice(1), + cmd: args, cwd: projDir, stdout: quiet ? "piped" : "inherit", env, From b8842320b9e862b8119ede6b30b7dd93e0750e01 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Tue, 8 Apr 2025 20:53:38 +0200 Subject: [PATCH 6/7] 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 f5cd9c25a5..6071c7d5e9 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) ?? { From f490fb13547513d672e8a77dfad5b44573360338 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 18 Jun 2025 17:33:59 +0200 Subject: [PATCH 7/7] fix bad merge conflict in rebasing --- src/command/render/project.ts | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/src/command/render/project.ts b/src/command/render/project.ts index 6071c7d5e9..7dbd3b4afc 100644 --- a/src/command/render/project.ts +++ b/src/command/render/project.ts @@ -988,7 +988,8 @@ async function runScripts( options?: RunHandlerOptions, ) => { return await execProcess({ - cmd: [script, ...args], + cmd: script, + args: args, cwd: options?.cwd, stdout: options?.stdout, env: options?.env, @@ -1005,24 +1006,13 @@ async function runScripts( env["QUARTO_USE_FILE_FOR_PROJECT_OUTPUT_FILES"] = output; } - 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 result = await handler.run(script, args.splice(1), undefined, { + cwd: projDir, + stdout: quiet ? "piped" : "inherit", + env, + }); + if (!result.success) { + throw new Error(); } } if (scripts.length > 0) {