Fix handling of `--system-specs` argument so it happens before `Application::new` (#29240)

Ben Kunkle created

Fixes issue described in [description of
#28683](https://github.com/zed-industries/zed/issues/28683#issue-2992849891)

Makes sure that the `--system-specs` arg is handled before
`Application::new` is called, so that it can be used even when Zed is
panicking during app initialization (e.g. Failing to create a Vulkan
context in blade)

Release Notes:

- Fixed an issue where the `--system-specs` arg wouldn't work if Zed
panicked during app initialization (e.g. When failing to create a Vulkan
context in blade)

Change summary

crates/release_channel/src/lib.rs |  4 ++--
crates/remote_server/src/unix.rs  |  2 +-
crates/zed/src/main.rs            | 27 ++++++++++++++-------------
3 files changed, 17 insertions(+), 16 deletions(-)

Detailed changes

crates/release_channel/src/lib.rs 🔗

@@ -63,8 +63,8 @@ impl Global for GlobalAppVersion {}
 pub struct AppVersion;
 
 impl AppVersion {
-    /// Initializes the global [`AppVersion`].
-    pub fn init(pkg_version: &str) -> SemanticVersion {
+    /// Load the app version from env.
+    pub fn load(pkg_version: &str) -> SemanticVersion {
         if let Ok(from_env) = env::var("ZED_APP_VERSION") {
             from_env.parse().expect("invalid ZED_APP_VERSION")
         } else {

crates/remote_server/src/unix.rs 🔗

@@ -428,7 +428,7 @@ pub fn execute_run(
     let git_hosting_provider_registry = Arc::new(GitHostingProviderRegistry::new());
     gpui::Application::headless().run(move |cx| {
         settings::init(cx);
-        let app_version = AppVersion::init(env!("ZED_PKG_VERSION"));
+        let app_version = AppVersion::load(env!("ZED_PKG_VERSION"));
         release_channel::init(app_version, cx);
         gpui_tokio::init(cx);
 

crates/zed/src/main.rs 🔗

@@ -218,6 +218,20 @@ fn main() {
         };
     }
 
+    let app_version = AppVersion::load(env!("CARGO_PKG_VERSION"));
+    let app_commit_sha =
+        option_env!("ZED_COMMIT_SHA").map(|commit_sha| AppCommitSha(commit_sha.to_string()));
+
+    if args.system_specs {
+        let system_specs = feedback::system_specs::SystemSpecs::new_stateless(
+            app_version,
+            app_commit_sha.clone(),
+            *release_channel::RELEASE_CHANNEL,
+        );
+        println!("Zed System Specs (from CLI):\n{}", system_specs);
+        return;
+    }
+
     log::info!("========== starting zed ==========");
 
     let app = Application::new().with_assets(Assets);
@@ -226,9 +240,6 @@ fn main() {
     let installation_id = app.background_executor().block(installation_id()).ok();
     let session_id = Uuid::new_v4().to_string();
     let session = app.background_executor().block(Session::new());
-    let app_version = AppVersion::init(env!("CARGO_PKG_VERSION"));
-    let app_commit_sha =
-        option_env!("ZED_COMMIT_SHA").map(|commit_sha| AppCommitSha(commit_sha.to_string()));
 
     reliability::init_panic_hook(
         app_version,
@@ -238,16 +249,6 @@ fn main() {
         session_id.clone(),
     );
 
-    if args.system_specs {
-        let system_specs = feedback::system_specs::SystemSpecs::new_stateless(
-            app_version,
-            app_commit_sha.clone(),
-            *release_channel::RELEASE_CHANNEL,
-        );
-        println!("Zed System Specs (from CLI):\n{}", system_specs);
-        return;
-    }
-
     let (open_listener, mut open_rx) = OpenListener::new();
 
     let failed_single_instance_check =