fix cli welcome screen (#13474)

Release Notes:

- Fixed first launch via cli

---------

Co-authored-by: Mikayla <mikayla@zed.dev>
This commit is contained in:
Conrad Irwin 2024-06-24 12:55:30 -06:00 committed by GitHub
parent c6c5907693
commit 8949460bd7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 34 additions and 18 deletions

1
Cargo.lock generated
View File

@ -2223,6 +2223,7 @@ dependencies = [
"fork", "fork",
"ipc-channel", "ipc-channel",
"once_cell", "once_cell",
"parking_lot",
"paths", "paths",
"plist", "plist",
"release_channel", "release_channel",

View File

@ -21,6 +21,7 @@ anyhow.workspace = true
clap.workspace = true clap.workspace = true
ipc-channel = "0.18" ipc-channel = "0.18"
once_cell.workspace = true once_cell.workspace = true
parking_lot.workspace = true
paths.workspace = true paths.workspace = true
release_channel.workspace = true release_channel.workspace = true
serde.workspace = true serde.workspace = true

View File

@ -3,10 +3,12 @@
use anyhow::{Context, Result}; use anyhow::{Context, Result};
use clap::Parser; use clap::Parser;
use cli::{ipc::IpcOneShotServer, CliRequest, CliResponse, IpcHandshake}; use cli::{ipc::IpcOneShotServer, CliRequest, CliResponse, IpcHandshake};
use parking_lot::Mutex;
use std::{ use std::{
env, fs, io, env, fs, io,
path::{Path, PathBuf}, path::{Path, PathBuf},
process::ExitStatus, process::ExitStatus,
sync::Arc,
thread::{self, JoinHandle}, thread::{self, JoinHandle},
}; };
use util::paths::PathLikeWithPosition; use util::paths::PathLikeWithPosition;
@ -123,26 +125,34 @@ fn main() -> Result<()> {
None None
}; };
let sender: JoinHandle<anyhow::Result<()>> = thread::spawn(move || { let exit_status = Arc::new(Mutex::new(None));
let (_, handshake) = server.accept().context("Handshake after Zed spawn")?;
let (tx, rx) = (handshake.requests, handshake.responses);
tx.send(CliRequest::Open {
paths,
wait: args.wait,
open_new_workspace,
dev_server_token: args.dev_server_token,
})?;
while let Ok(response) = rx.recv() { let sender: JoinHandle<anyhow::Result<()>> = thread::spawn({
match response { let exit_status = exit_status.clone();
CliResponse::Ping => {} move || {
CliResponse::Stdout { message } => println!("{message}"), let (_, handshake) = server.accept().context("Handshake after Zed spawn")?;
CliResponse::Stderr { message } => eprintln!("{message}"), let (tx, rx) = (handshake.requests, handshake.responses);
CliResponse::Exit { status } => std::process::exit(status), tx.send(CliRequest::Open {
paths,
wait: args.wait,
open_new_workspace,
dev_server_token: args.dev_server_token,
})?;
while let Ok(response) = rx.recv() {
match response {
CliResponse::Ping => {}
CliResponse::Stdout { message } => println!("{message}"),
CliResponse::Stderr { message } => eprintln!("{message}"),
CliResponse::Exit { status } => {
exit_status.lock().replace(status);
return Ok(());
}
}
} }
}
Ok(()) Ok(())
}
}); });
if args.foreground { if args.foreground {
@ -152,6 +162,9 @@ fn main() -> Result<()> {
sender.join().unwrap()?; sender.join().unwrap()?;
} }
if let Some(exit_status) = exit_status.lock().take() {
std::process::exit(exit_status);
}
Ok(()) Ok(())
} }

View File

@ -398,7 +398,8 @@ pub async fn handle_cli_connection(
} }
} }
} else if matches!(KEY_VALUE_STORE.read_kvp(FIRST_OPEN), Ok(None)) { } else if matches!(KEY_VALUE_STORE.read_kvp(FIRST_OPEN), Ok(None)) {
cx.update(|cx| show_welcome_view(app_state, cx)).log_err(); cx.update(|cx| show_welcome_view(app_state, cx).detach())
.log_err();
} else { } else {
cx.update(|cx| { cx.update(|cx| {
workspace::open_new(app_state, cx, |workspace, cx| { workspace::open_new(app_state, cx, |workspace, cx| {