From 51191c3911c6fab33021d35e73e8ed76c0cf35c0 Mon Sep 17 00:00:00 2001 From: Frank Midigo Date: Thu, 15 Oct 2026 15:08:25 +0300 Subject: [PATCH 1/2] fix(cli): explicit --checkout/--no-checkout beats OPENFN_NO_CHECKOUT_AFTER_DEPLOY --- .changeset/checkout-flag-precedence.md | 5 ++ packages/cli/src/projects/options.ts | 7 +-- .../cli/test/projects/deploy-options.test.ts | 46 +++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 .changeset/checkout-flag-precedence.md create mode 100644 packages/cli/test/projects/deploy-options.test.ts diff --git a/.changeset/checkout-flag-precedence.md b/.changeset/checkout-flag-precedence.md new file mode 100644 index 000000000..bf0d34217 --- /dev/null +++ b/.changeset/checkout-flag-precedence.md @@ -0,0 +1,5 @@ +--- +'@openfn/cli': patch +--- + +An explicit `--checkout` or `--no-checkout` on `project deploy` now overrides `OPENFN_NO_CHECKOUT_AFTER_DEPLOY` diff --git a/packages/cli/src/projects/options.ts b/packages/cli/src/projects/options.ts index cf266a8d5..7408eabb3 100644 --- a/packages/cli/src/projects/options.ts +++ b/packages/cli/src/projects/options.ts @@ -65,13 +65,14 @@ export const checkout: CLIOption = { name: 'checkout', yargs: { boolean: true, - default: true, + // no yargs default: ensure() needs to know whether the flag was passed description: 'Checkout the project after deploying. Use --no-checkout or OPENFN_NO_CHECKOUT_AFTER_DEPLOY=true to skip', }, ensure: (opts: any) => { - if (process.env.OPENFN_NO_CHECKOUT_AFTER_DEPLOY === 'true') { - opts.checkout = false; + // An explicit --checkout or --no-checkout always beats the env var + if (opts.checkout === undefined) { + opts.checkout = process.env.OPENFN_NO_CHECKOUT_AFTER_DEPLOY !== 'true'; } }, }; diff --git a/packages/cli/test/projects/deploy-options.test.ts b/packages/cli/test/projects/deploy-options.test.ts new file mode 100644 index 000000000..6157baba7 --- /dev/null +++ b/packages/cli/test/projects/deploy-options.test.ts @@ -0,0 +1,46 @@ +import test from 'ava'; +import yargs from 'yargs'; + +import { command } from '../../src/projects/deploy'; + +const ENV = 'OPENFN_NO_CHECKOUT_AFTER_DEPLOY'; +const original = process.env[ENV]; + +test.afterEach.always(() => { + if (original === undefined) { + delete process.env[ENV]; + } else { + process.env[ENV] = original; + } +}); + +// Parsing runs the command handler (ensure), so this returns the final options +const parse = (cmd: string) => + yargs() + .command(command as any) + .parse(cmd) as any; + +test.serial('checkout defaults to true', (t) => { + delete process.env[ENV]; + t.true(parse('deploy').checkout); +}); + +test.serial('env=true with no flag skips checkout', (t) => { + process.env[ENV] = 'true'; + t.false(parse('deploy').checkout); +}); + +test.serial('env=true with --checkout checks out', (t) => { + process.env[ENV] = 'true'; + t.true(parse('deploy --checkout').checkout); +}); + +test.serial('env=false with --no-checkout skips checkout', (t) => { + process.env[ENV] = 'false'; + t.false(parse('deploy --no-checkout').checkout); +}); + +test.serial('env unset with --no-checkout skips checkout', (t) => { + delete process.env[ENV]; + t.false(parse('deploy --no-checkout').checkout); +}); From 120346327e0a2a822aca37122f18d2996163918b Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Thu, 15 Oct 2026 16:42:05 +0100 Subject: [PATCH 2/2] update tests --- packages/cli/src/projects/options.ts | 1 - ...deploy-options.test.ts => options.test.ts} | 27 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) rename packages/cli/test/projects/{deploy-options.test.ts => options.test.ts} (58%) diff --git a/packages/cli/src/projects/options.ts b/packages/cli/src/projects/options.ts index 7408eabb3..855a09431 100644 --- a/packages/cli/src/projects/options.ts +++ b/packages/cli/src/projects/options.ts @@ -65,7 +65,6 @@ export const checkout: CLIOption = { name: 'checkout', yargs: { boolean: true, - // no yargs default: ensure() needs to know whether the flag was passed description: 'Checkout the project after deploying. Use --no-checkout or OPENFN_NO_CHECKOUT_AFTER_DEPLOY=true to skip', }, diff --git a/packages/cli/test/projects/deploy-options.test.ts b/packages/cli/test/projects/options.test.ts similarity index 58% rename from packages/cli/test/projects/deploy-options.test.ts rename to packages/cli/test/projects/options.test.ts index 6157baba7..56025ce31 100644 --- a/packages/cli/test/projects/deploy-options.test.ts +++ b/packages/cli/test/projects/options.test.ts @@ -22,25 +22,42 @@ const parse = (cmd: string) => test.serial('checkout defaults to true', (t) => { delete process.env[ENV]; - t.true(parse('deploy').checkout); + const options = parse('deploy'); + t.true(options.checkout); }); test.serial('env=true with no flag skips checkout', (t) => { process.env[ENV] = 'true'; - t.false(parse('deploy').checkout); + const options = parse('deploy'); + t.false(options.checkout); +}); + +test.serial('env=false with no flag checks out', (t) => { + process.env[ENV] = 'false'; + const options = parse('deploy'); + t.true(options.checkout); +}); + +test.serial('env=1 (truthy but not "true") with no flag checks out', (t) => { + process.env[ENV] = '1'; + const options = parse('deploy'); + t.true(options.checkout); }); test.serial('env=true with --checkout checks out', (t) => { process.env[ENV] = 'true'; - t.true(parse('deploy --checkout').checkout); + const options = parse('deploy --checkout'); + t.true(options.checkout); }); test.serial('env=false with --no-checkout skips checkout', (t) => { process.env[ENV] = 'false'; - t.false(parse('deploy --no-checkout').checkout); + const options = parse('deploy --no-checkout'); + t.false(options.checkout); }); test.serial('env unset with --no-checkout skips checkout', (t) => { delete process.env[ENV]; - t.false(parse('deploy --no-checkout').checkout); + const options = parse('deploy --no-checkout'); + t.false(options.checkout); });