mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-12 21:32:40 +00:00
204af9cac5
Closes #21406 Context: A few weeks ago on Linux, we resolved an [issue](https://github.com/zed-industries/zed/issues/20070) where users could not open more than one file from the file explorer. This was fixed by replacing `zed-editor` (zed binary in the code) with `zed` (cli binary in the code) in the `.desktop` file. The reason for this change was that using the cli to open files is more convenient - it determines weather to spawn a new Zed instance or use an existing one, if we use main binary instead it would throw error `Zed is already running`. You can read the complete PR here: [linux: Fix file not opening from file explorer](https://github.com/zed-industries/zed/pull/21137). While this fix resolved the original issue, it introduced a new one. Problem: When the cli binary is used, it assumes it is always being invoked from a terminal and relies on `std::env::vars()` to retrieve the environment variables needed to spawn Zed. These env vars are then passed to the worktree, and eventually, languages use the `PATH` from this env to find binaries. This leads to the "Failed to start language server" error when the `.desktop` entry is used on Linux. Solution: When the `zed-editor` binary is used, it uses some clever Unix-specific logic to retrieve the default shell (`load_shell_from_passwd`) and then fetch the env vars from that shell (`load_login_shell_environment`). This same logic should be used in the cli binary when it is invoked via a `.desktop` entry rather than from a terminal. Approach: I moved these two functions mentioned above to a utils file and reused them in cli binary to fetch env vars only on Linux when it is not run from a terminal. This provides missing paths, and fix the issue. It is also possible to handle this in the `zed-editor` binary by modifying the logic in `handle_cli_connection`, where `CliRequest::Open` is processed. There we can discard incoming env, and use our logic. But discarding incoming envs felt weird, and I thought it's better to handle this at source. Release Notes: - Fixed `Failed to start language server` errors when starting from dekstop entry on Linux
49 lines
994 B
TOML
49 lines
994 B
TOML
[package]
|
|
name = "util"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
publish = false
|
|
license = "Apache-2.0"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
path = "src/util.rs"
|
|
doctest = true
|
|
|
|
[features]
|
|
test-support = ["tempfile", "git2", "rand"]
|
|
|
|
[dependencies]
|
|
anyhow.workspace = true
|
|
async-fs.workspace = true
|
|
collections.workspace = true
|
|
dirs.workspace = true
|
|
futures-lite.workspace = true
|
|
futures.workspace = true
|
|
git2 = { workspace = true, optional = true }
|
|
globset.workspace = true
|
|
itertools.workspace = true
|
|
log.workspace = true
|
|
rand = { workspace = true, optional = true }
|
|
regex.workspace = true
|
|
rust-embed.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
smol.workspace = true
|
|
take-until = "0.2.0"
|
|
tempfile = { workspace = true, optional = true }
|
|
unicase.workspace = true
|
|
|
|
[target.'cfg(unix)'.dependencies]
|
|
libc.workspace = true
|
|
|
|
[target.'cfg(windows)'.dependencies]
|
|
tendril = "0.4.3"
|
|
dunce = "1.0"
|
|
|
|
[dev-dependencies]
|
|
git2.workspace = true
|
|
rand.workspace = true
|
|
tempfile.workspace = true
|