Add a picker for jj bookmark list (#30883)

This PR adds a new picker for viewing a list of jj bookmarks, like you
would with `jj bookmark list`.

This is an exploration around what it would look like to begin adding
some dedicated jj features to Zed.

This is behind the `jj-ui` feature flag.

Release Notes:

- N/A
This commit is contained in:
Marshall Bowers 2025-05-17 18:42:45 +02:00 committed by GitHub
parent 122d6c9e4d
commit dd3956eaf1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 1644 additions and 152 deletions

1332
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -74,6 +74,8 @@ members = [
"crates/inline_completion",
"crates/inline_completion_button",
"crates/install_cli",
"crates/jj",
"crates/jj_ui",
"crates/journal",
"crates/language",
"crates/language_extension",
@ -279,6 +281,8 @@ indexed_docs = { path = "crates/indexed_docs" }
inline_completion = { path = "crates/inline_completion" }
inline_completion_button = { path = "crates/inline_completion_button" }
install_cli = { path = "crates/install_cli" }
jj = { path = "crates/jj" }
jj_ui = { path = "crates/jj_ui" }
journal = { path = "crates/journal" }
language = { path = "crates/language" }
language_extension = { path = "crates/language_extension" }
@ -458,6 +462,7 @@ indexmap = { version = "2.7.0", features = ["serde"] }
indoc = "2"
inventory = "0.3.19"
itertools = "0.14.0"
jj-lib = { git = "https://github.com/jj-vcs/jj", rev = "e18eb8e05efaa153fad5ef46576af145bba1807f" }
jsonschema = "0.30.0"
jsonwebtoken = "9.3"
jupyter-protocol = { git = "https://github.com/ConradIrwin/runtimed", rev = "7130c804216b6914355d15d0b91ea91f6babd734" }

View file

@ -91,6 +91,12 @@ impl FeatureFlag for ThreadAutoCaptureFeatureFlag {
}
}
pub struct JjUiFeatureFlag {}
impl FeatureFlag for JjUiFeatureFlag {
const NAME: &'static str = "jj-ui";
}
pub trait FeatureFlagViewExt<V: 'static> {
fn observe_flag<T: FeatureFlag, F>(&mut self, window: &Window, callback: F) -> Subscription
where

18
crates/jj/Cargo.toml Normal file
View file

@ -0,0 +1,18 @@
[package]
name = "jj"
version = "0.1.0"
publish.workspace = true
edition.workspace = true
license = "GPL-3.0-or-later"
[lints]
workspace = true
[lib]
path = "src/jj.rs"
[dependencies]
anyhow.workspace = true
gpui.workspace = true
jj-lib.workspace = true
workspace-hack.workspace = true

1
crates/jj/LICENSE-GPL Symbolic link
View file

@ -0,0 +1 @@
../../LICENSE-GPL

5
crates/jj/src/jj.rs Normal file
View file

@ -0,0 +1,5 @@
mod jj_repository;
mod jj_store;
pub use jj_repository::*;
pub use jj_store::*;

View file

@ -0,0 +1,72 @@
use std::path::Path;
use std::sync::Arc;
use anyhow::Result;
use gpui::SharedString;
use jj_lib::config::StackedConfig;
use jj_lib::repo::StoreFactories;
use jj_lib::settings::UserSettings;
use jj_lib::workspace::{self, DefaultWorkspaceLoaderFactory, WorkspaceLoaderFactory};
#[derive(Debug, Clone)]
pub struct Bookmark {
pub ref_name: SharedString,
}
pub trait JujutsuRepository: Send + Sync {
fn list_bookmarks(&self) -> Vec<Bookmark>;
}
pub struct RealJujutsuRepository {
repository: Arc<jj_lib::repo::ReadonlyRepo>,
}
impl RealJujutsuRepository {
pub fn new(cwd: &Path) -> Result<Self> {
let workspace_loader_factory = DefaultWorkspaceLoaderFactory;
let workspace_loader = workspace_loader_factory.create(Self::find_workspace_dir(cwd))?;
let config = StackedConfig::with_defaults();
let settings = UserSettings::from_config(config)?;
let workspace = workspace_loader.load(
&settings,
&StoreFactories::default(),
&workspace::default_working_copy_factories(),
)?;
let repo_loader = workspace.repo_loader();
let repository = repo_loader.load_at_head()?;
Ok(Self { repository })
}
fn find_workspace_dir(cwd: &Path) -> &Path {
cwd.ancestors()
.find(|path| path.join(".jj").is_dir())
.unwrap_or(cwd)
}
}
impl JujutsuRepository for RealJujutsuRepository {
fn list_bookmarks(&self) -> Vec<Bookmark> {
let bookmarks = self
.repository
.view()
.bookmarks()
.map(|(ref_name, _target)| Bookmark {
ref_name: ref_name.as_str().to_string().into(),
})
.collect();
bookmarks
}
}
pub struct FakeJujutsuRepository {}
impl JujutsuRepository for FakeJujutsuRepository {
fn list_bookmarks(&self) -> Vec<Bookmark> {
Vec::new()
}
}

41
crates/jj/src/jj_store.rs Normal file
View file

@ -0,0 +1,41 @@
use std::path::Path;
use std::sync::Arc;
use gpui::{App, Entity, Global, prelude::*};
use crate::{JujutsuRepository, RealJujutsuRepository};
/// Note: We won't ultimately be storing the jj store in a global, we're just doing this for exploration purposes.
struct GlobalJujutsuStore(Entity<JujutsuStore>);
impl Global for GlobalJujutsuStore {}
pub struct JujutsuStore {
repository: Arc<dyn JujutsuRepository>,
}
impl JujutsuStore {
pub fn init_global(cx: &mut App) {
let Some(repository) = RealJujutsuRepository::new(&Path::new(".")).ok() else {
return;
};
let repository = Arc::new(repository);
let jj_store = cx.new(|cx| JujutsuStore::new(repository, cx));
cx.set_global(GlobalJujutsuStore(jj_store));
}
pub fn try_global(cx: &App) -> Option<Entity<Self>> {
cx.try_global::<GlobalJujutsuStore>()
.map(|global| global.0.clone())
}
pub fn new(repository: Arc<dyn JujutsuRepository>, _cx: &mut Context<Self>) -> Self {
Self { repository }
}
pub fn repository(&self) -> &Arc<dyn JujutsuRepository> {
&self.repository
}
}

25
crates/jj_ui/Cargo.toml Normal file
View file

@ -0,0 +1,25 @@
[package]
name = "jj_ui"
version = "0.1.0"
publish.workspace = true
edition.workspace = true
license = "GPL-3.0-or-later"
[lints]
workspace = true
[lib]
path = "src/jj_ui.rs"
[dependencies]
command_palette_hooks.workspace = true
feature_flags.workspace = true
fuzzy.workspace = true
gpui.workspace = true
jj.workspace = true
picker.workspace = true
ui.workspace = true
util.workspace = true
workspace-hack.workspace = true
workspace.workspace = true
zed_actions.workspace = true

1
crates/jj_ui/LICENSE-GPL Symbolic link
View file

@ -0,0 +1 @@
../../LICENSE-GPL

View file

@ -0,0 +1,197 @@
use std::sync::Arc;
use fuzzy::{StringMatchCandidate, match_strings};
use gpui::{
App, DismissEvent, Entity, EventEmitter, FocusHandle, Focusable, Task, WeakEntity, Window,
prelude::*,
};
use jj::{Bookmark, JujutsuStore};
use picker::{Picker, PickerDelegate};
use ui::{HighlightedLabel, ListItem, ListItemSpacing, prelude::*};
use util::ResultExt as _;
use workspace::{ModalView, Workspace};
pub fn register(workspace: &mut Workspace) {
workspace.register_action(open);
}
fn open(
workspace: &mut Workspace,
_: &zed_actions::jj::BookmarkList,
window: &mut Window,
cx: &mut Context<Workspace>,
) {
let Some(jj_store) = JujutsuStore::try_global(cx) else {
return;
};
workspace.toggle_modal(window, cx, |window, cx| {
let delegate = BookmarkPickerDelegate::new(cx.entity().downgrade(), jj_store, cx);
BookmarkPicker::new(delegate, window, cx)
});
}
pub struct BookmarkPicker {
picker: Entity<Picker<BookmarkPickerDelegate>>,
}
impl BookmarkPicker {
pub fn new(
delegate: BookmarkPickerDelegate,
window: &mut Window,
cx: &mut Context<Self>,
) -> Self {
let picker = cx.new(|cx| Picker::uniform_list(delegate, window, cx));
Self { picker }
}
}
impl ModalView for BookmarkPicker {}
impl EventEmitter<DismissEvent> for BookmarkPicker {}
impl Focusable for BookmarkPicker {
fn focus_handle(&self, cx: &App) -> FocusHandle {
self.picker.focus_handle(cx)
}
}
impl Render for BookmarkPicker {
fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
v_flex().w(rems(34.)).child(self.picker.clone())
}
}
#[derive(Debug, Clone)]
struct BookmarkEntry {
bookmark: Bookmark,
positions: Vec<usize>,
}
pub struct BookmarkPickerDelegate {
picker: WeakEntity<BookmarkPicker>,
matches: Vec<BookmarkEntry>,
all_bookmarks: Vec<Bookmark>,
selected_index: usize,
}
impl BookmarkPickerDelegate {
fn new(
picker: WeakEntity<BookmarkPicker>,
jj_store: Entity<JujutsuStore>,
cx: &mut Context<BookmarkPicker>,
) -> Self {
let bookmarks = jj_store.read(cx).repository().list_bookmarks();
Self {
picker,
matches: Vec::new(),
all_bookmarks: bookmarks,
selected_index: 0,
}
}
}
impl PickerDelegate for BookmarkPickerDelegate {
type ListItem = ListItem;
fn placeholder_text(&self, _window: &mut Window, _cx: &mut App) -> Arc<str> {
"Select Bookmark…".into()
}
fn match_count(&self) -> usize {
self.matches.len()
}
fn selected_index(&self) -> usize {
self.selected_index
}
fn set_selected_index(
&mut self,
ix: usize,
_window: &mut Window,
_cx: &mut Context<Picker<Self>>,
) {
self.selected_index = ix;
}
fn update_matches(
&mut self,
query: String,
window: &mut Window,
cx: &mut Context<Picker<Self>>,
) -> Task<()> {
let background = cx.background_executor().clone();
let all_bookmarks = self.all_bookmarks.clone();
cx.spawn_in(window, async move |this, cx| {
let matches = if query.is_empty() {
all_bookmarks
.into_iter()
.map(|bookmark| BookmarkEntry {
bookmark,
positions: Vec::new(),
})
.collect()
} else {
let candidates = all_bookmarks
.iter()
.enumerate()
.map(|(ix, bookmark)| StringMatchCandidate::new(ix, &bookmark.ref_name))
.collect::<Vec<_>>();
match_strings(
&candidates,
&query,
false,
100,
&Default::default(),
background,
)
.await
.into_iter()
.map(|mat| BookmarkEntry {
bookmark: all_bookmarks[mat.candidate_id].clone(),
positions: mat.positions,
})
.collect()
};
this.update(cx, |this, _cx| {
this.delegate.matches = matches;
})
.log_err();
})
}
fn confirm(&mut self, _secondary: bool, _window: &mut Window, _cx: &mut Context<Picker<Self>>) {
//
}
fn dismissed(&mut self, _window: &mut Window, cx: &mut Context<Picker<Self>>) {
self.picker
.update(cx, |_, cx| cx.emit(DismissEvent))
.log_err();
}
fn render_match(
&self,
ix: usize,
selected: bool,
_window: &mut Window,
_cx: &mut Context<Picker<Self>>,
) -> Option<Self::ListItem> {
let entry = &self.matches[ix];
Some(
ListItem::new(ix)
.inset(true)
.spacing(ListItemSpacing::Sparse)
.toggle_state(selected)
.child(HighlightedLabel::new(
entry.bookmark.ref_name.clone(),
entry.positions.clone(),
)),
)
}
}

