fix(desktop): strip AppImage ARGV0 before child shells (#2588)
AppImage exports ARGV0 into the process environment. zsh treats that as argv[0] for every external command, which broke Python venv detection in the integrated terminal and managed OpenCode sessions. Clear ARGV0 in Electron before login-shell probing, refuse to re-apply it from shell snapshots, and strip it from terminal PTY and managed OpenCode launch environments. Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
This commit is contained in:
co-authored by
Serhii Dziupin
parent
2ba8ae8bd4
commit
be38fb8cf4
@@ -85,6 +85,8 @@ After packaging, run `bun run --cwd packages/electron verify:linux-appimage`. Th
|
||||
|
||||
Running a packaged Linux AppImage requires FUSE (`libfuse.so.2`, typically `libfuse2` / `libfuse2t64` on Debian/Ubuntu). Without FUSE, start with `APPIMAGE_EXTRACT_AND_RUN=1`. Keep the AppImage on a writable path so in-app updates can replace it.
|
||||
|
||||
Desktop clears AppImage `ARGV0` from `process.env` before probing the login shell and starting the in-process server. Leaving it set makes zsh rewrite argv[0] for integrated-terminal and managed-OpenCode child commands to the AppImage path.
|
||||
|
||||
Linux updates are supported only when the packaged app is running from a writable AppImage. Update checks, downloads, and installation report an actionable error when `APPIMAGE` is missing, invalid, or read-only; a missing release feed (`latest-linux.yml` 404 before the first Linux publish) is treated as “no update available”. macOS and Windows updater behavior is unchanged. Release builds keep `latest-linux.yml` (x64) and `latest-linux-arm64.yml` separate and validate each manifest against its AppImage before upload. Linux AppImages download full updates (no `.blockmap` differential channel yet).
|
||||
|
||||
### Updater End-to-End Fixture
|
||||
|
||||
@@ -1374,11 +1374,16 @@ const loadShellEnv = () => {
|
||||
|
||||
// Merge the user's login-shell env (PATH, etc.) into this process before we
|
||||
import { pathLooksUserConfigured, mergePathValues } from '@openchamber/web/server/lib/opencode/path-utils.js';
|
||||
import { stripAppImageArgv0Leak } from '@openchamber/web/server/lib/inherited-env.js';
|
||||
|
||||
// import/start the server in-process. The server and its children (opencode
|
||||
// CLI, git, etc.) inherit process.env directly now — there is no sidecar
|
||||
// subprocess to hand a custom env to.
|
||||
const inheritUserShellEnv = () => {
|
||||
// Clear before probing/merging so login-shell snapshots and children never
|
||||
// inherit the AppImage path as argv[0] via zsh's ARGV0 parameter (#2588).
|
||||
stripAppImageArgv0Leak(process.env);
|
||||
|
||||
const shellEnv = loadShellEnv();
|
||||
if (!shellEnv) return;
|
||||
|
||||
@@ -1388,7 +1393,7 @@ const inheritUserShellEnv = () => {
|
||||
const currentPathLooksUserConfigured = pathLooksUserConfigured(currentPath, homeDir, delimiter);
|
||||
|
||||
for (const [key, value] of Object.entries(shellEnv)) {
|
||||
if (key === 'PATH') continue;
|
||||
if (key === 'PATH' || key === 'ARGV0') continue;
|
||||
if (typeof process.env[key] === 'undefined') {
|
||||
process.env[key] = value;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user