Zed Improved. Aiming to improve upon Zed and make a truly delightful code editor.
https://zed.dev
![]() ## Problem When developing extensions locally, developers will commonly put their source code in a specific directory. Zed uses this directory to create a symlink starting from `$HOME/Library/Application Support/Zed/extensions/installed` (MacOS path). When a developer then moves this source code and tries to reinstall the extension, Zed will fail with an unhelpful message (you can check the #Testing section). ## Change Summary With this PR, we fix this behaviour by handling broken symlinks specifically when returning the metadata on `fs::metadata`. Today, we 1. Pull the symlink metadata. 2. Return it if the file was not a symlink OR if it is, pull the metadata for the pointed file. After this change gets merged, we return the Symlink metadata if the symlink is broken. This makes the symlink be recreated since we remove the symlink either way. ## Risks associated with this change It's possible changing this behaviour will show additional cases where we are handling broken symlinks incorrectly. I expect this to be a better scenario AND backwards compatible. We have the same behaviour we had for 1. existing symlinks 2. normal files. ## Testing The way I have been reproducing this is by having a private extension of my own. I install it using the `zed: install dev extension` command after running `RUST_LOG=debug RUST_BACKTRACE=1 scripts/zed-local -1`. Then I move the extension to a different directory. Zed will now keeps a broken link on its `installed` directory: ``` ❯ ll Permissions Size User Date Modified Name lrwxr-xr-x@ - enrikes 24 Dec 12:15 brazil-config-zed-extension -> /Volumes/workplace/BrazilConfigZedExtension drwxr-xr-x@ - enrikes 5 Dec 14:48 java drwxr-xr-x@ - enrikes 12 Dec 13:04 kotlin drwxr-xr-x@ - enrikes 25 Oct 08:13 rose-pine-theme ``` Before the patch, Zed shows on its logs: ``` 2024-12-24T16:44:02+01:00 INFO extension::extension_builder] compiled Rust extension /Users/enrikes/Documents/BrazilConfigZedExtension [2024-12-24T16:44:02+01:00 INFO extension::extension_builder] compiling grammar brazil_config for extension /Users/enrikes/Documents/BrazilConfigZedExtension [2024-12-24T16:44:02+01:00 INFO extension::extension_builder] checking out brazil_config parser [2024-12-24T16:44:04+01:00 INFO extension::extension_builder] compiling brazil_config parser [2024-12-24T16:44:05+01:00 INFO extension::extension_builder] compiled grammar brazil_config for extension /Users/enrikes/Documents/BrazilConfigZedExtension [2024-12-24T16:44:05+01:00 INFO extension::extension_builder] finished compiling extension /Users/enrikes/Documents/BrazilConfigZedExtension [2024-12-24T16:44:05+01:00 ERROR extensions_ui] No such file or directory (os error 2) Stack backtrace: 0: std::backtrace_rs::backtrace::libunwind::trace at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/../../backtrace/src/backtrace/libunwind.rs:116:5 1: std::backtrace_rs::backtrace::trace_unsynchronized at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5 2: std::backtrace::Backtrace::create at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/backtrace.rs:331:13 3: anyhow::error::<impl core::convert::From<E> for anyhow::Error>::from at /Users/enrikes/.cargo/registry/src/index.crates.io-6f17d22bba15001f/anyhow-1.0.94/src/backtrace.rs:27:14 4: <core::result::Result<T,F> as core::ops::try_trait::FromResidual<core::result::Result<core::convert::Infallible,E>>>::from_residual at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/result.rs:1989:27 5: <fs::RealFs as fs::Fs>::metadata::{{closure}} at ./crates/fs/src/fs.rs:603:13 ``` After the patch, the extension is installed and the symlink replaced for a new one pointing to the user's directory choice. ``` 2024-12-24T16:53:33.916022+01:00 [INFO] compiled Rust extension /Users/enrikes/Documents/BrazilConfigZedExtension 2024-12-24T16:53:33.916094+01:00 [INFO] compiling grammar brazil_config for extension /Users/enrikes/Documents/BrazilConfigZedExtension 2024-12-24T16:53:33.916225+01:00 [INFO] checking out brazil_config parser 2024-12-24T16:53:35.481602+01:00 [INFO] compiling brazil_config parser 2024-12-24T16:53:35.964189+01:00 [INFO] compiled grammar brazil_config for extension /Users/enrikes/Documents/BrazilConfigZedExtension 2024-12-24T16:53:35.964319+01:00 [INFO] finished compiling extension /Users/enrikes/Documents/BrazilConfigZedExtension 2024-12-24T16:53:36.213608+01:00 [INFO] rebuilt extension index in 39.108542ms 2024-12-24T16:53:36.213835+01:00 [INFO] extensions updated. loading 0, reloading 1, unloading 0 2024-12-24T16:53:36.375928+01:00 [INFO] rebuilt extension index in 34.478167ms 2024-12-24T16:53:36.376054+01:00 [INFO] extensions updated. loading 0, reloading 1, unloading 0 ``` and ``` ❯ ll lrwxr-xr-x@ - enrikes 24 Dec 16:53 brazil-config-zed-extension -> /Users/enrikes/Documents/BrazilConfigZedExtension drwxr-xr-x@ - enrikes 5 Dec 14:48 java drwxr-xr-x@ - enrikes 12 Dec 13:04 kotlin drwxr-xr-x@ - enrikes 25 Oct 08:13 rose-pine-theme ``` Release Notes: - Fix broken symlinks when installing dev extensions --------- Co-authored-by: Mikayla Maki <mikayla@zed.dev> |
||
---|---|---|
.cargo | ||
.cloudflare | ||
.config | ||
.github | ||
.zed | ||
assets | ||
crates | ||
docs | ||
extensions | ||
legal | ||
nix | ||
script | ||
tooling/xtask | ||
.git-blame-ignore-revs | ||
.gitattributes | ||
.gitignore | ||
.mailmap | ||
Cargo.lock | ||
Cargo.toml | ||
clippy.toml | ||
CODE_OF_CONDUCT.md | ||
compose.yml | ||
CONTRIBUTING.md | ||
Cross.toml | ||
debug.plist | ||
default.nix | ||
docker-compose.sql | ||
Dockerfile-collab | ||
Dockerfile-collab.dockerignore | ||
Dockerfile-cross | ||
Dockerfile-cross.dockerignore | ||
Dockerfile-distros | ||
Dockerfile-distros.dockerignore | ||
flake.lock | ||
flake.nix | ||
LICENSE-AGPL | ||
LICENSE-APACHE | ||
LICENSE-GPL | ||
livekit.yaml | ||
Procfile | ||
Procfile.postgrest | ||
README.md | ||
renovate.json | ||
rust-toolchain.toml | ||
shell.nix | ||
typos.toml |
Zed
Welcome to Zed, a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
Installation
On macOS and Linux you can download Zed directly or install Zed via your local package manager.
Other platforms are not yet available:
- Windows (tracking issue)
- Web (tracking issue)
Developing Zed
- Building Zed for macOS
- Building Zed for Linux
- Building Zed for Windows
- Running Collaboration Locally
Contributing
See CONTRIBUTING.md for ways you can contribute to Zed.
Also... we're hiring! Check out our jobs page for open roles.
Licensing
License information for third party dependencies must be correctly provided for CI to pass.
We use cargo-about
to automatically comply with open source licenses. If CI is failing, check the following:
- Is it showing a
no license specified
error for a crate you've created? If so, addpublish = false
under[package]
in your crate's Cargo.toml. - Is the error
failed to satisfy license requirements
for a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to theaccepted
array inscript/licenses/zed-licenses.toml
. - Is
cargo-about
unable to find the license for a dependency? If so, add a clarification field at the end ofscript/licenses/zed-licenses.toml
, as specified in the cargo-about book.