diff --git a/.github/workflows/release_actions.yml b/.github/workflows/release_actions.yml
index 4ccab09cbe..71909ae177 100644
--- a/.github/workflows/release_actions.yml
+++ b/.github/workflows/release_actions.yml
@@ -16,8 +16,4 @@ jobs:
Restart your Zed or head to https://zed.dev/releases/stable/latest to grab it.
- ```md
- # Changelog
-
${{ github.event.release.body }}
- ```
diff --git a/Cargo.lock b/Cargo.lock
index ac089cee18..86cea649f8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -482,7 +482,7 @@ dependencies = [
"async-global-executor",
"async-io",
"async-lock",
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
"futures-channel",
"futures-core",
"futures-io",
@@ -1491,6 +1491,7 @@ dependencies = [
"theme",
"theme_selector",
"util",
+ "vcs_menu",
"workspace",
"zed-actions",
]
@@ -1550,7 +1551,7 @@ version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
dependencies = [
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
]
[[package]]
@@ -1863,16 +1864,6 @@ dependencies = [
"cfg-if 1.0.0",
]
-[[package]]
-name = "crossbeam-channel"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87"
-dependencies = [
- "crossbeam-utils 0.7.2",
- "maybe-uninit",
-]
-
[[package]]
name = "crossbeam-channel"
version = "0.5.8"
@@ -1880,7 +1871,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
dependencies = [
"cfg-if 1.0.0",
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
]
[[package]]
@@ -1891,7 +1882,7 @@ checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
dependencies = [
"cfg-if 1.0.0",
"crossbeam-epoch",
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
]
[[package]]
@@ -1902,7 +1893,7 @@ checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695"
dependencies = [
"autocfg 1.1.0",
"cfg-if 1.0.0",
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
"memoffset 0.8.0",
"scopeguard",
]
@@ -1914,18 +1905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"
dependencies = [
"cfg-if 1.0.0",
- "crossbeam-utils 0.8.15",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.7.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
-dependencies = [
- "autocfg 1.1.0",
- "cfg-if 0.1.10",
- "lazy_static",
+ "crossbeam-utils",
]
[[package]]
@@ -1990,7 +1970,6 @@ checksum = "14d05c10f541ae6f3bc5b3d923c20001f47db7d5f0b2bc6ad16490133842db79"
dependencies = [
"cc",
"libc",
- "libnghttp2-sys",
"libz-sys",
"openssl-sys",
"pkg-config",
@@ -3521,12 +3500,12 @@ dependencies = [
[[package]]
name = "ipc-channel"
-version = "0.16.0"
+version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cb1d9211085f0ea6f1379d944b93c4d07e8207aa3bcf49f37eda12b85081887"
+checksum = "342d636452fbc2895574e0b319b23c014fd01c9ed71dcd87f6a4a8e2f948db4b"
dependencies = [
"bincode",
- "crossbeam-channel 0.4.4",
+ "crossbeam-channel",
"fnv",
"lazy_static",
"libc",
@@ -3534,7 +3513,7 @@ dependencies = [
"rand 0.7.3",
"serde",
"tempfile",
- "uuid 0.8.2",
+ "uuid 1.3.2",
"winapi 0.3.9",
]
@@ -3576,7 +3555,7 @@ checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9"
dependencies = [
"async-channel",
"castaway",
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
"curl",
"curl-sys",
"encoding_rs",
@@ -3906,16 +3885,6 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb"
-[[package]]
-name = "libnghttp2-sys"
-version = "0.1.7+1.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f"
-dependencies = [
- "cc",
- "libc",
-]
-
[[package]]
name = "libsqlite3-sys"
version = "0.24.2"
@@ -4004,7 +3973,6 @@ dependencies = [
"gpui",
"hmac 0.12.1",
"jwt",
- "lazy_static",
"live_kit_server",
"log",
"media",
@@ -4149,12 +4117,6 @@ version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4"
-[[package]]
-name = "maybe-uninit"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
-
[[package]]
name = "md-5"
version = "0.10.5"
@@ -5678,9 +5640,9 @@ version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d"
dependencies = [
- "crossbeam-channel 0.5.8",
+ "crossbeam-channel",
"crossbeam-deque",
- "crossbeam-utils 0.8.15",
+ "crossbeam-utils",
"num_cpus",
]
@@ -8333,15 +8295,6 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc7e3b898aa6f6c08e5295b6c89258d1331e9ac578cc992fb818759951bdc22"
-[[package]]
-name = "uuid"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
-dependencies = [
- "getrandom 0.2.9",
-]
-
[[package]]
name = "uuid"
version = "1.3.2"
@@ -8378,6 +8331,19 @@ version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+[[package]]
+name = "vcs_menu"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "fuzzy",
+ "gpui",
+ "picker",
+ "theme",
+ "util",
+ "workspace",
+]
+
[[package]]
name = "version_check"
version = "0.9.4"
@@ -8398,7 +8364,6 @@ dependencies = [
"indoc",
"itertools",
"language",
- "lazy_static",
"log",
"nvim-rs",
"parking_lot 0.11.2",
diff --git a/Cargo.toml b/Cargo.toml
index 1708ccfc0a..934129c5f4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -64,6 +64,7 @@ members = [
"crates/theme_selector",
"crates/util",
"crates/vim",
+ "crates/vcs_menu",
"crates/workspace",
"crates/welcome",
"crates/xtask",
@@ -81,7 +82,8 @@ env_logger = { version = "0.9" }
futures = { version = "0.3" }
globset = { version = "0.4" }
indoc = "1"
-isahc = "1.7.2"
+# We explicitly disable a http2 support in isahc.
+isahc = { version = "1.7.2", default-features = false, features = ["static-curl", "text-decoding"] }
lazy_static = { version = "1.4.0" }
log = { version = "0.4.16", features = ["kv_unstable_serde"] }
ordered-float = { version = "2.1.1" }
diff --git a/assets/icons/radix/maximize.svg b/assets/icons/radix/maximize.svg
new file mode 100644
index 0000000000..f37f6a2087
--- /dev/null
+++ b/assets/icons/radix/maximize.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/icons/radix/minimize.svg b/assets/icons/radix/minimize.svg
new file mode 100644
index 0000000000..ec78f152e1
--- /dev/null
+++ b/assets/icons/radix/minimize.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/keymaps/default.json b/assets/keymaps/default.json
index 6fc06198fe..8c3a1f407c 100644
--- a/assets/keymaps/default.json
+++ b/assets/keymaps/default.json
@@ -39,6 +39,7 @@
"cmd-shift-n": "workspace::NewWindow",
"cmd-o": "workspace::Open",
"alt-cmd-o": "projects::OpenRecent",
+ "alt-cmd-b": "branches::OpenRecent",
"ctrl-~": "workspace::NewTerminal",
"ctrl-`": "terminal_panel::ToggleFocus",
"shift-escape": "workspace::ToggleZoom"
diff --git a/assets/keymaps/textmate.json b/assets/keymaps/textmate.json
index 591d6e443f..1f28c05158 100644
--- a/assets/keymaps/textmate.json
+++ b/assets/keymaps/textmate.json
@@ -2,6 +2,7 @@
{
"bindings": {
"cmd-shift-o": "projects::OpenRecent",
+ "cmd-shift-b": "branches::OpenRecent",
"cmd-alt-tab": "project_panel::ToggleFocus"
}
},
diff --git a/assets/keymaps/vim.json b/assets/keymaps/vim.json
index afee6fcd2e..639daef614 100644
--- a/assets/keymaps/vim.json
+++ b/assets/keymaps/vim.json
@@ -35,8 +35,11 @@
"l": "vim::Right",
"right": "vim::Right",
"$": "vim::EndOfLine",
+ "^": "vim::FirstNonWhitespace",
"shift-g": "vim::EndOfDocument",
"w": "vim::NextWordStart",
+ "{": "vim::StartOfParagraph",
+ "}": "vim::EndOfParagraph",
"shift-w": [
"vim::NextWordStart",
{
@@ -92,7 +95,10 @@
],
"ctrl-o": "pane::GoBack",
"ctrl-]": "editor::GoToDefinition",
- "escape": "editor::Cancel",
+ "escape": [
+ "vim::SwitchMode",
+ "Normal"
+ ],
"0": "vim::StartOfLine", // When no number operator present, use start of line motion
"1": [
"vim::Number",
@@ -165,7 +171,6 @@
"shift-a": "vim::InsertEndOfLine",
"x": "vim::DeleteRight",
"shift-x": "vim::DeleteLeft",
- "^": "vim::FirstNonWhitespace",
"o": "vim::InsertLineBelow",
"shift-o": "vim::InsertLineAbove",
"~": "vim::ChangeCase",
@@ -305,6 +310,10 @@
"vim::PushOperator",
"Replace"
],
+ "ctrl-c": [
+ "vim::SwitchMode",
+ "Normal"
+ ],
"> >": "editor::Indent",
"< <": "editor::Outdent"
}
@@ -321,7 +330,10 @@
"bindings": {
"tab": "vim::Tab",
"enter": "vim::Enter",
- "escape": "editor::Cancel"
+ "escape": [
+ "vim::SwitchMode",
+ "Normal"
+ ]
}
}
]
diff --git a/crates/ai/src/assistant.rs b/crates/ai/src/assistant.rs
index 4d300230e1..35c88486f7 100644
--- a/crates/ai/src/assistant.rs
+++ b/crates/ai/src/assistant.rs
@@ -2061,6 +2061,8 @@ impl ConversationEditor {
let remaining_tokens = self.conversation.read(cx).remaining_tokens()?;
let remaining_tokens_style = if remaining_tokens <= 0 {
&style.no_remaining_tokens
+ } else if remaining_tokens <= 500 {
+ &style.low_remaining_tokens
} else {
&style.remaining_tokens
};
diff --git a/crates/call/src/call.rs b/crates/call/src/call.rs
index 0a8f150194..ed5e560218 100644
--- a/crates/call/src/call.rs
+++ b/crates/call/src/call.rs
@@ -4,7 +4,7 @@ pub mod room;
use std::sync::Arc;
use anyhow::{anyhow, Result};
-use client::{proto, Client, TypedEnvelope, User, UserStore};
+use client::{proto, ClickhouseEvent, Client, TelemetrySettings, TypedEnvelope, User, UserStore};
use collections::HashSet;
use futures::{future::Shared, FutureExt};
use postage::watch;
@@ -198,6 +198,7 @@ impl ActiveCall {
let result = invite.await;
this.update(&mut cx, |this, cx| {
this.pending_invites.remove(&called_user_id);
+ this.report_call_event("invite", cx);
cx.notify();
});
result
@@ -243,21 +244,26 @@ impl ActiveCall {
};
let join = Room::join(&call, self.client.clone(), self.user_store.clone(), cx);
+
cx.spawn(|this, mut cx| async move {
let room = join.await?;
this.update(&mut cx, |this, cx| this.set_room(Some(room.clone()), cx))
.await?;
+ this.update(&mut cx, |this, cx| {
+ this.report_call_event("accept incoming", cx)
+ });
Ok(())
})
}
- pub fn decline_incoming(&mut self) -> Result<()> {
+ pub fn decline_incoming(&mut self, cx: &mut ModelContext) -> Result<()> {
let call = self
.incoming_call
.0
.borrow_mut()
.take()
.ok_or_else(|| anyhow!("no incoming call"))?;
+ self.report_call_event_for_room("decline incoming", call.room_id, cx);
self.client.send(proto::DeclineCall {
room_id: call.room_id,
})?;
@@ -266,6 +272,7 @@ impl ActiveCall {
pub fn hang_up(&mut self, cx: &mut ModelContext) -> Task> {
cx.notify();
+ self.report_call_event("hang up", cx);
if let Some((room, _)) = self.room.take() {
room.update(cx, |room, cx| room.leave(cx))
} else {
@@ -273,12 +280,28 @@ impl ActiveCall {
}
}
+ pub fn toggle_screen_sharing(&self, cx: &mut AppContext) {
+ if let Some(room) = self.room().cloned() {
+ let toggle_screen_sharing = room.update(cx, |room, cx| {
+ if room.is_screen_sharing() {
+ self.report_call_event("disable screen share", cx);
+ Task::ready(room.unshare_screen(cx))
+ } else {
+ self.report_call_event("enable screen share", cx);
+ room.share_screen(cx)
+ }
+ });
+ toggle_screen_sharing.detach_and_log_err(cx);
+ }
+ }
+
pub fn share_project(
&mut self,
project: ModelHandle,
cx: &mut ModelContext,
) -> Task> {
if let Some((room, _)) = self.room.as_ref() {
+ self.report_call_event("share project", cx);
room.update(cx, |room, cx| room.share_project(project, cx))
} else {
Task::ready(Err(anyhow!("no active call")))
@@ -291,6 +314,7 @@ impl ActiveCall {
cx: &mut ModelContext,
) -> Result<()> {
if let Some((room, _)) = self.room.as_ref() {
+ self.report_call_event("unshare project", cx);
room.update(cx, |room, cx| room.unshare_project(project, cx))
} else {
Err(anyhow!("no active call"))
@@ -352,4 +376,19 @@ impl ActiveCall {
pub fn pending_invites(&self) -> &HashSet {
&self.pending_invites
}
+
+ fn report_call_event(&self, operation: &'static str, cx: &AppContext) {
+ if let Some(room) = self.room() {
+ self.report_call_event_for_room(operation, room.read(cx).id(), cx)
+ }
+ }
+
+ fn report_call_event_for_room(&self, operation: &'static str, room_id: u64, cx: &AppContext) {
+ let telemetry = self.client.telemetry();
+ let telemetry_settings = *settings::get::(cx);
+
+ let event = ClickhouseEvent::Call { operation, room_id };
+
+ telemetry.report_clickhouse_event(event, telemetry_settings);
+ }
}
diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs
index bdf677512c..2f742814a8 100644
--- a/crates/cli/src/main.rs
+++ b/crates/cli/src/main.rs
@@ -201,6 +201,7 @@ impl Bundle {
self.zed_version_string()
);
}
+
Self::LocalPath { executable, .. } => {
let executable_parent = executable
.parent()
diff --git a/crates/client/src/telemetry.rs b/crates/client/src/telemetry.rs
index 9c4e187dbc..959f4cc783 100644
--- a/crates/client/src/telemetry.rs
+++ b/crates/client/src/telemetry.rs
@@ -70,6 +70,10 @@ pub enum ClickhouseEvent {
suggestion_accepted: bool,
file_extension: Option,
},
+ Call {
+ operation: &'static str,
+ room_id: u64,
+ },
}
#[cfg(debug_assertions)]
diff --git a/crates/collab/src/db.rs b/crates/collab/src/db.rs
index 208da22efe..e16fa9edb1 100644
--- a/crates/collab/src/db.rs
+++ b/crates/collab/src/db.rs
@@ -3517,7 +3517,6 @@ pub use test::*;
mod test {
use super::*;
use gpui::executor::Background;
- use lazy_static::lazy_static;
use parking_lot::Mutex;
use sea_orm::ConnectionTrait;
use sqlx::migrate::MigrateDatabase;
@@ -3566,9 +3565,7 @@ mod test {
}
pub fn postgres(background: Arc) -> Self {
- lazy_static! {
- static ref LOCK: Mutex<()> = Mutex::new(());
- }
+ static LOCK: Mutex<()> = Mutex::new(());
let _guard = LOCK.lock();
let mut rng = StdRng::from_entropy();
diff --git a/crates/collab/src/tests/integration_tests.rs b/crates/collab/src/tests/integration_tests.rs
index 66dc19d690..c32129818f 100644
--- a/crates/collab/src/tests/integration_tests.rs
+++ b/crates/collab/src/tests/integration_tests.rs
@@ -157,7 +157,7 @@ async fn test_basic_calls(
// User C receives the call, but declines it.
let call_c = incoming_call_c.next().await.unwrap().unwrap();
assert_eq!(call_c.calling_user.github_login, "user_b");
- active_call_c.update(cx_c, |call, _| call.decline_incoming().unwrap());
+ active_call_c.update(cx_c, |call, cx| call.decline_incoming(cx).unwrap());
assert!(incoming_call_c.next().await.unwrap().is_none());
deterministic.run_until_parked();
@@ -1080,7 +1080,7 @@ async fn test_calls_on_multiple_connections(
// User B declines the call on one of the two connections, causing both connections
// to stop ringing.
- active_call_b2.update(cx_b2, |call, _| call.decline_incoming().unwrap());
+ active_call_b2.update(cx_b2, |call, cx| call.decline_incoming(cx).unwrap());
deterministic.run_until_parked();
assert!(incoming_call_b1.next().await.unwrap().is_none());
assert!(incoming_call_b2.next().await.unwrap().is_none());
@@ -5945,7 +5945,7 @@ async fn test_contacts(
[("user_b".to_string(), "online", "busy")]
);
- active_call_b.update(cx_b, |call, _| call.decline_incoming().unwrap());
+ active_call_b.update(cx_b, |call, cx| call.decline_incoming(cx).unwrap());
deterministic.run_until_parked();
assert_eq!(
contacts(&client_a, cx_a),
diff --git a/crates/collab/src/tests/randomized_integration_tests.rs b/crates/collab/src/tests/randomized_integration_tests.rs
index a95938f6b8..8062a12b83 100644
--- a/crates/collab/src/tests/randomized_integration_tests.rs
+++ b/crates/collab/src/tests/randomized_integration_tests.rs
@@ -37,9 +37,9 @@ use util::ResultExt;
lazy_static::lazy_static! {
static ref PLAN_LOAD_PATH: Option = path_env_var("LOAD_PLAN");
static ref PLAN_SAVE_PATH: Option = path_env_var("SAVE_PLAN");
- static ref LOADED_PLAN_JSON: Mutex