39
crates/jj_ui/src/jj_ui.rs Normal file
View file

@ -0,0 +1,39 @@
mod bookmark_picker;
use command_palette_hooks::CommandPaletteFilter;
use feature_flags::FeatureFlagAppExt as _;
use gpui::App;
use jj::JujutsuStore;
use workspace::Workspace;
pub fn init(cx: &mut App) {
JujutsuStore::init_global(cx);
cx.observe_new(|workspace: &mut Workspace, _window, _cx| {
bookmark_picker::register(workspace);
})
.detach();
feature_gate_jj_ui_actions(cx);
}
fn feature_gate_jj_ui_actions(cx: &mut App) {
const JJ_ACTION_NAMESPACE: &str = "jj";
CommandPaletteFilter::update_global(cx, |filter, _cx| {
filter.hide_namespace(JJ_ACTION_NAMESPACE);
});
cx.observe_flag::<feature_flags::JjUiFeatureFlag, _>({
move |is_enabled, cx| {
CommandPaletteFilter::update_global(cx, |filter, _cx| {
if is_enabled {
filter.show_namespace(JJ_ACTION_NAMESPACE);
} else {
filter.hide_namespace(JJ_ACTION_NAMESPACE);
}
});
}
})
.detach();
}

View file

@ -67,6 +67,7 @@ image_viewer.workspace = true
indoc.workspace = true
inline_completion_button.workspace = true
install_cli.workspace = true
jj_ui.workspace = true
journal.workspace = true
language.workspace = true
language_extension.workspace = true

