mononoke: add get_tree_revlog to RevlogRepo

Summary:
Add function similar to get_file_revlog to get tree manifest revlog.
Will be used in the next diffs.

Reviewed By: jsgf

Differential Revision: D5563895

fbshipit-source-id: 0ff84c458eb071763cbdc6d98bcf92e9b8ccc1b8
This commit is contained in:
Stanislau Hlebik 2017-08-18 04:23:01 -07:00 committed by Facebook Github Bot
parent 5849f4687d
commit 90b418c719

View File

@ -113,6 +113,7 @@ pub struct RevlogRepo {
#[derive(Debug)]
struct RevlogInner {
filelogcache: HashMap<Path, Revlog>, // filelog cache
treelogcache: HashMap<Path, Revlog>,
}
impl PartialEq<Self> for RevlogRepo {
@ -145,6 +146,7 @@ impl RevlogRepo {
manifest: manifest,
inner: Arc::new(Mutex::new(RevlogInner {
filelogcache: HashMap::new(),
treelogcache: HashMap::new(),
})),
})
}
@ -193,6 +195,25 @@ impl RevlogRepo {
&self.requirements
}
pub fn get_tree_revlog(&self, path: &Path) -> Result<Revlog> {
let mut inner = self.inner.lock().expect("poisoned lock");
match inner.treelogcache.entry(path.clone()) {
Entry::Occupied(log) => Ok(log.get().clone()),
Entry::Vacant(missing) => {
let dotencode = self.requirements.contains(&Required::Dotencode);
let path = self.basepath
.join("store/meta")
.join(path.fsencode_dir(dotencode))
.join("00manifest.i");
let revlog = Revlog::from_idx_data(path, None as Option<String>)?;
Ok(missing.insert(revlog).clone())
}
}
}
pub fn get_file_revlog(&self, path: &Path) -> Result<Revlog> {
let mut inner = self.inner.lock().expect("poisoned lock");
@ -206,8 +227,7 @@ impl RevlogRepo {
Entry::Vacant(missing) => {
let dotencode = self.requirements.contains(&Required::Dotencode);
let mut path = self.basepath
.join("store")
.join("data")
.join("store/data")
.join(path.fsencode_file(dotencode));
if let Some(ext) = path.extension()
.map(|ext| ext.to_string_lossy().into_owned())