Report build SHA to Slack for Zed Nightly panics (#34665)

Cole Miller created

There can be a bunch of nightlies with the same version number and it's
helpful to know exactly which one reported a panic.

Release Notes:

- N/A

Change summary

crates/collab/src/api/events.rs | 83 ++++++++++++++++++----------------
1 file changed, 44 insertions(+), 39 deletions(-)

Detailed changes

crates/collab/src/api/events.rs 🔗

@@ -389,53 +389,58 @@ pub async fn post_panic(
         }
     }
 
-    let backtrace = if panic.backtrace.len() > 25 {
-        let total = panic.backtrace.len();
-        format!(
-            "{}\n   and {} more",
-            panic
-                .backtrace
-                .iter()
-                .take(20)
-                .cloned()
-                .collect::<Vec<_>>()
-                .join("\n"),
-            total - 20
-        )
-    } else {
-        panic.backtrace.join("\n")
-    };
-
     if !report_to_slack(&panic) {
         return Ok(());
     }
 
-    let backtrace_with_summary = panic.payload + "\n" + &backtrace;
-
     if let Some(slack_panics_webhook) = app.config.slack_panics_webhook.clone() {
+        let backtrace = if panic.backtrace.len() > 25 {
+            let total = panic.backtrace.len();
+            format!(
+                "{}\n   and {} more",
+                panic
+                    .backtrace
+                    .iter()
+                    .take(20)
+                    .cloned()
+                    .collect::<Vec<_>>()
+                    .join("\n"),
+                total - 20
+            )
+        } else {
+            panic.backtrace.join("\n")
+        };
+        let backtrace_with_summary = panic.payload + "\n" + &backtrace;
+
+        let version = if panic.release_channel == "nightly"
+            && !panic.app_version.contains("remote-server")
+            && let Some(sha) = panic.app_commit_sha
+        {
+            format!("Zed Nightly {}", sha.chars().take(7).collect::<String>())
+        } else {
+            panic.app_version
+        };
+
         let payload = slack::WebhookBody::new(|w| {
             w.add_section(|s| s.text(slack::Text::markdown("Panic request".to_string())))
                 .add_section(|s| {
-                    s.add_field(slack::Text::markdown(format!(
-                        "*Version:*\n {} ",
-                        panic.app_version
-                    )))
-                    .add_field({
-                        let hostname = app.config.blob_store_url.clone().unwrap_or_default();
-                        let hostname = hostname.strip_prefix("https://").unwrap_or_else(|| {
-                            hostname.strip_prefix("http://").unwrap_or_default()
-                        });
-
-                        slack::Text::markdown(format!(
-                            "*{} {}:*\n<https://{}.{}/{}.json|{}…>",
-                            panic.os_name,
-                            panic.os_version.unwrap_or_default(),
-                            CRASH_REPORTS_BUCKET,
-                            hostname,
-                            incident_id,
-                            incident_id.chars().take(8).collect::<String>(),
-                        ))
-                    })
+                    s.add_field(slack::Text::markdown(format!("*Version:*\n {version} ",)))
+                        .add_field({
+                            let hostname = app.config.blob_store_url.clone().unwrap_or_default();
+                            let hostname = hostname.strip_prefix("https://").unwrap_or_else(|| {
+                                hostname.strip_prefix("http://").unwrap_or_default()
+                            });
+
+                            slack::Text::markdown(format!(
+                                "*{} {}:*\n<https://{}.{}/{}.json|{}…>",
+                                panic.os_name,
+                                panic.os_version.unwrap_or_default(),
+                                CRASH_REPORTS_BUCKET,
+                                hostname,
+                                incident_id,
+                                incident_id.chars().take(8).collect::<String>(),
+                            ))
+                        })
                 })
                 .add_rich_text(|r| r.add_preformatted(|p| p.add_text(backtrace_with_summary)))
         });