Add auto update setting

Mikayla Maki created

Change summary

assets/settings/default.json          |  2 ++
crates/auto_update/src/auto_update.rs | 19 ++++++++++++++++++-
crates/settings/src/settings.rs       |  6 ++++++
3 files changed, 26 insertions(+), 1 deletion(-)

Detailed changes

assets/settings/default.json 🔗

@@ -90,6 +90,8 @@
         // Send anonymized usage data like what languages you're using Zed with.
         "metrics": true
     },
+    // Automatically update Zed
+    "auto_update": true,
     // Git gutter behavior configuration.
     "git": {
         // Control whether the git gutter is shown. May take 2 values:

crates/auto_update/src/auto_update.rs 🔗

@@ -9,6 +9,7 @@ use gpui::{
     MutableAppContext, Task, WeakViewHandle,
 };
 use serde::Deserialize;
+use settings::Settings;
 use smol::{fs::File, io::AsyncReadExt, process::Command};
 use std::{ffi::OsString, sync::Arc, time::Duration};
 use update_notification::UpdateNotification;
@@ -53,7 +54,23 @@ pub fn init(http_client: Arc<dyn HttpClient>, server_url: String, cx: &mut Mutab
         let server_url = server_url;
         let auto_updater = cx.add_model(|cx| {
             let updater = AutoUpdater::new(version, http_client, server_url.clone());
-            updater.start_polling(cx).detach();
+
+            let mut update_subscription = cx
+                .global::<Settings>()
+                .auto_update
+                .then(|| updater.start_polling(cx));
+
+            cx.observe_global::<Settings, _>(move |updater, cx| {
+                if cx.global::<Settings>().auto_update {
+                    if update_subscription.is_none() {
+                        *(&mut update_subscription) = Some(updater.start_polling(cx))
+                    }
+                } else {
+                    (&mut update_subscription).take();
+                }
+            })
+            .detach();
+
             updater
         });
         cx.set_global(Some(auto_updater));

crates/settings/src/settings.rs 🔗

@@ -53,6 +53,7 @@ pub struct Settings {
     pub theme: Arc<Theme>,
     pub telemetry_defaults: TelemetrySettings,
     pub telemetry_overrides: TelemetrySettings,
+    pub auto_update: bool,
 }
 
 #[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
@@ -312,6 +313,8 @@ pub struct SettingsFileContent {
     pub theme: Option<String>,
     #[serde(default)]
     pub telemetry: TelemetrySettings,
+    #[serde(default)]
+    pub auto_update: Option<bool>,
 }
 
 #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
@@ -375,6 +378,7 @@ impl Settings {
             theme: themes.get(&defaults.theme.unwrap()).unwrap(),
             telemetry_defaults: defaults.telemetry,
             telemetry_overrides: Default::default(),
+            auto_update: defaults.auto_update.unwrap(),
         }
     }
 
@@ -427,6 +431,7 @@ impl Settings {
         self.language_overrides = data.languages;
         self.telemetry_overrides = data.telemetry;
         self.lsp = data.lsp;
+        merge(&mut self.auto_update, data.auto_update);
     }
 
     pub fn with_language_defaults(
@@ -573,6 +578,7 @@ impl Settings {
                 metrics: Some(true),
             },
             telemetry_overrides: Default::default(),
+            auto_update: true,
         }
     }