use crate::error::{Error, Result};
use crate::prune::parse_size;
use crate::types::{Target, GIT_REF_THRESHOLD};
use super::Store;
pub(crate) const OBJECT_MAX_SIZE_KEY: &str = "meta:sqlite:object-max-size";
pub(crate) const LOCAL_OBJECT_MAX_SIZE_KEY: &str = "local:meta:sqlite:object-max-size";
impl Store {
pub fn object_max_size(&self) -> Result<usize> {
for key in [LOCAL_OBJECT_MAX_SIZE_KEY, OBJECT_MAX_SIZE_KEY] {
let Some(raw) = self.read_config_string(key)? else {
continue;
};
let bytes = parse_size(&raw)
.map_err(|_| Error::InvalidValue(format!("invalid {key} value: {raw}")))?;
return Ok(usize::try_from(bytes).unwrap_or(usize::MAX));
}
Ok(GIT_REF_THRESHOLD)
}
fn read_config_string(&self, key: &str) -> Result<Option<String>> {
match self.get(&Target::project(), key)? {
Some(entry) => Ok(Some(serde_json::from_str(&entry.value)?)),
None => Ok(None),
}
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests {
use super::*;
use crate::types::ValueType;
fn set_config(db: &Store, key: &str, value: &str) {
let json = serde_json::to_string(value).unwrap();
db.set(
&Target::project(),
key,
&json,
&ValueType::String,
"a@b.com",
1000,
)
.unwrap();
}
#[test]
fn defaults_to_git_ref_threshold() {
let db = Store::open_in_memory().unwrap();
assert_eq!(db.object_max_size().unwrap(), GIT_REF_THRESHOLD);
}
#[test]
fn shared_key_overrides_default() {
let db = Store::open_in_memory().unwrap();
set_config(&db, OBJECT_MAX_SIZE_KEY, "4k");
assert_eq!(db.object_max_size().unwrap(), 4096);
}
#[test]
fn local_key_takes_precedence_over_shared() {
let db = Store::open_in_memory().unwrap();
set_config(&db, OBJECT_MAX_SIZE_KEY, "4k");
set_config(&db, LOCAL_OBJECT_MAX_SIZE_KEY, "16");
assert_eq!(db.object_max_size().unwrap(), 16);
}
#[test]
fn plain_byte_count_is_accepted() {
let db = Store::open_in_memory().unwrap();
set_config(&db, OBJECT_MAX_SIZE_KEY, "2048");
assert_eq!(db.object_max_size().unwrap(), 2048);
}
#[test]
fn invalid_value_errors() {
let db = Store::open_in_memory().unwrap();
set_config(&db, OBJECT_MAX_SIZE_KEY, "not-a-size");
assert!(db.object_max_size().is_err());
}
}