diff options
| author | matt korwel <[email protected]> | 2025-06-09 12:19:42 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-06-09 12:19:42 -0700 |
| commit | 3b943c1582026bdf65feb13a73259ce0e034ab2f (patch) | |
| tree | 3368aa85053b8599fe1fb1349383736890ea73e0 /scripts/sandbox_command.js | |
| parent | 2182a1cd2cb83071b9defad2314a689d773363e7 (diff) | |
Windows: Refactor Shell Scripts to Node.js for Cross-Platform Compatibility (#784)
Diffstat (limited to 'scripts/sandbox_command.js')
| -rw-r--r-- | scripts/sandbox_command.js | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/scripts/sandbox_command.js b/scripts/sandbox_command.js new file mode 100644 index 00000000..7f8e8381 --- /dev/null +++ b/scripts/sandbox_command.js @@ -0,0 +1,126 @@ +/** + * @license + * Copyright 2025 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { execSync } from 'child_process'; +import { existsSync, readFileSync } from 'fs'; +import { join, dirname } from 'path'; +import os from 'os'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; +import dotenv from 'dotenv'; + +const argv = yargs(hideBin(process.argv)).option('q', { + alias: 'quiet', + type: 'boolean', + default: false, +}).argv; + +let geminiSandbox = process.env.GEMINI_SANDBOX; + +if (!geminiSandbox) { + const userSettingsFile = join(os.homedir(), '.gemini', 'settings.json'); + if (existsSync(userSettingsFile)) { + const settings = JSON.parse(readFileSync(userSettingsFile, 'utf-8')); + if (settings.sandbox) { + geminiSandbox = settings.sandbox; + } + } +} + +if (!geminiSandbox) { + let currentDir = process.cwd(); + while (currentDir !== '/') { + const geminiEnv = join(currentDir, '.gemini', '.env'); + const regularEnv = join(currentDir, '.env'); + if (existsSync(geminiEnv)) { + dotenv.config({ path: geminiEnv }); + break; + } else if (existsSync(regularEnv)) { + dotenv.config({ path: regularEnv }); + break; + } + currentDir = dirname(currentDir); + } + geminiSandbox = process.env.GEMINI_SANDBOX; +} + +if (process.env.GEMINI_CODE_SANDBOX) { + console.warn( + 'WARNING: GEMINI_CODE_SANDBOX is deprecated. Use GEMINI_SANDBOX instead.', + ); + geminiSandbox = process.env.GEMINI_CODE_SANDBOX; +} + +geminiSandbox = (geminiSandbox || '').toLowerCase(); + +const commandExists = (cmd) => { + const checkCommand = os.platform() === 'win32' ? 'where' : 'command -v'; + try { + execSync(`${checkCommand} ${cmd}`, { stdio: 'ignore' }); + return true; + } catch { + if (os.platform() === 'win32') { + try { + execSync(`${checkCommand} ${cmd}.exe`, { stdio: 'ignore' }); + return true; + } catch { + return false; + } + } + return false; + } +}; + +let command = ''; +if (['1', 'true'].includes(geminiSandbox)) { + if (commandExists('docker')) { + command = 'docker'; + } else if (commandExists('podman')) { + command = 'podman'; + } else { + console.error( + 'ERROR: install docker or podman or specify command in GEMINI_SANDBOX', + ); + process.exit(1); + } +} else if (geminiSandbox && !['0', 'false'].includes(geminiSandbox)) { + if (commandExists(geminiSandbox)) { + command = geminiSandbox; + } else { + console.error( + `ERROR: missing sandbox command '${geminiSandbox}' (from GEMINI_SANDBOX)`, + ); + process.exit(1); + } +} else { + if (os.platform() === 'darwin' && process.env.SEATBELT_PROFILE !== 'none') { + if (commandExists('sandbox-exec')) { + command = 'sandbox-exec'; + } else { + process.exit(1); + } + } else { + process.exit(1); + } +} + +if (!argv.q) { + console.log(command); +} +process.exit(0); |
