diff --git a/.changelogs/2021-10-11-issue23-client.md b/.changelogs/2021-10-11-issue23-client.md new file mode 100644 index 000000000..91a6b0f9e --- /dev/null +++ b/.changelogs/2021-10-11-issue23-client.md @@ -0,0 +1,2 @@ +- The `avoid_snapshots` configuration value, if set, will cause the replica to + avoid creating snapshots unless required. diff --git a/cli/src/invocation/cmd/sync.rs b/cli/src/invocation/cmd/sync.rs index f7c1151d2..a042a5bf4 100644 --- a/cli/src/invocation/cmd/sync.rs +++ b/cli/src/invocation/cmd/sync.rs @@ -1,13 +1,14 @@ +use crate::settings::Settings; use taskchampion::{server::Server, Replica}; use termcolor::WriteColor; pub(crate) fn execute( w: &mut W, replica: &mut Replica, + settings: &Settings, server: &mut Box, ) -> Result<(), crate::Error> { - // TODO: configurable avoid_snapshots - replica.sync(server, false)?; + replica.sync(server, settings.avoid_snapshots)?; writeln!(w, "sync complete.")?; Ok(()) } @@ -25,9 +26,10 @@ mod test { let mut replica = test_replica(); let server_dir = TempDir::new().unwrap(); let mut server = test_server(&server_dir); + let settings = Settings::default(); // Note that the details of the actual sync are tested thoroughly in the taskchampion crate - execute(&mut w, &mut replica, &mut server).unwrap(); + execute(&mut w, &mut replica, &settings, &mut server).unwrap(); assert_eq!(&w.into_string(), "sync complete.\n") } } diff --git a/cli/src/invocation/mod.rs b/cli/src/invocation/mod.rs index 640925a69..2f225f86a 100644 --- a/cli/src/invocation/mod.rs +++ b/cli/src/invocation/mod.rs @@ -87,7 +87,7 @@ pub(crate) fn invoke(command: Command, settings: Settings) -> Result<(), crate:: .. } => { let mut server = get_server(&settings)?; - return cmd::sync::execute(&mut w, &mut replica, &mut server); + return cmd::sync::execute(&mut w, &mut replica, &settings, &mut server); } // handled in the first match, but here to ensure this match is exhaustive diff --git a/cli/src/settings/settings.rs b/cli/src/settings/settings.rs index 7e94a637b..3dba86409 100644 --- a/cli/src/settings/settings.rs +++ b/cli/src/settings/settings.rs @@ -22,6 +22,7 @@ pub(crate) struct Settings { /// replica pub(crate) data_dir: PathBuf, + pub(crate) avoid_snapshots: bool, /// remote sync server pub(crate) server_client_key: Option, @@ -91,6 +92,7 @@ impl Settings { let table_keys = [ "data_dir", "modification_count_prompt", + "avoid_snapshots", "server_client_key", "server_origin", "encryption_secret", @@ -124,6 +126,20 @@ impl Settings { Ok(()) } + fn get_bool_cfg( + table: &Table, + name: &'static str, + setter: F, + ) -> Result<()> { + if let Some(v) = table.get(name) { + setter( + v.as_bool() + .ok_or_else(|| anyhow!(".{}: not a boolean value", name))?, + ); + } + Ok(()) + } + get_str_cfg(table, "data_dir", |v| { self.data_dir = v.into(); })?; @@ -132,6 +148,10 @@ impl Settings { self.modification_count_prompt = Some(v); })?; + get_bool_cfg(table, "avoid_snapshots", |v| { + self.avoid_snapshots = v; + })?; + get_str_cfg(table, "server_client_key", |v| { self.server_client_key = Some(v); })?; @@ -313,6 +333,7 @@ impl Default for Settings { filename: None, data_dir, modification_count_prompt: None, + avoid_snapshots: false, server_client_key: None, server_origin: None, encryption_secret: None, diff --git a/docs/src/config-file.md b/docs/src/config-file.md index 03639546f..73dc28b60 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -46,6 +46,12 @@ If using a remote server: * `server_client_key` - Client key to identify this replica to the sync server (a UUID) If not set, then sync is done to a local server. +## Snapshots + +* `avoid_snapshots` - If running on a CPU-, memory-, or bandwidth-constrained + device, set this to true. The effect is that this replica will wait longer + to produce a snapshot, in the hopes that other replicas will do so first. + ## Reports * `reports` - a mapping of each report's name to its definition.