View file

@ -565,6 +565,7 @@ fn main() {
notifications::init(app_state.client.clone(), app_state.user_store.clone(), cx);
collab_ui::init(&app_state, cx);
git_ui::init(cx);
jj_ui::init(cx);
feedback::init(cx);
markdown_preview::init(cx);
welcome::init(cx);

View file

@ -142,6 +142,12 @@ pub mod git {
action_with_deprecated_aliases!(git, Branch, ["branches::OpenRecent"]);
}
pub mod jj {
use gpui::actions;
actions!(jj, [BookmarkList]);
}
pub mod command_palette {
use gpui::actions;

View file

@ -51,6 +51,7 @@ digest = { version = "0.10", features = ["mac", "oid", "std"] }
either = { version = "1", features = ["serde", "use_std"] }
euclid = { version = "0.22" }
event-listener = { version = "5" }
flate2 = { version = "1", features = ["zlib-rs"] }
form_urlencoded = { version = "1" }
futures = { version = "0.3", features = ["io-compat"] }
futures-channel = { version = "0.3", features = ["sink"] }
@ -69,6 +70,7 @@ hmac = { version = "0.12", default-features = false, features = ["reset"] }
hyper = { version = "0.14", features = ["client", "http1", "http2", "runtime", "server", "stream"] }
idna = { version = "1" }
indexmap = { version = "2", features = ["serde"] }
jiff = { version = "0.2" }
lazy_static = { version = "1", default-features = false, features = ["spin_no_std"] }
libc = { version = "0.2", features = ["extra_traits"] }
libsqlite3-sys = { version = "0.30", features = ["bundled", "unlock_notify"] }
@ -91,6 +93,7 @@ phf_shared = { version = "0.11" }
prost = { version = "0.9" }
prost-types = { version = "0.9" }
rand-c38e5c1d305a1b54 = { package = "rand", version = "0.8", features = ["small_rng"] }
rand_chacha = { version = "0.3" }
rand_core = { version = "0.6", default-features = false, features = ["std"] }
regex = { version = "1" }
regex-automata = { version = "0.4" }
@ -105,8 +108,9 @@ sea-query-binder = { version = "0.7", default-features = false, features = ["pos
semver = { version = "1", features = ["serde"] }
serde = { version = "1", features = ["alloc", "derive", "rc"] }
serde_json = { version = "1", features = ["preserve_order", "raw_value", "unbounded_depth"] }
sha1 = { version = "0.10", features = ["compress"] }
simd-adler32 = { version = "0.3" }
smallvec = { version = "1", default-features = false, features = ["const_new", "serde", "union"] }
smallvec = { version = "1", default-features = false, features = ["const_new", "serde", "union", "write"] }
spin = { version = "0.9" }
sqlx = { version = "0.8", features = ["bigdecimal", "chrono", "postgres", "runtime-tokio-rustls", "rust_decimal", "sqlite", "time", "uuid"] }
sqlx-postgres = { version = "0.8", default-features = false, features = ["any", "bigdecimal", "chrono", "json", "migrate", "offline", "rust_decimal", "time", "uuid"] }
@ -118,9 +122,11 @@ time = { version = "0.3", features = ["local-offset", "macros", "serde-well-know
tokio = { version = "1", features = ["full"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["tls12"] }
tokio-util = { version = "0.7", features = ["codec", "compat", "io"] }
toml_edit = { version = "0.22", features = ["serde"] }
tracing = { version = "0.1", features = ["log"] }
tracing-core = { version = "0.1" }
tungstenite = { version = "0.26", default-features = false, features = ["__rustls-tls", "handshake"] }
unicode-normalization = { version = "0.1" }
unicode-properties = { version = "0.1" }
url = { version = "2", features = ["serde"] }
uuid = { version = "1", features = ["serde", "v4", "v5", "v7"] }
@ -129,6 +135,7 @@ wasmparser = { version = "0.221" }
wasmtime = { version = "29", default-features = false, features = ["async", "component-model", "cranelift", "demangle", "gc-drc"] }
wasmtime-cranelift = { version = "29", default-features = false, features = ["component-model", "gc-drc"] }
wasmtime-environ = { version = "29", default-features = false, features = ["compile", "component-model", "demangle", "gc-drc"] }
winnow = { version = "0.7", features = ["simd"] }
[build-dependencies]
ahash = { version = "0.8", features = ["serde"] }
@ -168,6 +175,7 @@ digest = { version = "0.10", features = ["mac", "oid", "std"] }
either = { version = "1", features = ["serde", "use_std"] }
euclid = { version = "0.22" }
event-listener = { version = "5" }
flate2 = { version = "1", features = ["zlib-rs"] }
form_urlencoded = { version = "1" }
futures = { version = "0.3", features = ["io-compat"] }
futures-channel = { version = "0.3", features = ["sink"] }
@ -188,6 +196,7 @@ hyper = { version = "0.14", features = ["client", "http1", "http2", "runtime", "
idna = { version = "1" }
indexmap = { version = "2", features = ["serde"] }
itertools-594e8ee84c453af0 = { package = "itertools", version = "0.13" }
jiff = { version = "0.2" }
lazy_static = { version = "1", default-features = false, features = ["spin_no_std"] }
libc = { version = "0.2", features = ["extra_traits"] }
libsqlite3-sys = { version = "0.30", features = ["bundled", "unlock_notify"] }
@ -213,6 +222,7 @@ prost = { version = "0.9" }
prost-types = { version = "0.9" }
quote = { version = "1" }
rand-c38e5c1d305a1b54 = { package = "rand", version = "0.8", features = ["small_rng"] }
rand_chacha = { version = "0.3" }
rand_core = { version = "0.6", default-features = false, features = ["std"] }
regex = { version = "1" }
regex-automata = { version = "0.4" }
@ -228,8 +238,9 @@ semver = { version = "1", features = ["serde"] }
serde = { version = "1", features = ["alloc", "derive", "rc"] }
serde_derive = { version = "1", features = ["deserialize_in_place"] }
serde_json = { version = "1", features = ["preserve_order", "raw_value", "unbounded_depth"] }
sha1 = { version = "0.10", features = ["compress"] }
simd-adler32 = { version = "0.3" }
smallvec = { version = "1", default-features = false, features = ["const_new", "serde", "union"] }
smallvec = { version = "1", default-features = false, features = ["const_new", "serde", "union", "write"] }
spin = { version = "0.9" }
sqlx = { version = "0.8", features = ["bigdecimal", "chrono", "postgres", "runtime-tokio-rustls", "rust_decimal", "sqlite", "time", "uuid"] }
sqlx-macros = { version = "0.8", features = ["_rt-tokio", "_tls-rustls-ring-webpki", "bigdecimal", "chrono", "derive", "json", "macros", "migrate", "postgres", "rust_decimal", "sqlite", "time", "uuid"] }
@ -246,9 +257,11 @@ time-macros = { version = "0.2", default-features = false, features = ["formatti
tokio = { version = "1", features = ["full"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["tls12"] }
tokio-util = { version = "0.7", features = ["codec", "compat", "io"] }
toml_edit = { version = "0.22", features = ["serde"] }
tracing = { version = "0.1", features = ["log"] }
tracing-core = { version = "0.1" }
tungstenite = { version = "0.26", default-features = false, features = ["__rustls-tls", "handshake"] }
unicode-normalization = { version = "0.1" }
unicode-properties = { version = "0.1" }
url = { version = "2", features = ["serde"] }
uuid = { version = "1", features = ["serde", "v4", "v5", "v7"] }
@ -257,13 +270,13 @@ wasmparser = { version = "0.221" }
wasmtime = { version = "29", default-features = false, features = ["async", "component-model", "cranelift", "demangle", "gc-drc"] }
wasmtime-cranelift = { version = "29", default-features = false, features = ["component-model", "gc-drc"] }
wasmtime-environ = { version = "29", default-features = false, features = ["compile", "component-model", "demangle", "gc-drc"] }
winnow = { version = "0.7", features = ["simd"] }
[target.x86_64-apple-darwin.dependencies]
codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
flate2 = { version = "1" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -293,7 +306,6 @@ codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
flate2 = { version = "1" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -323,7 +335,6 @@ codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
flate2 = { version = "1" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -353,7 +364,6 @@ codespan-reporting = { version = "0.12" }
core-foundation = { version = "0.9" }
core-foundation-sys = { version = "0.8" }
coreaudio-sys = { version = "0.2", default-features = false, features = ["audio_toolbox", "audio_unit", "core_audio", "core_midi", "open_al"] }
flate2 = { version = "1" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
gimli = { version = "0.31", default-features = false, features = ["read", "std", "write"] }
@ -386,7 +396,6 @@ cipher = { version = "0.4", default-features = false, features = ["block-padding
codespan-reporting = { version = "0.12" }
crypto-common = { version = "0.1", default-features = false, features = ["rand_core", "std"] }
event-listener-strategy = { version = "0.5" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -409,14 +418,12 @@ ring = { version = "0.17", features = ["std"] }
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event", "mm", "param", "pipe", "process", "pty", "shm", "stdio", "system", "termios", "time"] }
rustix-dff4ba8e3ae991db = { package = "rustix", version = "1", features = ["fs", "net", "process", "termios", "time"] }
scopeguard = { version = "1" }
smallvec = { version = "1", default-features = false, features = ["write"] }
syn-f595c2ba2a3f28df = { package = "syn", version = "2", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] }
sync_wrapper = { version = "1", default-features = false, features = ["futures"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] }
tokio-socks = { version = "0.5", features = ["futures-io"] }
tokio-stream = { version = "0.1", features = ["fs"] }
toml_datetime = { version = "0.6", default-features = false, features = ["serde"] }
toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
zeroize = { version = "1", features = ["zeroize_derive"] }
zvariant = { version = "5", default-features = false, features = ["enumflags2", "gvariant", "url"] }
@ -429,7 +436,6 @@ cipher = { version = "0.4", default-features = false, features = ["block-padding
codespan-reporting = { version = "0.12" }
crypto-common = { version = "0.1", default-features = false, features = ["rand_core", "std"] }
event-listener-strategy = { version = "0.5" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -451,13 +457,11 @@ ring = { version = "0.17", features = ["std"] }
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event", "mm", "param", "pipe", "process", "pty", "shm", "stdio", "system", "termios", "time"] }
rustix-dff4ba8e3ae991db = { package = "rustix", version = "1", features = ["fs", "net", "process", "termios", "time"] }
scopeguard = { version = "1" }
smallvec = { version = "1", default-features = false, features = ["write"] }
sync_wrapper = { version = "1", default-features = false, features = ["futures"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] }
tokio-socks = { version = "0.5", features = ["futures-io"] }
tokio-stream = { version = "0.1", features = ["fs"] }
toml_datetime = { version = "0.6", default-features = false, features = ["serde"] }
toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
zeroize = { version = "1", features = ["zeroize_derive"] }
zvariant = { version = "5", default-features = false, features = ["enumflags2", "gvariant", "url"] }
@ -470,7 +474,6 @@ cipher = { version = "0.4", default-features = false, features = ["block-padding
codespan-reporting = { version = "0.12" }
crypto-common = { version = "0.1", default-features = false, features = ["rand_core", "std"] }
event-listener-strategy = { version = "0.5" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -493,14 +496,12 @@ ring = { version = "0.17", features = ["std"] }
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event", "mm", "param", "pipe", "process", "pty", "shm", "stdio", "system", "termios", "time"] }
rustix-dff4ba8e3ae991db = { package = "rustix", version = "1", features = ["fs", "net", "process", "termios", "time"] }
scopeguard = { version = "1" }
smallvec = { version = "1", default-features = false, features = ["write"] }
syn-f595c2ba2a3f28df = { package = "syn", version = "2", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] }
sync_wrapper = { version = "1", default-features = false, features = ["futures"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] }
tokio-socks = { version = "0.5", features = ["futures-io"] }
tokio-stream = { version = "0.1", features = ["fs"] }
toml_datetime = { version = "0.6", default-features = false, features = ["serde"] }
toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
zeroize = { version = "1", features = ["zeroize_derive"] }
zvariant = { version = "5", default-features = false, features = ["enumflags2", "gvariant", "url"] }
@ -513,7 +514,6 @@ cipher = { version = "0.4", default-features = false, features = ["block-padding
codespan-reporting = { version = "0.12" }
crypto-common = { version = "0.1", default-features = false, features = ["rand_core", "std"] }
event-listener-strategy = { version = "0.5" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -535,20 +535,17 @@ ring = { version = "0.17", features = ["std"] }
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event", "mm", "param", "pipe", "process", "pty", "shm", "stdio", "system", "termios", "time"] }
rustix-dff4ba8e3ae991db = { package = "rustix", version = "1", features = ["fs", "net", "process", "termios", "time"] }
scopeguard = { version = "1" }
smallvec = { version = "1", default-features = false, features = ["write"] }
sync_wrapper = { version = "1", default-features = false, features = ["futures"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] }
tokio-socks = { version = "0.5", features = ["futures-io"] }
tokio-stream = { version = "0.1", features = ["fs"] }
toml_datetime = { version = "0.6", default-features = false, features = ["serde"] }
toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
zeroize = { version = "1", features = ["zeroize_derive"] }
zvariant = { version = "5", default-features = false, features = ["enumflags2", "gvariant", "url"] }
[target.x86_64-pc-windows-msvc.dependencies]
codespan-reporting = { version = "0.12" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -568,12 +565,11 @@ winapi = { version = "0.3", default-features = false, features = ["cfg", "commap
windows-core = { version = "0.61" }
windows-numerics = { version = "0.2" }
windows-sys-73dcd821b1037cfd = { package = "windows-sys", version = "0.59", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Win32_Globalization", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_Security_Authentication_Identity", "Win32_Security_Credentials", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Ioctl", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Performance", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_WindowsProgramming"] }
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_Networking_WinSock", "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_IO", "Win32_System_Memory", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_WindowsProgramming"] }
windows-sys-c8eced492e86ede7 = { package = "windows-sys", version = "0.48", features = ["Win32_Foundation", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_Threading", "Win32_System_Time", "Win32_UI_Shell"] }
[target.x86_64-pc-windows-msvc.build-dependencies]
codespan-reporting = { version = "0.12" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -594,7 +590,7 @@ winapi = { version = "0.3", default-features = false, features = ["cfg", "commap
windows-core = { version = "0.61" }
windows-numerics = { version = "0.2" }
windows-sys-73dcd821b1037cfd = { package = "windows-sys", version = "0.59", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Win32_Globalization", "Win32_NetworkManagement_IpHelper", "Win32_Networking_WinSock", "Win32_Security_Authentication_Identity", "Win32_Security_Credentials", "Win32_Security_Cryptography", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Console", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Ioctl", "Win32_System_Kernel", "Win32_System_LibraryLoader", "Win32_System_Memory", "Win32_System_Performance", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_SystemInformation", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_Time", "Win32_System_WindowsProgramming", "Win32_UI_Input_KeyboardAndMouse", "Win32_UI_Shell", "Win32_UI_WindowsAndMessaging"] }
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_WindowsProgramming"] }
windows-sys-b21d60becc0929df = { package = "windows-sys", version = "0.52", features = ["Wdk_Foundation", "Wdk_Storage_FileSystem", "Wdk_System_IO", "Win32_Foundation", "Win32_Networking_WinSock", "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Console", "Win32_System_IO", "Win32_System_Memory", "Win32_System_Pipes", "Win32_System_SystemServices", "Win32_System_Threading", "Win32_System_WindowsProgramming"] }
windows-sys-c8eced492e86ede7 = { package = "windows-sys", version = "0.48", features = ["Win32_Foundation", "Win32_Globalization", "Win32_Networking_WinSock", "Win32_Security", "Win32_Storage_FileSystem", "Win32_System_Com", "Win32_System_Diagnostics_Debug", "Win32_System_IO", "Win32_System_Pipes", "Win32_System_Registry", "Win32_System_Threading", "Win32_System_Time", "Win32_UI_Shell"] }
[target.x86_64-unknown-linux-musl.dependencies]
@ -605,7 +601,6 @@ cipher = { version = "0.4", default-features = false, features = ["block-padding
codespan-reporting = { version = "0.12" }
crypto-common = { version = "0.1", default-features = false, features = ["rand_core", "std"] }
event-listener-strategy = { version = "0.5" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -628,14 +623,12 @@ ring = { version = "0.17", features = ["std"] }
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event", "mm", "param", "pipe", "process", "pty", "shm", "stdio", "system", "termios", "time"] }
rustix-dff4ba8e3ae991db = { package = "rustix", version = "1", features = ["fs", "net", "process", "termios", "time"] }
scopeguard = { version = "1" }
smallvec = { version = "1", default-features = false, features = ["write"] }
syn-f595c2ba2a3f28df = { package = "syn", version = "2", features = ["extra-traits", "fold", "full", "visit", "visit-mut"] }
sync_wrapper = { version = "1", default-features = false, features = ["futures"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] }
tokio-socks = { version = "0.5", features = ["futures-io"] }
tokio-stream = { version = "0.1", features = ["fs"] }
toml_datetime = { version = "0.6", default-features = false, features = ["serde"] }
toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
zeroize = { version = "1", features = ["zeroize_derive"] }
zvariant = { version = "5", default-features = false, features = ["enumflags2", "gvariant", "url"] }
@ -648,7 +641,6 @@ cipher = { version = "0.4", default-features = false, features = ["block-padding
codespan-reporting = { version = "0.12" }
crypto-common = { version = "0.1", default-features = false, features = ["rand_core", "std"] }
event-listener-strategy = { version = "0.5" }
flate2 = { version = "1" }
flume = { version = "0.11" }
foldhash = { version = "0.1", default-features = false, features = ["std"] }
getrandom-468e82937335b1c9 = { package = "getrandom", version = "0.3", default-features = false, features = ["std"] }
@ -670,13 +662,11 @@ ring = { version = "0.17", features = ["std"] }
rustix-d585fab2519d2d1 = { package = "rustix", version = "0.38", features = ["event", "mm", "param", "pipe", "process", "pty", "shm", "stdio", "system", "termios", "time"] }
rustix-dff4ba8e3ae991db = { package = "rustix", version = "1", features = ["fs", "net", "process", "termios", "time"] }
scopeguard = { version = "1" }
smallvec = { version = "1", default-features = false, features = ["write"] }
sync_wrapper = { version = "1", default-features = false, features = ["futures"] }
tokio-rustls = { version = "0.26", default-features = false, features = ["ring"] }
tokio-socks = { version = "0.5", features = ["futures-io"] }
tokio-stream = { version = "0.1", features = ["fs"] }
toml_datetime = { version = "0.6", default-features = false, features = ["serde"] }
toml_edit = { version = "0.22", default-features = false, features = ["display", "parse", "serde"] }
tower = { version = "0.5", default-features = false, features = ["timeout", "util"] }
zeroize = { version = "1", features = ["zeroize_derive"] }
zvariant = { version = "5", default-features = false, features = ["enumflags2", "gvariant", "url"] }