Disallow rename/copy/delete on unshared files (#40540)

Release Notes:

- Disallow rename/delete/copy on unshared files

Co-Authored-By: Cole <cole@zed.dev>
This commit is contained in:
Conrad Irwin
2025-10-17 22:33:08 +00:00
committed by GitHub
co-authored by Cole
parent 1e69e5d844
commit 63e719fadf
2 changed files with 37 additions and 4 deletions
+32 -1
View File
@@ -5,7 +5,7 @@ use std::{
sync::{Arc, atomic::AtomicUsize},
};
use anyhow::{Context as _, Result, anyhow};
use anyhow::{Context as _, Result, anyhow, bail};
use collections::{HashMap, HashSet};
use fs::{Fs, copy_recursive};
use futures::{
@@ -1203,6 +1203,16 @@ impl WorktreeStore {
RelPath::from_proto(&envelope.payload.new_path)?,
);
let (scan_id, entry) = this.update(&mut cx, |this, cx| {
let Some((_, project_id)) = this.downstream_client else {
bail!("no downstream client")
};
let Some(entry) = this.entry_for_id(entry_id, cx) else {
bail!("no such entry");
};
if entry.is_private && project_id != REMOTE_SERVER_PROJECT_ID {
bail!("entry is private")
}
let new_worktree = this
.worktree_for_id(new_worktree_id, cx)
.context("no such worktree")?;
@@ -1226,6 +1236,15 @@ impl WorktreeStore {
) -> Result<proto::ProjectEntryResponse> {
let entry_id = ProjectEntryId::from_proto(envelope.payload.entry_id);
let worktree = this.update(&mut cx, |this, cx| {
let Some((_, project_id)) = this.downstream_client else {
bail!("no downstream client")
};
let Some(entry) = this.entry_for_id(entry_id, cx) else {
bail!("no entry")
};
if entry.is_private && project_id != REMOTE_SERVER_PROJECT_ID {
bail!("entry is private")
}
this.worktree_for_entry(entry_id, cx)
.context("worktree not found")
})??;
@@ -1246,6 +1265,18 @@ impl WorktreeStore {
let worktree = this
.worktree_for_entry(entry_id, cx)
.context("no such worktree")?;
let Some((_, project_id)) = this.downstream_client else {
bail!("no downstream client")
};
let entry = worktree
.read(cx)
.entry_for_id(entry_id)
.ok_or_else(|| anyhow!("missing entry"))?;
if entry.is_private && project_id != REMOTE_SERVER_PROJECT_ID {
bail!("entry is private")
}
let scan_id = worktree.read(cx).scan_id();
anyhow::Ok((
scan_id,
+5 -3
View File
@@ -64,7 +64,7 @@ use workspace::{
DraggedSelection, OpenInTerminal, OpenOptions, OpenVisible, PreviewTabsSettings, SelectedEntry,
SplitDirection, Workspace,
dock::{DockPosition, Panel, PanelEvent},
notifications::{DetachAndPromptErr, NotifyTaskExt},
notifications::{DetachAndPromptErr, NotifyResultExt, NotifyTaskExt},
};
use worktree::CreatedEntry;
use zed_actions::workspace::OpenWithSystem;
@@ -2677,12 +2677,14 @@ impl ProjectPanel {
for task in paste_tasks {
match task {
PasteTask::Rename(task) => {
if let Some(CreatedEntry::Included(entry)) = task.await.log_err() {
if let Some(CreatedEntry::Included(entry)) =
task.await.notify_async_err(cx)
{
last_succeed = Some(entry);
}
}
PasteTask::Copy(task) => {
if let Some(Some(entry)) = task.await.log_err() {
if let Some(Some(entry)) = task.await.notify_async_err(cx) {
last_succeed = Some(entry);
}
}