in focus/internals/src/lib/model/repo.rs [566:603]
fn configured_outlining_patterns(&self, commit_id: git2::Oid) -> Result<PatternSet> {
let repo = self.underlying();
let repo = repo.git_repo();
let commit = repo.find_commit(commit_id).context("Resolving commit")?;
let tree = commit.tree().context("Resolving tree")?;
let pattern_file = match tree.get_path(Path::new(OUTLINING_PATTERN_FILE_NAME)) {
Ok(pattern_file) => pattern_file,
Err(err) if err.code() == git2::ErrorCode::NotFound => {
return Ok(DEFAULT_OUTLINING_PATTERNS.clone())
}
Err(err) => {
anyhow::bail!(
"The outlining pattern file (named '{}') could not be loaded from the repository at this commit ({}): {}",
OUTLINING_PATTERN_FILE_NAME,
&commit.id().to_string(),
err,
);
}
};
let pattern_object = pattern_file.to_object(repo).context("Resolving object")?;
let pattern_blob = pattern_object.as_blob().ok_or_else(|| {
anyhow::anyhow!(
"Expected {} to be a blob, but it was not",
OUTLINING_PATTERN_FILE_NAME
)
})?;
let pattern_container: PatternContainer = serde_json::from_slice(pattern_blob.content())
.with_context(|| {
format!(
"Parsing outline pattern file '{}' (at commit {})",
OUTLINING_PATTERN_FILE_NAME,
&commit.id().to_string()
)
})?;
Ok(pattern_container.patterns)
}