From 288af880663e8175ae50aac322921d1b09092862 Mon Sep 17 00:00:00 2001 From: Charles Ouimet Date: Wed, 13 May 2026 13:15:11 -0400 Subject: [PATCH 1/6] [issues/562] Add CI job for integration tests with marketplace extensions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Adds a dedicated CI leg that runs `pnpm test:release:with-extensions --no-assisted` under Xvfb. Before this, that test mode only ran locally — the custom AI assistant tests depend on a `dummy-ai-extension` installed from marketplace, so the standard `test:release:automated` CI leg (which skips extension install) could not cover them. ## Changes - Added `.github/actions/run-integration-tests-with-extensions/action.yml` — composite action that installs Xvfb + native deps, caches the VS Code test binary, and runs the extension-dependent integration tests - Appended `test-with-extensions` job to `.github/workflows/ci.yml` — runs on `ubuntu-latest` in parallel with the existing `test` job ## Test Plan - [ ] CI: push branch, confirm the `test-with-extensions` job runs green on GitHub Actions ## Related - Closes https://github.com/couimet/rangeLink/issues/562 --- .../action.yml | 21 +++++++++++++++++++ .github/workflows/ci.yml | 17 +++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 .github/actions/run-integration-tests-with-extensions/action.yml diff --git a/.github/actions/run-integration-tests-with-extensions/action.yml b/.github/actions/run-integration-tests-with-extensions/action.yml new file mode 100644 index 00000000..9a80acf7 --- /dev/null +++ b/.github/actions/run-integration-tests-with-extensions/action.yml @@ -0,0 +1,21 @@ +name: 'Run Integration Tests (with extensions)' +description: 'Run pnpm test:release:with-extensions --no-assisted under Xvfb — installs marketplace extensions and runs automated tests that depend on them' +runs: + using: 'composite' + steps: + - name: Install Xvfb and VS Code native dependencies + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends xvfb libgtk-3-0 libxss1 libnss3 libasound2t64 + + - name: Cache VS Code test binary + uses: actions/cache@v4 + with: + path: ~/.vscode-test + key: vscode-test-${{ runner.os }}-stable + restore-keys: vscode-test-${{ runner.os }}- + + - name: Run integration tests under Xvfb + shell: bash + run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" pnpm test:release:with-extensions --no-assisted diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ea5220b5..4cd1939a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,3 +42,20 @@ jobs: # For PRs: compare with base branch # For pushes to main: just count current TODOs base-ref: ${{ github.event_name == 'pull_request' && github.base_ref || '' }} + + test-with-extensions: + name: Integration Tests (with extensions) + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js and pnpm + uses: ./.github/actions/setup-node-pnpm + + - name: Install dependencies + uses: ./.github/actions/install-deps + + - name: Run integration tests with extensions + uses: ./.github/actions/run-integration-tests-with-extensions From 2b8037dda6e34865aabf5ec52504f498d8d170c1 Mon Sep 17 00:00:00 2001 From: Charles Ouimet Date: Wed, 13 May 2026 15:39:29 -0400 Subject: [PATCH 2/6] [refactor] Extract shared BASE_CONFIG into base.mjs, move assisted grep to shell script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each vscode-test config duplicated the same ~20 lines of boilerplate (files, extensionDevelopmentPath, workspaceFolder, version, launchArgs, env, mocha). Before this change, the automated config also hardcoded the grep/invert for [assisted] while with-extensions and the default config duplicated the env-based grep logic. Extracting a base config and delegating filtering to the shell script makes the config files dumb pipes — they spread BASE_CONFIG, override one or two fields, and done. Benefits: - Config files shrink from ~28 lines to ~10 lines each - Single source of truth for mocha grep/invert — MOCHA_GREP/MOCHA_INVERT env vars set by test-release-run.sh - Adding a new vscode-test config is one import + one spread, not copy-paste - [assisted] pattern lives only in the shell script that defines --automated and --no-assisted switches --- .../action.yml | 3 +- .../.vscode-test.automated.mjs | 22 ++------------ .../.vscode-test.base.mjs | 29 +++++++++++++++++++ .../.vscode-test.mjs | 24 ++------------- .../.vscode-test.with-extensions.mjs | 28 +++++------------- .../rangelink-vscode-extension/TESTING.md | 2 +- .../scripts/test-release-run.sh | 10 ++++++- 7 files changed, 54 insertions(+), 64 deletions(-) create mode 100644 packages/rangelink-vscode-extension/.vscode-test.base.mjs diff --git a/.github/actions/run-integration-tests-with-extensions/action.yml b/.github/actions/run-integration-tests-with-extensions/action.yml index 9a80acf7..f1776886 100644 --- a/.github/actions/run-integration-tests-with-extensions/action.yml +++ b/.github/actions/run-integration-tests-with-extensions/action.yml @@ -7,7 +7,8 @@ runs: shell: bash run: | sudo apt-get update - sudo apt-get install -y --no-install-recommends xvfb libgtk-3-0 libxss1 libnss3 libasound2t64 + ALSA_PKG=$(apt-cache show libasound2t64 >/dev/null 2>&1 && echo libasound2t64 || echo libasound2) + sudo apt-get install -y --no-install-recommends xvfb libgtk-3-0 libxss1 libnss3 "$ALSA_PKG" - name: Cache VS Code test binary uses: actions/cache@v4 diff --git a/packages/rangelink-vscode-extension/.vscode-test.automated.mjs b/packages/rangelink-vscode-extension/.vscode-test.automated.mjs index 7f499d65..b28e32dc 100644 --- a/packages/rangelink-vscode-extension/.vscode-test.automated.mjs +++ b/packages/rangelink-vscode-extension/.vscode-test.automated.mjs @@ -1,26 +1,10 @@ -import * as os from 'node:os'; -import * as path from 'node:path'; - import { defineConfig } from '@vscode/test-cli'; -const MOCHA_TIMEOUT_MS = 20_000; -const ASSISTED_TEST_GREP = '\\[assisted\\]'; -const USER_DATA_DIR = path.join(os.tmpdir(), 'rl-vscode-test'); +import { CI_TIMEOUT_MS, BASE_CONFIG } from './.vscode-test.base.mjs'; export default defineConfig([ { - files: 'out/__integration-tests__/suite/**/*.test.js', - extensionDevelopmentPath: ['./', './test-fixtures/dummy-ai-extension/'], - workspaceFolder: './', - version: 'stable', - launchArgs: ['--user-data-dir', USER_DATA_DIR], - env: { - RANGELINK_CAPTURE_LOGS: 'true', - }, - mocha: { - timeout: MOCHA_TIMEOUT_MS, - grep: ASSISTED_TEST_GREP, - invert: true, - }, + ...BASE_CONFIG, + mocha: { timeout: CI_TIMEOUT_MS, ...BASE_CONFIG.mocha }, }, ]); diff --git a/packages/rangelink-vscode-extension/.vscode-test.base.mjs b/packages/rangelink-vscode-extension/.vscode-test.base.mjs new file mode 100644 index 00000000..5826764f --- /dev/null +++ b/packages/rangelink-vscode-extension/.vscode-test.base.mjs @@ -0,0 +1,29 @@ +import * as os from 'node:os'; +import * as path from 'node:path'; + +// 10 minutes per test — assisted tests block on human interaction. +export const ASSISTED_TIMEOUT_MS = 600_000; + +// No human in CI — automated tests resolve in under 5s. +export const CI_TIMEOUT_MS = 20_000; + +export const userDataDir = (suffix = '') => [ + '--user-data-dir', + path.join(os.tmpdir(), `rl-vscode-test${suffix}`), +]; + +// grep and invert are driven by env vars set in test-release-run.sh. +const envMocha = () => ({ + ...(process.env.MOCHA_GREP ? { grep: process.env.MOCHA_GREP } : {}), + ...(process.env.MOCHA_INVERT === 'true' ? { invert: true } : {}), +}); + +export const BASE_CONFIG = { + files: 'out/__integration-tests__/suite/**/*.test.js', + extensionDevelopmentPath: ['./', './test-fixtures/dummy-ai-extension/'], + workspaceFolder: './', + version: 'stable', + launchArgs: userDataDir(), + env: { RANGELINK_CAPTURE_LOGS: 'true' }, + mocha: envMocha(), +}; diff --git a/packages/rangelink-vscode-extension/.vscode-test.mjs b/packages/rangelink-vscode-extension/.vscode-test.mjs index e4573025..faaf9f7e 100644 --- a/packages/rangelink-vscode-extension/.vscode-test.mjs +++ b/packages/rangelink-vscode-extension/.vscode-test.mjs @@ -1,28 +1,10 @@ -import * as os from 'node:os'; -import * as path from 'node:path'; - import { defineConfig } from '@vscode/test-cli'; -// 10 minutes per test — assisted tests block on human interaction (modal -// verdict dialogs don't auto-dismiss), so the human needs headroom to read -// instructions, complete UI actions, or step away for a break. Automated tests -// never come close to this threshold. -const MOCHA_TIMEOUT_MS = 600_000; -const USER_DATA_DIR = path.join(os.tmpdir(), 'rl-vscode-test'); +import { ASSISTED_TIMEOUT_MS, BASE_CONFIG } from './.vscode-test.base.mjs'; export default defineConfig([ { - files: 'out/__integration-tests__/suite/**/*.test.js', - extensionDevelopmentPath: ['./', './test-fixtures/dummy-ai-extension/'], - workspaceFolder: './', - version: 'stable', - launchArgs: ['--user-data-dir', USER_DATA_DIR], - env: { - RANGELINK_CAPTURE_LOGS: 'true', - }, - mocha: { - timeout: MOCHA_TIMEOUT_MS, - ...(process.env.MOCHA_GREP ? { grep: process.env.MOCHA_GREP } : {}), - }, + ...BASE_CONFIG, + mocha: { timeout: ASSISTED_TIMEOUT_MS, ...BASE_CONFIG.mocha }, }, ]); diff --git a/packages/rangelink-vscode-extension/.vscode-test.with-extensions.mjs b/packages/rangelink-vscode-extension/.vscode-test.with-extensions.mjs index 9d7cd2fb..177c2f2a 100644 --- a/packages/rangelink-vscode-extension/.vscode-test.with-extensions.mjs +++ b/packages/rangelink-vscode-extension/.vscode-test.with-extensions.mjs @@ -1,31 +1,17 @@ -import * as os from 'node:os'; -import * as path from 'node:path'; - import { defineConfig } from '@vscode/test-cli'; -// Same timeout as the main config — assisted tests block on human interaction. -const MOCHA_TIMEOUT_MS = 600_000; -const USER_DATA_DIR = path.join(os.tmpdir(), 'rl-vscode-test-with-ext'); +import { ASSISTED_TIMEOUT_MS, BASE_CONFIG, userDataDir } from './.vscode-test.base.mjs'; -// Extensions installed from the marketplace before tests run. -// With these present, isClaudeCodeAvailable() returns true, enabling [assisted] -// tests that verify real focus + paste behavior. +// Marketplace extensions installed before tests run. With these present, +// isClaudeCodeAvailable() returns true, enabling tests that verify real +// focus + paste behavior. const MARKETPLACE_EXTENSIONS = ['anthropic.claude-code']; export default defineConfig([ { - files: 'out/__integration-tests__/suite/**/*.test.js', - extensionDevelopmentPath: ['./', './test-fixtures/dummy-ai-extension/'], - workspaceFolder: './', - version: 'stable', + ...BASE_CONFIG, + launchArgs: userDataDir('-with-ext'), installExtensions: MARKETPLACE_EXTENSIONS, - launchArgs: ['--user-data-dir', USER_DATA_DIR], - env: { - RANGELINK_CAPTURE_LOGS: 'true', - }, - mocha: { - timeout: MOCHA_TIMEOUT_MS, - ...(process.env.MOCHA_GREP ? { grep: process.env.MOCHA_GREP } : {}), - }, + mocha: { timeout: ASSISTED_TIMEOUT_MS, ...BASE_CONFIG.mocha }, }, ]); diff --git a/packages/rangelink-vscode-extension/TESTING.md b/packages/rangelink-vscode-extension/TESTING.md index 607a7b76..a85302ea 100644 --- a/packages/rangelink-vscode-extension/TESTING.md +++ b/packages/rangelink-vscode-extension/TESTING.md @@ -13,7 +13,7 @@ | Coverage report | `pnpm test:coverage` (from extension dir) | Before PR / on demand | ✅ (with thresholds) | | Integration tests | `pnpm test:release` | Before PR, after feature work | — | | Integration (CI-safe) | `pnpm test:release:automated` | CI / headless environments | ✅ | -| Integration (extensions) | `pnpm test:release:with-extensions` | Tests needing real AI extensions | — | +| Integration (extensions) | `pnpm test:release:with-extensions` | Tests needing real AI extensions | ✅ | | Integration (filter) | `pnpm test:release:grep ""` | Run specific TCs by ID or suite | — | | Prepare QA test plan | `pnpm generate:qa-test-plan:vscode-extension` | Start of release cycle | — | | Generate QA issue | `pnpm generate:qa-issue:vscode-extension` | At the start of each release cycle | — | diff --git a/packages/rangelink-vscode-extension/scripts/test-release-run.sh b/packages/rangelink-vscode-extension/scripts/test-release-run.sh index cc9fa4f9..14c84f10 100755 --- a/packages/rangelink-vscode-extension/scripts/test-release-run.sh +++ b/packages/rangelink-vscode-extension/scripts/test-release-run.sh @@ -105,6 +105,11 @@ if [[ -n "$LABEL_FILTER" ]]; then fi fi +if [[ "$MODE" == "automated" ]] || [[ "$NO_ASSISTED" == true && -z "$GREP_PATTERN" ]]; then + export MOCHA_GREP='\[assisted\]' + export MOCHA_INVERT=true +fi + OUTPUT_DIR="$PACKAGE_ROOT/qa/output" mkdir -p "$OUTPUT_DIR" TIMESTAMP=$(date -u +"%Y%m%d-%H%M%S") @@ -141,7 +146,10 @@ pnpm test:release:prepare TEST_EXIT=0 # shellcheck disable=SC2086 -MOCHA_GREP="$GREP_PATTERN" npx vscode-test $VSCODE_TEST_CONFIG 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | tee -a "$REPORT_FILE" || TEST_EXIT=$? +if [[ -n "$GREP_PATTERN" ]]; then + export MOCHA_GREP="$GREP_PATTERN" +fi +npx vscode-test $VSCODE_TEST_CONFIG 2>&1 | sed 's/\x1b\[[0-9;]*m//g' | tee -a "$REPORT_FILE" || TEST_EXIT=$? if [[ -n "$GREP_PATTERN" && $TEST_EXIT -eq 0 ]]; then if ! grep -qE '[1-9][0-9]* passing' "$REPORT_FILE"; then From 20bea7e51147ef1c99fb57589927ef02eea26963 Mon Sep 17 00:00:00 2001 From: Charles Ouimet Date: Wed, 13 May 2026 17:24:08 -0400 Subject: [PATCH 3/6] [PR feedback] Fix MOCHA_INVERT wrongly applied to user-supplied --grep with --automated mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bash && binds tighter than ||, so the original condition evaluated as [[ "$MODE" == "automated" ]] OR ([[ "$NO_ASSISTED" == true && -z "$GREP_PATTERN" ]]). When --automated was combined with --grep, MOCHA_INVERT=true was set unconditionally and persisted after MOCHA_GREP was later overwritten with the user's pattern — inverting the user's filter and showing tests that did NOT match. Benefits: - --automated --grep "pattern" now correctly shows only tests matching the pattern - --no-assisted --grep "pattern" was already correct (its branch was guarded); now the logic is symmetric Ref: https://github.com/couimet/rangeLink/pull/564#pullrequestreview-4284848803 --- packages/rangelink-vscode-extension/scripts/test-release-run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rangelink-vscode-extension/scripts/test-release-run.sh b/packages/rangelink-vscode-extension/scripts/test-release-run.sh index 14c84f10..2298b0a4 100755 --- a/packages/rangelink-vscode-extension/scripts/test-release-run.sh +++ b/packages/rangelink-vscode-extension/scripts/test-release-run.sh @@ -105,7 +105,7 @@ if [[ -n "$LABEL_FILTER" ]]; then fi fi -if [[ "$MODE" == "automated" ]] || [[ "$NO_ASSISTED" == true && -z "$GREP_PATTERN" ]]; then +if [[ -z "$GREP_PATTERN" ]] && ([[ "$MODE" == "automated" ]] || [[ "$NO_ASSISTED" == true ]]); then export MOCHA_GREP='\[assisted\]' export MOCHA_INVERT=true fi From e09271e4cf5e02f30c3c612367d6d06a4e02d12d Mon Sep 17 00:00:00 2001 From: Charles Ouimet Date: Wed, 13 May 2026 17:29:10 -0400 Subject: [PATCH 4/6] [fix] Populate with-ext user data dir for custom AI tests in CI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit setup-integration-test-settings.js only wrote to the default user data dir (/tmp/rl-vscode-test), but the --with-extensions config uses a separate profile (/tmp/rl-vscode-test-with-ext) to avoid contaminating the default run. Custom AI tests need rangelink.customAiAssistants in VS Code settings before activation, so the with-extensions profile activated with the default empty [] — parseCustomAiAssistants returned early without logging, and 7 tests failed. Benefits: - All 7 custom AI assistant tests now pass in the with-extensions CI job - Script accepts --suffix for any future user-data-dir variants - Default behavior unchanged when no suffix is provided --- .../scripts/setup-integration-test-settings.js | 4 +++- .../rangelink-vscode-extension/scripts/test-release-run.sh | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js b/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js index c9c19a92..204c3658 100644 --- a/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js +++ b/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js @@ -13,7 +13,9 @@ const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); -const SETTINGS_DIR = path.join(os.tmpdir(), 'rl-vscode-test', 'User'); +const suffix = process.argv.includes('--suffix') ? process.argv[process.argv.indexOf('--suffix') + 1] : ''; +const DATA_DIR = `rl-vscode-test${suffix}`; +const SETTINGS_DIR = path.join(os.tmpdir(), DATA_DIR, 'User'); const SETTINGS_FILE = path.join(SETTINGS_DIR, 'settings.json'); const settings = { diff --git a/packages/rangelink-vscode-extension/scripts/test-release-run.sh b/packages/rangelink-vscode-extension/scripts/test-release-run.sh index 2298b0a4..4bdf997e 100755 --- a/packages/rangelink-vscode-extension/scripts/test-release-run.sh +++ b/packages/rangelink-vscode-extension/scripts/test-release-run.sh @@ -144,6 +144,10 @@ echo "" pnpm test:release:prepare +if [[ "$WITH_EXTENSIONS" == "true" ]]; then + node "$SCRIPT_DIR/setup-integration-test-settings.js" --suffix -with-ext +fi + TEST_EXIT=0 # shellcheck disable=SC2086 if [[ -n "$GREP_PATTERN" ]]; then From 213b9bc68a556fb5ecbf9bea076632952f45eeca Mon Sep 17 00:00:00 2001 From: Charles Ouimet Date: Wed, 13 May 2026 17:35:25 -0400 Subject: [PATCH 5/6] Ran `pnpm fix` --- .../scripts/setup-integration-test-settings.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js b/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js index 204c3658..f3d75c95 100644 --- a/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js +++ b/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js @@ -13,7 +13,9 @@ const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); -const suffix = process.argv.includes('--suffix') ? process.argv[process.argv.indexOf('--suffix') + 1] : ''; +const suffix = process.argv.includes('--suffix') + ? process.argv[process.argv.indexOf('--suffix') + 1] + : ''; const DATA_DIR = `rl-vscode-test${suffix}`; const SETTINGS_DIR = path.join(os.tmpdir(), DATA_DIR, 'User'); const SETTINGS_FILE = path.join(SETTINGS_DIR, 'settings.json'); From 1688cea6136a6a2c80fd5922bd97f9930dd1c964 Mon Sep 17 00:00:00 2001 From: Charles Ouimet Date: Wed, 13 May 2026 17:48:42 -0400 Subject: [PATCH 6/6] [PR feedback] Validate --suffix arg, replace subshell with single [[ ]] expression Two minor robustness improvements: validate that --suffix has a value before using it (prevents rl-vscode-testundefined), and replace the unnecessary subshell grouping with a single [[ ]] expression. Benefits: - setup-integration-test-settings.js fails fast with a clear error when --suffix is missing its value - Single [[ ]] avoids subshell overhead and is more readable Ignored Feedback: - Quote $VSCODE_TEST_CONFIG: The variable contains two tokens (--config flag + path). Word splitting is intentional to pass them as separate arguments. shellcheck SC2086 is already suppressed with an inline comment. Ref: https://github.com/couimet/rangeLink/pull/564#pullrequestreview-4285513449 --- .../scripts/setup-integration-test-settings.js | 9 ++++++--- .../scripts/test-release-run.sh | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js b/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js index f3d75c95..cce6e02b 100644 --- a/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js +++ b/packages/rangelink-vscode-extension/scripts/setup-integration-test-settings.js @@ -13,9 +13,12 @@ const fs = require('node:fs'); const os = require('node:os'); const path = require('node:path'); -const suffix = process.argv.includes('--suffix') - ? process.argv[process.argv.indexOf('--suffix') + 1] - : ''; +const suffixIndex = process.argv.indexOf('--suffix'); +if (suffixIndex !== -1 && !process.argv[suffixIndex + 1]) { + console.error('Error: --suffix requires a value'); + process.exit(1); +} +const suffix = suffixIndex !== -1 ? process.argv[suffixIndex + 1] : ''; const DATA_DIR = `rl-vscode-test${suffix}`; const SETTINGS_DIR = path.join(os.tmpdir(), DATA_DIR, 'User'); const SETTINGS_FILE = path.join(SETTINGS_DIR, 'settings.json'); diff --git a/packages/rangelink-vscode-extension/scripts/test-release-run.sh b/packages/rangelink-vscode-extension/scripts/test-release-run.sh index 4bdf997e..4182a2d5 100755 --- a/packages/rangelink-vscode-extension/scripts/test-release-run.sh +++ b/packages/rangelink-vscode-extension/scripts/test-release-run.sh @@ -105,7 +105,7 @@ if [[ -n "$LABEL_FILTER" ]]; then fi fi -if [[ -z "$GREP_PATTERN" ]] && ([[ "$MODE" == "automated" ]] || [[ "$NO_ASSISTED" == true ]]); then +if [[ -z "$GREP_PATTERN" && ( "$MODE" == "automated" || "$NO_ASSISTED" == true ) ]]; then export MOCHA_GREP='\[assisted\]' export MOCHA_INVERT=true fi