diff --git a/Cargo.lock b/Cargo.lock
index 9a3a333fe3..9aa2242f0c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -485,9 +485,9 @@ dependencies = [
[[package]]
name = "bindgen"
-version = "0.58.1"
+version = "0.59.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f8523b410d7187a43085e7e064416ea32ded16bd0a4e6fc025e21616d01258f"
+checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8"
dependencies = [
"bitflags",
"cexpr",
@@ -503,7 +503,7 @@ dependencies = [
"regex",
"rustc-hash",
"shlex",
- "which 3.1.1",
+ "which",
]
[[package]]
@@ -616,6 +616,17 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
+[[package]]
+name = "bzip2-sys"
+version = "0.1.11+1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
[[package]]
name = "cache-padded"
version = "1.1.1"
@@ -639,11 +650,11 @@ dependencies = [
[[package]]
name = "cexpr"
-version = "0.4.0"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
- "nom 5.1.2",
+ "nom 7.1.1",
]
[[package]]
@@ -956,6 +967,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"client",
+ "collections",
"editor",
"futures",
"fuzzy",
@@ -1444,9 +1456,9 @@ dependencies = [
[[package]]
name = "env_logger"
-version = "0.8.3"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f"
+checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3"
dependencies = [
"atty",
"humantime",
@@ -1539,9 +1551,9 @@ dependencies = [
[[package]]
name = "fixedbitset"
-version = "0.2.0"
+version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
+checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e"
[[package]]
name = "flate2"
@@ -1987,12 +1999,6 @@ dependencies = [
"tracing",
]
-[[package]]
-name = "hashbrown"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
-
[[package]]
name = "hashbrown"
version = "0.11.2"
@@ -2008,7 +2014,7 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
dependencies = [
- "hashbrown 0.11.2",
+ "hashbrown",
]
[[package]]
@@ -2240,12 +2246,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "1.6.2"
+version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
+checksum = "e6012d540c5baa3589337a98ce73408de9b5a25ec9fc2c6fd6be8f0d39e0ca5a"
dependencies = [
"autocfg 1.0.1",
- "hashbrown 0.9.1",
+ "hashbrown",
]
[[package]]
@@ -2481,9 +2487,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.119"
+version = "0.2.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
[[package]]
name = "libloading"
@@ -2511,6 +2517,21 @@ dependencies = [
"libc",
]
+[[package]]
+name = "librocksdb-sys"
+version = "0.6.1+6.28.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81bc587013734dadb7cf23468e531aa120788b87243648be42e2d3a072186291"
+dependencies = [
+ "bindgen",
+ "bzip2-sys",
+ "cc",
+ "glob",
+ "libc",
+ "libz-sys",
+ "zstd-sys",
+]
+
[[package]]
name = "libz-sys"
version = "1.1.3"
@@ -2721,6 +2742,12 @@ version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
[[package]]
name = "miniz_oxide"
version = "0.3.7"
@@ -2847,16 +2874,6 @@ dependencies = [
"winapi 0.3.9",
]
-[[package]]
-name = "nom"
-version = "5.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
-dependencies = [
- "memchr",
- "version_check",
-]
-
[[package]]
name = "nom"
version = "6.1.2"
@@ -2870,6 +2887,16 @@ dependencies = [
"version_check",
]
+[[package]]
+name = "nom"
+version = "7.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
[[package]]
name = "ntapi"
version = "0.3.7"
@@ -3190,9 +3217,9 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]]
name = "petgraph"
-version = "0.5.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
+checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143"
dependencies = [
"fixedbitset",
"indexmap",
@@ -3394,6 +3421,7 @@ dependencies = [
"postage",
"rand 0.8.3",
"regex",
+ "rocksdb",
"rpc",
"serde",
"serde_json",
@@ -3473,20 +3501,22 @@ dependencies = [
[[package]]
name = "prost-build"
-version = "0.8.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "355f634b43cdd80724ee7848f95770e7e70eefa6dcf14fea676216573b8fd603"
+checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5"
dependencies = [
"bytes",
"heck 0.3.3",
"itertools",
+ "lazy_static",
"log",
"multimap",
"petgraph",
- "prost 0.8.0",
+ "prost 0.9.0",
"prost-types",
+ "regex",
"tempfile",
- "which 4.1.0",
+ "which",
]
[[package]]
@@ -3517,12 +3547,12 @@ dependencies = [
[[package]]
name = "prost-types"
-version = "0.8.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "603bbd6394701d13f3f25aada59c7de9d35a6a5887cfc156181234a44002771b"
+checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a"
dependencies = [
"bytes",
- "prost 0.8.0",
+ "prost 0.9.0",
]
[[package]]
@@ -3710,9 +3740,9 @@ dependencies = [
[[package]]
name = "regex"
-version = "1.5.4"
+version = "1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
+checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
dependencies = [
"aho-corasick",
"memchr",
@@ -3730,9 +3760,9 @@ dependencies = [
[[package]]
name = "regex-syntax"
-version = "0.6.25"
+version = "0.6.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
[[package]]
name = "remove_dir_all"
@@ -3819,6 +3849,16 @@ dependencies = [
"winapi 0.3.9",
]
+[[package]]
+name = "rocksdb"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "620f4129485ff1a7128d184bc687470c21c7951b64779ebc9cfdad3dcd920290"
+dependencies = [
+ "libc",
+ "librocksdb-sys",
+]
+
[[package]]
name = "roxmltree"
version = "0.14.1"
@@ -5821,20 +5861,12 @@ dependencies = [
[[package]]
name = "which"
-version = "3.1.1"
+version = "4.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "which"
-version = "4.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe"
+checksum = "5c4fb54e6113b6a8772ee41c3404fb0301ac79604489467e0a9ce1f3e97c24ae"
dependencies = [
"either",
+ "lazy_static",
"libc",
]
diff --git a/assets/icons/lock-8.svg b/assets/icons/lock-8.svg
new file mode 100644
index 0000000000..c98340b93a
--- /dev/null
+++ b/assets/icons/lock-8.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs
index 0fc0f97949..51da1f4c1c 100644
--- a/crates/client/src/client.rs
+++ b/crates/client/src/client.rs
@@ -67,17 +67,23 @@ pub struct Client {
peer: Arc,
http: Arc,
state: RwLock,
- authenticate:
+
+ #[cfg(any(test, feature = "test-support"))]
+ authenticate: RwLock<
Option Task>>>,
- establish_connection: Option<
- Box<
- dyn 'static
- + Send
- + Sync
- + Fn(
- &Credentials,
- &AsyncAppContext,
- ) -> Task>,
+ >,
+ #[cfg(any(test, feature = "test-support"))]
+ establish_connection: RwLock<
+ Option<
+ Box<
+ dyn 'static
+ + Send
+ + Sync
+ + Fn(
+ &Credentials,
+ &AsyncAppContext,
+ ) -> Task>,
+ >,
>,
>,
}
@@ -235,8 +241,11 @@ impl Client {
peer: Peer::new(),
http,
state: Default::default(),
- authenticate: None,
- establish_connection: None,
+
+ #[cfg(any(test, feature = "test-support"))]
+ authenticate: Default::default(),
+ #[cfg(any(test, feature = "test-support"))]
+ establish_connection: Default::default(),
})
}
@@ -260,23 +269,23 @@ impl Client {
}
#[cfg(any(test, feature = "test-support"))]
- pub fn override_authenticate(&mut self, authenticate: F) -> &mut Self
+ pub fn override_authenticate(&self, authenticate: F) -> &Self
where
F: 'static + Send + Sync + Fn(&AsyncAppContext) -> Task>,
{
- self.authenticate = Some(Box::new(authenticate));
+ *self.authenticate.write() = Some(Box::new(authenticate));
self
}
#[cfg(any(test, feature = "test-support"))]
- pub fn override_establish_connection(&mut self, connect: F) -> &mut Self
+ pub fn override_establish_connection(&self, connect: F) -> &Self
where
F: 'static
+ Send
+ Sync
+ Fn(&Credentials, &AsyncAppContext) -> Task>,
{
- self.establish_connection = Some(Box::new(connect));
+ *self.establish_connection.write() = Some(Box::new(connect));
self
}
@@ -755,11 +764,12 @@ impl Client {
}
fn authenticate(self: &Arc, cx: &AsyncAppContext) -> Task> {
- if let Some(callback) = self.authenticate.as_ref() {
- callback(cx)
- } else {
- self.authenticate_with_browser(cx)
+ #[cfg(any(test, feature = "test-support"))]
+ if let Some(callback) = self.authenticate.read().as_ref() {
+ return callback(cx);
}
+
+ self.authenticate_with_browser(cx)
}
fn establish_connection(
@@ -767,11 +777,12 @@ impl Client {
credentials: &Credentials,
cx: &AsyncAppContext,
) -> Task> {
- if let Some(callback) = self.establish_connection.as_ref() {
- callback(credentials, cx)
- } else {
- self.establish_websocket_connection(credentials, cx)
+ #[cfg(any(test, feature = "test-support"))]
+ if let Some(callback) = self.establish_connection.read().as_ref() {
+ return callback(credentials, cx);
}
+
+ self.establish_websocket_connection(credentials, cx)
}
fn establish_websocket_connection(
diff --git a/crates/client/src/test.rs b/crates/client/src/test.rs
index face7db16e..92183e2566 100644
--- a/crates/client/src/test.rs
+++ b/crates/client/src/test.rs
@@ -28,7 +28,7 @@ struct FakeServerState {
impl FakeServer {
pub async fn for_client(
client_user_id: u64,
- client: &mut Arc,
+ client: &Arc,
cx: &TestAppContext,
) -> Self {
let server = Self {
@@ -38,8 +38,7 @@ impl FakeServer {
executor: cx.foreground(),
};
- Arc::get_mut(client)
- .unwrap()
+ client
.override_authenticate({
let state = Arc::downgrade(&server.state);
move |cx| {
@@ -179,6 +178,12 @@ impl FakeServer {
}
}
+impl Drop for FakeServer {
+ fn drop(&mut self) {
+ self.disconnect();
+ }
+}
+
pub struct FakeHttpClient {
handler: Box<
dyn 'static
diff --git a/crates/client/src/user.rs b/crates/client/src/user.rs
index b8a320f524..803fcf3703 100644
--- a/crates/client/src/user.rs
+++ b/crates/client/src/user.rs
@@ -42,7 +42,7 @@ pub struct Contact {
pub projects: Vec,
}
-#[derive(Debug)]
+#[derive(Clone, Debug, PartialEq)]
pub struct ProjectMetadata {
pub id: u64,
pub worktree_root_names: Vec,
@@ -99,6 +99,7 @@ impl Entity for UserStore {
enum UpdateContacts {
Update(proto::UpdateContacts),
+ Wait(postage::barrier::Sender),
Clear(postage::barrier::Sender),
}
@@ -217,6 +218,10 @@ impl UserStore {
cx: &mut ModelContext,
) -> Task> {
match message {
+ UpdateContacts::Wait(barrier) => {
+ drop(barrier);
+ Task::ready(Ok(()))
+ }
UpdateContacts::Clear(barrier) => {
self.contacts.clear();
self.incoming_contact_requests.clear();
@@ -497,6 +502,16 @@ impl UserStore {
}
}
+ pub fn contact_updates_done(&mut self) -> impl Future