Authenticate on startup if ZED_IMPERSONATE is assigned

Nathan Sobo and Max Brunsfeld created

Co-Authored-By: Max Brunsfeld <maxbrunsfeld@gmail.com>

Change summary

crates/client/src/client.rs |  2 +-
crates/zed/src/main.rs      | 10 ++++++++--
2 files changed, 9 insertions(+), 3 deletions(-)

Detailed changes

crates/client/src/client.rs 🔗

@@ -45,7 +45,7 @@ pub use user::*;
 lazy_static! {
     static ref ZED_SERVER_URL: String =
         std::env::var("ZED_SERVER_URL").unwrap_or("https://zed.dev".to_string());
-    static ref IMPERSONATE_LOGIN: Option<String> = std::env::var("ZED_IMPERSONATE")
+    pub static ref IMPERSONATE_LOGIN: Option<String> = std::env::var("ZED_IMPERSONATE")
         .ok()
         .and_then(|s| if s.is_empty() { None } else { Some(s) });
 }

crates/zed/src/main.rs 🔗

@@ -81,8 +81,14 @@ fn main() {
         cx.spawn({
             let client = client.clone();
             |cx| async move {
-                if !stdout_is_a_pty() && client.has_keychain_credentials(&cx) {
-                    client.authenticate_and_connect(true, &cx).await?;
+                if stdout_is_a_pty() {
+                    if client::IMPERSONATE_LOGIN.is_some() {
+                        client.authenticate_and_connect(false, &cx).await?;
+                    }
+                } else {
+                    if client.has_keychain_credentials(&cx) {
+                        client.authenticate_and_connect(true, &cx).await?;
+                    }
                 }
                 Ok::<_, anyhow::Error>(())
             }