mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00
use a distinct error for out-of-sync replica
This commit is contained in:
parent
c72cae648d
commit
ec35d4fa20
4 changed files with 36 additions and 6 deletions
|
@ -1,5 +1,5 @@
|
||||||
use crate::settings::Settings;
|
use crate::settings::Settings;
|
||||||
use taskchampion::{server::Server, Replica};
|
use taskchampion::{server::Server, Error as TCError, Replica};
|
||||||
use termcolor::WriteColor;
|
use termcolor::WriteColor;
|
||||||
|
|
||||||
pub(crate) fn execute<W: WriteColor>(
|
pub(crate) fn execute<W: WriteColor>(
|
||||||
|
@ -8,9 +8,32 @@ pub(crate) fn execute<W: WriteColor>(
|
||||||
settings: &Settings,
|
settings: &Settings,
|
||||||
server: &mut Box<dyn Server>,
|
server: &mut Box<dyn Server>,
|
||||||
) -> Result<(), crate::Error> {
|
) -> Result<(), crate::Error> {
|
||||||
replica.sync(server, settings.avoid_snapshots)?;
|
match replica.sync(server, settings.avoid_snapshots) {
|
||||||
writeln!(w, "sync complete.")?;
|
Ok(()) => {
|
||||||
Ok(())
|
writeln!(w, "sync complete.")?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Err(e) => match e.downcast() {
|
||||||
|
Ok(TCError::OutOfSync) => {
|
||||||
|
writeln!(w, "This replica cannot be synchronized with the server.")?;
|
||||||
|
writeln!(
|
||||||
|
w,
|
||||||
|
"It may be too old, or some other failure may have occurred."
|
||||||
|
)?;
|
||||||
|
writeln!(
|
||||||
|
w,
|
||||||
|
"To start fresh, remove the local task database and run `ta sync` again."
|
||||||
|
)?;
|
||||||
|
writeln!(
|
||||||
|
w,
|
||||||
|
"Note that doing so will lose any un-synchronized local changes."
|
||||||
|
)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Ok(e) => Err(e.into()),
|
||||||
|
Err(e) => Err(e.into()),
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -4,6 +4,12 @@ use thiserror::Error;
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
/// Errors returned from taskchampion operations
|
/// Errors returned from taskchampion operations
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
|
/// A task-database-related error
|
||||||
#[error("Task Database Error: {0}")]
|
#[error("Task Database Error: {0}")]
|
||||||
Database(String),
|
Database(String),
|
||||||
|
/// An error specifically indicating that the local replica cannot
|
||||||
|
/// be synchronized with the sever, due to being out of date or some
|
||||||
|
/// other irrecoverable error.
|
||||||
|
#[error("Local replica is out of sync with the server")]
|
||||||
|
OutOfSync,
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ impl Replica {
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
self.taskdb
|
self.taskdb
|
||||||
.sync(server, avoid_snapshots)
|
.sync(server, avoid_snapshots)
|
||||||
.context("Failed to synchronize")?;
|
.context("Failed to synchronize with server")?;
|
||||||
self.rebuild_working_set(false)
|
self.rebuild_working_set(false)
|
||||||
.context("Failed to rebuild working set after sync")?;
|
.context("Failed to rebuild working set after sync")?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use super::{ops, snapshot};
|
use super::{ops, snapshot};
|
||||||
use crate::server::{AddVersionResult, GetVersionResult, Server, SnapshotUrgency};
|
use crate::server::{AddVersionResult, GetVersionResult, Server, SnapshotUrgency};
|
||||||
use crate::storage::{Operation, StorageTxn};
|
use crate::storage::{Operation, StorageTxn};
|
||||||
|
use crate::Error;
|
||||||
use log::{info, trace, warn};
|
use log::{info, trace, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::str;
|
use std::str;
|
||||||
|
@ -97,7 +98,7 @@ pub(super) fn sync(
|
||||||
);
|
);
|
||||||
if let Some(requested) = requested_parent_version_id {
|
if let Some(requested) = requested_parent_version_id {
|
||||||
if parent_version_id == requested {
|
if parent_version_id == requested {
|
||||||
anyhow::bail!("Server's task history has diverged from this replica");
|
return Err(Error::OutOfSync.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
requested_parent_version_id = Some(parent_version_id);
|
requested_parent_version_id = Some(parent_version_id);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue