mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-12 21:32:40 +00:00
worktree: Fix privacy check for singleton files (#21861)
Closes #20676 Release Notes: - Fixed private files not being redacted when not part of a larger worktree
This commit is contained in:
parent
59afc27f03
commit
cc97e682d5
3 changed files with 41 additions and 20 deletions
|
@ -427,11 +427,6 @@ pub trait LocalFile: File {
|
||||||
|
|
||||||
/// Loads the file's contents from disk.
|
/// Loads the file's contents from disk.
|
||||||
fn load_bytes(&self, cx: &AppContext) -> Task<Result<Vec<u8>>>;
|
fn load_bytes(&self, cx: &AppContext) -> Task<Result<Vec<u8>>>;
|
||||||
|
|
||||||
/// Returns true if the file should not be shared with collaborators.
|
|
||||||
fn is_private(&self, _: &AppContext) -> bool {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The auto-indent behavior associated with an editing operation.
|
/// The auto-indent behavior associated with an editing operation.
|
||||||
|
|
|
@ -409,24 +409,11 @@ impl Worktree {
|
||||||
abs_path
|
abs_path
|
||||||
.file_name()
|
.file_name()
|
||||||
.map_or(String::new(), |f| f.to_string_lossy().to_string()),
|
.map_or(String::new(), |f| f.to_string_lossy().to_string()),
|
||||||
abs_path,
|
abs_path.clone(),
|
||||||
),
|
),
|
||||||
root_file_handle,
|
root_file_handle,
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(metadata) = metadata {
|
|
||||||
snapshot.insert_entry(
|
|
||||||
Entry::new(
|
|
||||||
Arc::from(Path::new("")),
|
|
||||||
&metadata,
|
|
||||||
&next_entry_id,
|
|
||||||
snapshot.root_char_bag,
|
|
||||||
None,
|
|
||||||
),
|
|
||||||
fs.as_ref(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let worktree_id = snapshot.id();
|
let worktree_id = snapshot.id();
|
||||||
let settings_location = Some(SettingsLocation {
|
let settings_location = Some(SettingsLocation {
|
||||||
worktree_id,
|
worktree_id,
|
||||||
|
@ -445,10 +432,26 @@ impl Worktree {
|
||||||
})
|
})
|
||||||
.detach();
|
.detach();
|
||||||
|
|
||||||
|
let share_private_files = false;
|
||||||
|
if let Some(metadata) = metadata {
|
||||||
|
let mut entry = Entry::new(
|
||||||
|
Arc::from(Path::new("")),
|
||||||
|
&metadata,
|
||||||
|
&next_entry_id,
|
||||||
|
snapshot.root_char_bag,
|
||||||
|
None,
|
||||||
|
);
|
||||||
|
if !metadata.is_dir {
|
||||||
|
entry.is_private = !share_private_files
|
||||||
|
&& settings.is_path_private(abs_path.file_name().unwrap().as_ref());
|
||||||
|
}
|
||||||
|
snapshot.insert_entry(entry, fs.as_ref());
|
||||||
|
}
|
||||||
|
|
||||||
let (scan_requests_tx, scan_requests_rx) = channel::unbounded();
|
let (scan_requests_tx, scan_requests_rx) = channel::unbounded();
|
||||||
let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = channel::unbounded();
|
let (path_prefixes_to_scan_tx, path_prefixes_to_scan_rx) = channel::unbounded();
|
||||||
let mut worktree = LocalWorktree {
|
let mut worktree = LocalWorktree {
|
||||||
share_private_files: false,
|
share_private_files,
|
||||||
next_entry_id,
|
next_entry_id,
|
||||||
snapshot,
|
snapshot,
|
||||||
is_scanning: watch::channel_with(true),
|
is_scanning: watch::channel_with(true),
|
||||||
|
|
|
@ -2712,6 +2712,29 @@ async fn test_propagate_git_statuses(cx: &mut TestAppContext) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_private_single_file_worktree(cx: &mut TestAppContext) {
|
||||||
|
init_test(cx);
|
||||||
|
let fs = FakeFs::new(cx.background_executor.clone());
|
||||||
|
fs.insert_tree("/", json!({".env": "PRIVATE=secret\n"}))
|
||||||
|
.await;
|
||||||
|
let tree = Worktree::local(
|
||||||
|
Path::new("/.env"),
|
||||||
|
true,
|
||||||
|
fs.clone(),
|
||||||
|
Default::default(),
|
||||||
|
&mut cx.to_async(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
cx.read(|cx| tree.read(cx).as_local().unwrap().scan_complete())
|
||||||
|
.await;
|
||||||
|
tree.read_with(cx, |tree, _| {
|
||||||
|
let entry = tree.entry_for_path("").unwrap();
|
||||||
|
assert!(entry.is_private);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn check_propagated_statuses(
|
fn check_propagated_statuses(
|
||||||
snapshot: &Snapshot,
|
snapshot: &Snapshot,
|
||||||
|
|
Loading…
Reference in a new issue