gitstore: raise errors from fetch directly

Summary: Now all APIs use anyhow errors. We can return early without converting error types.

Reviewed By: muirdm

Differential Revision: D57133391

fbshipit-source-id: a301103bab0759729b9fc058bbd77cd0761f7043
This commit is contained in:
Jun Wu 2024-05-08 20:01:37 -07:00 committed by Facebook GitHub Bot
parent 3b99a5c7ac
commit 06a6f84f44

View File

@ -104,16 +104,11 @@ impl GitStore {
if id.is_null() {
return Ok(Vec::new());
}
let fetch_err = if mode.is_local() {
None
} else {
self.fetch_objs(&[id]).err()
};
if !mode.is_local() {
self.fetch_objs(&[id])?;
}
let oid = hgid_to_git_oid(id);
let obj = self
.odb
.read(oid)
.map_err(|e| include_fetch_error(e, &fetch_err))?;
let obj = self.odb.read(oid)?;
if kind != git2::ObjectType::Any && obj.kind() != kind {
return Err(git2::Error::new(
git2::ErrorCode::NotFound,
@ -130,12 +125,9 @@ impl GitStore {
if id.is_null() {
return Ok(0);
}
let fetch_err = self.fetch_objs(&[id]).err();
self.fetch_objs(&[id])?;
let oid = hgid_to_git_oid(id);
let (size, obj_kind) = self
.odb
.read_header(oid)
.map_err(|e| include_fetch_error(e, &fetch_err))?;
let (size, obj_kind) = self.odb.read_header(oid)?;
if kind != git2::ObjectType::Any && obj_kind != kind {
return Err(git2::Error::new(
git2::ErrorCode::NotFound,
@ -265,29 +257,3 @@ fn update_progress(bar: &ProgressBar, line: &str) -> Option<()> {
}
Some(())
}
fn include_fetch_error(git2_err: git2::Error, fetch_err: &Option<anyhow::Error>) -> git2::Error {
match fetch_err {
None => git2_err,
Some(e) => {
let fetch_err_indented = indent(&e.to_string());
let git2_err_indented = indent(git2_err.message());
git2::Error::new(
git2_err.code(),
git2_err.class(),
format!(
"git fetch failed:\n{}This might cause:\n{}",
fetch_err_indented, git2_err_indented
),
)
}
}
}
fn indent(text: &str) -> String {
text.trim_end()
.lines()
.map(|l| format!(" {}", l))
.collect::<Vec<_>>()
.concat()
}