From d8cff2e32f07a8302800d6e0bc55cb17e5e7d682 Mon Sep 17 00:00:00 2001 From: Jun Wu Date: Thu, 29 Feb 2024 10:38:42 -0800 Subject: [PATCH] metalog: add refencode methods for ease-of-use Summary: Add application-specific concepts so the callsite does not have to use low-level APIs. Reviewed By: muirdm Differential Revision: D54201003 fbshipit-source-id: 3d713bfc4c56be041f724ae56c6a91922dd08bf0 --- eden/scm/lib/metalog/src/lib.rs | 1 + eden/scm/lib/metalog/src/metalog_ext.rs | 64 +++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 eden/scm/lib/metalog/src/metalog_ext.rs diff --git a/eden/scm/lib/metalog/src/lib.rs b/eden/scm/lib/metalog/src/lib.rs index 8b1239c4f24e2..d30054cfab78f 100644 --- a/eden/scm/lib/metalog/src/lib.rs +++ b/eden/scm/lib/metalog/src/lib.rs @@ -13,6 +13,7 @@ pub mod constants; mod errors; mod export; mod metalog; +mod metalog_ext; mod resolve; pub use errors::Error; diff --git a/eden/scm/lib/metalog/src/metalog_ext.rs b/eden/scm/lib/metalog/src/metalog_ext.rs new file mode 100644 index 0000000000000..3c7bdf73e23d7 --- /dev/null +++ b/eden/scm/lib/metalog/src/metalog_ext.rs @@ -0,0 +1,64 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This software may be used and distributed according to the terms of the + * GNU General Public License version 2. + */ + +//! Extended APIs for application-specific metalog. +use std::collections::BTreeMap; + +use anyhow::Result; +use types::HgId; + +use crate::MetaLog; + +impl MetaLog { + /// Decode bookmarks. + pub fn get_bookmarks(&self) -> Result> { + let decoded = match self.get("bookmarks")? { + Some(data) => refencode::decode_bookmarks(&data)?, + None => Default::default(), + }; + Ok(decoded) + } + + /// Decode remotenames. + pub fn get_remotenames(&self) -> Result> { + let decoded = match self.get("remotenames")? { + Some(data) => refencode::decode_remotenames(&data)?, + None => Default::default(), + }; + Ok(decoded) + } + + /// Decode visibleheads. + pub fn get_visibleheads(&self) -> Result> { + let decoded = match self.get("visibleheads")? { + Some(data) => refencode::decode_visibleheads(&data)?, + None => Default::default(), + }; + Ok(decoded) + } + + /// Update bookmarks. This does not write to disk until `commit`. + pub fn set_bookmarks(&mut self, value: &BTreeMap) -> Result<()> { + let encoded = refencode::encode_bookmarks(value); + self.set("bookmarks", &encoded)?; + Ok(()) + } + + /// Update remotenames. This does not write to disk until `commit`. + pub fn set_remotenames(&mut self, value: &BTreeMap) -> Result<()> { + let encoded = refencode::encode_remotenames(value); + self.set("remotenames", &encoded)?; + Ok(()) + } + + /// Update visibleheads. This does not write to disk until `commit`. + pub fn set_visibleheads(&mut self, value: &[HgId]) -> Result<()> { + let encoded = refencode::encode_visibleheads(value); + self.set("visibleheads", &encoded)?; + Ok(()) + } +}