41414ba
use gix::hash::ObjectId;
use serde::Serialize;
use serde::de::DeserializeOwned;
use crate::GitRepository;
use crate::error::Error;
pub const IMMUTABLE_TTL: u64 = 0;
pub const DERIVED_TTL: u64 = 60;
impl GitRepository {
pub(crate) fn tip_id(&self) -> Result<ObjectId, Error> {
let repo = self.repo()?;
repo.head_id()
.map(|id| id.detach())
.map_err(|e| Error::Ref(e.to_string()))
}
pub(crate) fn cache_get_oid<T>(&self, kind: &str, id: &ObjectId) -> Option<T>
where
T: DeserializeOwned + Send + Sync,
{
let k = format!("{kind}.{id}");
self.cache.object_pool_get_sync(&k)
}
pub(crate) fn cache_put_oid<T: Serialize>(&self, kind: &str, id: &ObjectId, v: &T) {
let k = format!("{kind}.{id}");
self.cache.set_sync_with_ttl(&k, v, IMMUTABLE_TTL);
}
pub(crate) fn cache_get_rev<T>(
&self,
module: &str,
func: &str,
key_part: &str,
tip: ObjectId,
) -> Option<T>
where
T: DeserializeOwned + Send + Sync,
{
let k = format!("{module}.{func}.{key_part}:{tip}");
self.cache.get_sync(&k)
}
pub(crate) fn cache_put_rev<T: Serialize>(
&self,
module: &str,
func: &str,
key_part: &str,
tip: ObjectId,
v: &T,
) {
let k = format!("{module}.{func}.{key_part}:{tip}");
self.cache.set_sync_with_ttl(&k, v, DERIVED_TTL);
}
}