in focus/internals/src/lib/index/object_database.rs [251:292]
fn put(
&self,
ctx: &HashContext,
key: &DependencyKey,
value: DependencyValue,
) -> anyhow::Result<()> {
let ContentHash(key_oid) = content_hash(ctx, key)?;
let payload = serde_json::to_vec(&value).context("serializing DependencyValue as JSON")?;
let value_oid = ctx
.repo()
.blob(&payload)
.context("writing DependencyValue as blob")?;
let mut kv_tree = match ctx.repo().find_reference(Self::REF_NAME) {
Ok(reference) => {
let tree = reference
.peel_to_tree()
.context("peeling kv tree reference")?;
ctx.repo()
.treebuilder(Some(&tree))
.context("initializing TreeBuilder from kv tree reference")?
}
Err(e) if e.code() == git2::ErrorCode::NotFound => ctx
.repo()
.treebuilder(None)
.context("initializing new TreeBuilder")?,
Err(e) => return Err(e.into()),
};
kv_tree
.insert(key_oid.to_string(), value_oid, git2::FileMode::Blob.into())
.context("adding entry to tree")?;
let kv_tree_oid = kv_tree.write().context("writing new tree")?;
ctx.repo()
.reference(
Self::REF_NAME,
kv_tree_oid,
true,
&format!("updating with key {:?}", key),
)
.context("updating reference")?;
Ok(())
}