fn share()

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)
    }