mirror of
https://github.com/martinvonz/jj.git
synced 2024-10-26 00:19:59 +00:00
git_backend: wrap TableStoreError to preserve source error object
This commit is contained in:
parent
cf8a0466c4
commit
4e4ca46998
1 changed files with 28 additions and 10 deletions
|
@ -32,7 +32,9 @@ use crate::backend::{
|
|||
use crate::file_util::{IoResultExt as _, PathError};
|
||||
use crate::lock::FileLock;
|
||||
use crate::repo_path::{RepoPath, RepoPathComponent};
|
||||
use crate::stacked_table::{MutableTable, ReadonlyTable, TableSegment, TableStore};
|
||||
use crate::stacked_table::{
|
||||
MutableTable, ReadonlyTable, TableSegment, TableStore, TableStoreError,
|
||||
};
|
||||
|
||||
const HASH_LENGTH: usize = 20;
|
||||
const CHANGE_ID_LENGTH: usize = 16;
|
||||
|
@ -70,6 +72,21 @@ impl From<GitBackendLoadError> for BackendLoadError {
|
|||
}
|
||||
}
|
||||
|
||||
/// `GitBackend`-specific error that may occur after the backend is loaded.
|
||||
#[derive(Debug, Error)]
|
||||
pub enum GitBackendError {
|
||||
#[error("Failed to read non-git metadata: {0}")]
|
||||
ReadMetadata(#[source] TableStoreError),
|
||||
#[error("Failed to write non-git metadata: {0}")]
|
||||
WriteMetadata(#[source] TableStoreError),
|
||||
}
|
||||
|
||||
impl From<GitBackendError> for BackendError {
|
||||
fn from(err: GitBackendError) -> Self {
|
||||
BackendError::Other(err.into())
|
||||
}
|
||||
}
|
||||
|
||||
pub struct GitBackend {
|
||||
repo: Mutex<git2::Repository>,
|
||||
root_commit_id: CommitId,
|
||||
|
@ -147,9 +164,10 @@ impl GitBackend {
|
|||
match locked_head.as_ref() {
|
||||
Some(head) => Ok(head.clone()),
|
||||
None => {
|
||||
let table = self.extra_metadata_store.get_head().map_err(|err| {
|
||||
BackendError::Other(format!("Failed to read non-git metadata: {err}").into())
|
||||
})?;
|
||||
let table = self
|
||||
.extra_metadata_store
|
||||
.get_head()
|
||||
.map_err(GitBackendError::ReadMetadata)?;
|
||||
*locked_head = Some(table.clone());
|
||||
Ok(table)
|
||||
}
|
||||
|
@ -157,9 +175,11 @@ impl GitBackend {
|
|||
}
|
||||
|
||||
fn read_extra_metadata_table_locked(&self) -> BackendResult<(Arc<ReadonlyTable>, FileLock)> {
|
||||
self.extra_metadata_store.get_head_locked().map_err(|err| {
|
||||
BackendError::Other(format!("Failed to read non-git metadata: {err}").into())
|
||||
})
|
||||
let table = self
|
||||
.extra_metadata_store
|
||||
.get_head_locked()
|
||||
.map_err(GitBackendError::ReadMetadata)?;
|
||||
Ok(table)
|
||||
}
|
||||
|
||||
fn save_extra_metadata_table(
|
||||
|
@ -170,9 +190,7 @@ impl GitBackend {
|
|||
let table = self
|
||||
.extra_metadata_store
|
||||
.save_table(mut_table)
|
||||
.map_err(|err| {
|
||||
BackendError::Other(format!("Failed to write non-git metadata: {err}").into())
|
||||
})?;
|
||||
.map_err(GitBackendError::WriteMetadata)?;
|
||||
// Since the parent table was the head, saved table are likely to be new head.
|
||||
// If it's not, cache will be reloaded when entry can't be found.
|
||||
*self.cached_extra_metadata.lock().unwrap() = Some(table);
|
||||
|
|
Loading…
Reference in a new issue