Mercurial > public > mercurial-scm > hg-stable
view rust/hg-core/src/dirstate/owning.rs @ 53040:cdd7bf612c7b stable tip
bundle-spec: properly format boolean parameter (issue6960)
This was breaking automatic clone bundle generation. This changeset fixes it and
add a test to catch it in the future.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 11 Mar 2025 02:29:42 +0100 |
parents | d9d6ae9b9722 |
children |
line wrap: on
line source
use crate::DirstateParents; use super::{ dirstate_map::{DirstateIdentity, DirstateMap}, DirstateError, }; use self_cell::self_cell; use std::ops::Deref; self_cell!( /// Keep a `DirstateMap<'owner>` next to the `owner` buffer that it /// borrows. pub struct OwningDirstateMap { owner: Box<dyn Deref<Target = [u8]> + Send + Sync>, #[covariant] dependent: DirstateMap, } ); impl OwningDirstateMap { pub fn new_empty<OnDisk>( on_disk: OnDisk, identity: Option<DirstateIdentity>, ) -> Self where OnDisk: Deref<Target = [u8]> + Send + Sync + 'static, { let on_disk = Box::new(on_disk); OwningDirstateMap::new(on_disk, |bytes| { let mut empty = DirstateMap::empty(bytes); empty.identity = identity; empty }) } pub fn new_v1<OnDisk>( on_disk: OnDisk, identity: Option<DirstateIdentity>, ) -> Result<(Self, DirstateParents), DirstateError> where OnDisk: Deref<Target = [u8]> + Send + Sync + 'static, { let on_disk = Box::new(on_disk); let mut parents = DirstateParents::NULL; Ok(( OwningDirstateMap::try_new(on_disk, |bytes| { DirstateMap::new_v1(bytes, identity).map(|(dmap, p)| { parents = p.unwrap_or(DirstateParents::NULL); dmap }) })?, parents, )) } pub fn new_v2<OnDisk>( on_disk: OnDisk, data_size: usize, metadata: &[u8], uuid: Vec<u8>, identity: Option<DirstateIdentity>, ) -> Result<Self, DirstateError> where OnDisk: Deref<Target = [u8]> + Send + Sync + 'static, { let on_disk = Box::new(on_disk); OwningDirstateMap::try_new(on_disk, |bytes| { DirstateMap::new_v2(bytes, data_size, metadata, uuid, identity) }) } pub fn with_dmap_mut<R>( &mut self, f: impl FnOnce(&mut DirstateMap) -> R, ) -> R { self.with_dependent_mut(|_owner, dmap| f(dmap)) } pub fn get_map(&self) -> &DirstateMap { self.borrow_dependent() } pub fn on_disk(&self) -> &[u8] { self.borrow_owner() } pub fn old_uuid(&self) -> Option<&[u8]> { self.get_map().old_uuid.as_deref() } pub fn old_identity(&self) -> Option<DirstateIdentity> { self.get_map().identity } pub fn old_data_size(&self) -> usize { self.get_map().old_data_size } }