in content-addressed-cache/src/synchronizer.rs [251:320]
fn share(
&self,
keyset_id: KeysetID,
keyset: &Keyset,
cache: &dyn Cache,
previous_keyset_id: Option<KeysetID>,
) -> Result<KeysetID> {
let mut kv_tree = self
.repo
.treebuilder(None)
.context("initializing new TreeBuilder")?;
for (kind, key) in keyset.iter() {
let payload = cache.get(*kind, *key)?.unwrap();
let value_oid = self
.repo
.blob(&payload)
.context("writing DependencyValue as blob")?;
kv_tree
.insert(
CompositeKey {
key: *key,
kind: *kind,
}
.to_string(),
value_oid,
git2::FileMode::Blob.into(),
)
.context("adding entry to tree")?;
}
let kv_tree_oid = kv_tree.write().context("writing new tree")?;
let signature = git2::Signature::now(&self.username, &self.email)?;
let prev_commit_vec = match previous_keyset_id {
Some(prev_commit_oid) => vec![self
.repo
.find_reference(&tag_fmt(&self.namespace, prev_commit_oid)[..])?
.peel_to_commit()?],
None => vec![],
};
let vec_of_prev_commit_references: Vec<&Commit> = prev_commit_vec.iter().collect();
let commit_oid = self.repo.commit(
None,
&signature,
&signature,
&format!("index for {}", keyset_id)[..],
&self.repo.find_tree(kv_tree_oid)?,
&vec_of_prev_commit_references[..],
)?;
let refspecs = vec![refspec_fmt(&self.namespace, keyset_id)];
self.repo
.reference(
&tag_fmt(&self.namespace, keyset_id)[..],
commit_oid,
true,
"Tree is used as key-value store.",
)
.context("updating reference")?;
git_helper::push_refs(
self.path.as_path(),
refspecs.into_iter(),
self.remote.as_str(),
self.app.clone(),
)?;
Ok(keyset_id)
}