rust/hg-core/src/revlog/index.rs
author Simon Sapin <simon.sapin@octobus.net>
Tue, 21 Dec 2021 21:23:46 +0100
changeset 48543 0a4ac916673e
parent 48458 96ea4db4741b
child 48546 e91aa800ae5b
permissions -rw-r--r--
rhg: RevlogEntry::uncompressed_len is signed The corresponding Python code appears to explicitly check for non-negative values. Differential Revision: https://phab.mercurial-scm.org/D11962
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 45602
diff changeset
     1
use std::convert::TryInto;
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
     2
use std::ops::Deref;
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
     3
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
     4
use byteorder::{BigEndian, ByteOrder};
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
     5
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46090
diff changeset
     6
use crate::errors::HgError;
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 45602
diff changeset
     7
use crate::revlog::node::Node;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
     8
use crate::revlog::{Revision, NULL_REVISION};
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
     9
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    10
pub const INDEX_ENTRY_SIZE: usize = 64;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    11
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    12
pub struct IndexHeader {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    13
    header_bytes: [u8; 4],
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    14
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    15
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    16
#[derive(Copy, Clone)]
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    17
pub struct IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    18
    flags: u16,
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    19
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    20
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    21
/// Corresponds to the high bits of `_format_flags` in python
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    22
impl IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    23
    /// Corresponds to FLAG_INLINE_DATA in python
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    24
    pub fn is_inline(self) -> bool {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    25
        return self.flags & 1 != 0;
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    26
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    27
    /// Corresponds to FLAG_GENERALDELTA in python
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    28
    pub fn uses_generaldelta(self) -> bool {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    29
        return self.flags & 2 != 0;
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    30
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    31
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    32
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    33
/// Corresponds to the INDEX_HEADER structure,
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    34
/// which is parsed as a `header` variable in `_loadindex` in `revlog.py`
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    35
impl IndexHeader {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    36
    fn format_flags(&self) -> IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    37
        // No "unknown flags" check here, unlike in python. Maybe there should
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    38
        // be.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    39
        return IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    40
            flags: BigEndian::read_u16(&self.header_bytes[0..2]),
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    41
        };
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    42
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    43
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    44
    /// The only revlog version currently supported by rhg.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    45
    const REVLOGV1: u16 = 1;
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    46
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    47
    /// Corresponds to `_format_version` in Python.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    48
    fn format_version(&self) -> u16 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    49
        return BigEndian::read_u16(&self.header_bytes[2..4]);
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    50
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    51
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    52
    const EMPTY_INDEX_HEADER: IndexHeader = IndexHeader {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    53
        // We treat an empty file as a valid index with no entries.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    54
        // Here we make an arbitrary choice of what we assume the format of the
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    55
        // index to be (V1, using generaldelta).
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    56
        // This doesn't matter too much, since we're only doing read-only
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    57
        // access. but the value corresponds to the `new_header` variable in
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    58
        // `revlog.py`, `_loadindex`
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    59
        header_bytes: [0, 3, 0, 1],
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    60
    };
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    61
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    62
    fn parse(index_bytes: &[u8]) -> Result<IndexHeader, HgError> {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    63
        if index_bytes.len() == 0 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    64
            return Ok(IndexHeader::EMPTY_INDEX_HEADER);
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    65
        }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    66
        if index_bytes.len() < 4 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    67
            return Err(HgError::corrupted(
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    68
                "corrupted revlog: can't read the index format header",
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    69
            ));
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    70
        }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    71
        return Ok(IndexHeader {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    72
            header_bytes: {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    73
                let bytes: [u8; 4] =
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    74
                    index_bytes[0..4].try_into().expect("impossible");
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    75
                bytes
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    76
            },
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    77
        });
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    78
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    79
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    80
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    81
/// A Revlog index
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
    82
pub struct Index {
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
    83
    bytes: Box<dyn Deref<Target = [u8]> + Send>,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    84
    /// Offsets of starts of index blocks.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    85
    /// Only needed when the index is interleaved with data.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    86
    offsets: Option<Vec<usize>>,
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
    87
    uses_generaldelta: bool,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    88
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    89
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
    90
impl Index {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    91
    /// Create an index from bytes.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    92
    /// Calculate the start of each entry when is_inline is true.
45602
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
    93
    pub fn new(
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
    94
        bytes: Box<dyn Deref<Target = [u8]> + Send>,
47963
001d747c2baf rust: Return HgError instead of RevlogError in revlog constructors
Simon Sapin <simon.sapin@octobus.net>
parents: 46887
diff changeset
    95
    ) -> Result<Self, HgError> {
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    96
        let header = IndexHeader::parse(bytes.as_ref())?;
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    97
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    98
        if header.format_version() != IndexHeader::REVLOGV1 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
    99
            // A proper new version should have had a repo/store
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   100
            // requirement.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   101
            return Err(HgError::corrupted("unsupported revlog version"));
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   102
        }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   103
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   104
        // This is only correct because we know version is REVLOGV1.
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   105
        // In v2 we always use generaldelta, while in v0 we never use
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   106
        // generaldelta. Similar for [is_inline] (it's only used in v1).
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   107
        let uses_generaldelta = header.format_flags().uses_generaldelta();
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   108
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   109
        if header.format_flags().is_inline() {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   110
            let mut offset: usize = 0;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   111
            let mut offsets = Vec::new();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   112
45590
11f3c3f408fd hg-core: minor code style change (D8958#inline-14993 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
   113
            while offset + INDEX_ENTRY_SIZE <= bytes.len() {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   114
                offsets.push(offset);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   115
                let end = offset + INDEX_ENTRY_SIZE;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   116
                let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   117
                    bytes: &bytes[offset..end],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   118
                    offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   119
                };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   120
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
   121
                offset += INDEX_ENTRY_SIZE + entry.compressed_len() as usize;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   122
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   123
45602
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   124
            if offset == bytes.len() {
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   125
                Ok(Self {
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   126
                    bytes,
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   127
                    offsets: Some(offsets),
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   128
                    uses_generaldelta,
45602
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   129
                })
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   130
            } else {
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46090
diff changeset
   131
                Err(HgError::corrupted("unexpected inline revlog length")
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46090
diff changeset
   132
                    .into())
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   133
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   134
        } else {
45602
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   135
            Ok(Self {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   136
                bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   137
                offsets: None,
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   138
                uses_generaldelta,
45602
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45601
diff changeset
   139
            })
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   140
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   141
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   142
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   143
    pub fn uses_generaldelta(&self) -> bool {
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   144
        self.uses_generaldelta
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   145
    }
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   146
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   147
    /// Value of the inline flag.
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   148
    pub fn is_inline(&self) -> bool {
48226
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
   149
        self.offsets.is_some()
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   150
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   151
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   152
    /// Return a slice of bytes if `revlog` is inline. Panic if not.
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   153
    pub fn data(&self, start: usize, end: usize) -> &[u8] {
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   154
        if !self.is_inline() {
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   155
            panic!("tried to access data in the index of a revlog that is not inline");
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   156
        }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   157
        &self.bytes[start..end]
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   158
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   159
45536
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   160
    /// Return number of entries of the revlog index.
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   161
    pub fn len(&self) -> usize {
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   162
        if let Some(offsets) = &self.offsets {
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   163
            offsets.len()
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   164
        } else {
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   165
            self.bytes.len() / INDEX_ENTRY_SIZE
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   166
        }
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   167
    }
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   168
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   169
    /// Returns `true` if the `Index` has zero `entries`.
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   170
    pub fn is_empty(&self) -> bool {
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   171
        self.len() == 0
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   172
    }
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
   173
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   174
    /// Return the index entry corresponding to the given revision if it
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   175
    /// exists.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   176
    pub fn get_entry(&self, rev: Revision) -> Option<IndexEntry> {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   177
        if rev == NULL_REVISION {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   178
            return None;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   179
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   180
        if let Some(offsets) = &self.offsets {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   181
            self.get_entry_inline(rev, offsets)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   182
        } else {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   183
            self.get_entry_separated(rev)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   184
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   185
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   186
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   187
    fn get_entry_inline(
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   188
        &self,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   189
        rev: Revision,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   190
        offsets: &[usize],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   191
    ) -> Option<IndexEntry> {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   192
        let start = *offsets.get(rev as usize)?;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   193
        let end = start.checked_add(INDEX_ENTRY_SIZE)?;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   194
        let bytes = &self.bytes[start..end];
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   195
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   196
        // See IndexEntry for an explanation of this override.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   197
        let offset_override = Some(end);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   198
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   199
        Some(IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   200
            bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   201
            offset_override,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   202
        })
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   203
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   204
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   205
    fn get_entry_separated(&self, rev: Revision) -> Option<IndexEntry> {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   206
        let max_rev = self.bytes.len() / INDEX_ENTRY_SIZE;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   207
        if rev as usize >= max_rev {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   208
            return None;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   209
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   210
        let start = rev as usize * INDEX_ENTRY_SIZE;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   211
        let end = start + INDEX_ENTRY_SIZE;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   212
        let bytes = &self.bytes[start..end];
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   213
45591
f38adf8b0711 hg-core: Explain offset override of first revision
Antoine cezar<acezar@chwitlabs.fr>
parents: 45590
diff changeset
   214
        // Override the offset of the first revision as its bytes are used
f38adf8b0711 hg-core: Explain offset override of first revision
Antoine cezar<acezar@chwitlabs.fr>
parents: 45590
diff changeset
   215
        // for the index's metadata (saving space because it is always 0)
45592
a886ffd2ffc6 hg-core: minor code style change (D8958#inline-14986 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45591
diff changeset
   216
        let offset_override = if rev == 0 { Some(0) } else { None };
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   217
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   218
        Some(IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   219
            bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   220
            offset_override,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   221
        })
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   222
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   223
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   224
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   225
impl super::RevlogIndex for Index {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   226
    fn len(&self) -> usize {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   227
        self.len()
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   228
    }
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   229
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   230
    fn node(&self, rev: Revision) -> Option<&Node> {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   231
        self.get_entry(rev).map(|entry| entry.hash())
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   232
    }
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   233
}
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   234
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   235
#[derive(Debug)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   236
pub struct IndexEntry<'a> {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   237
    bytes: &'a [u8],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   238
    /// Allows to override the offset value of the entry.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   239
    ///
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   240
    /// For interleaved index and data, the offset stored in the index
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   241
    /// corresponds to the separated data offset.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   242
    /// It has to be overridden with the actual offset in the interleaved
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   243
    /// index which is just after the index block.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   244
    ///
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   245
    /// For separated index and data, the offset stored in the first index
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   246
    /// entry is mixed with the index headers.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   247
    /// It has to be overridden with 0.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   248
    offset_override: Option<usize>,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   249
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   250
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   251
impl<'a> IndexEntry<'a> {
45593
da30e4b553c3 hg-core: minor docstring update (D8958#inline-14991 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45592
diff changeset
   252
    /// Return the offset of the data.
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   253
    pub fn offset(&self) -> usize {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   254
        if let Some(offset_override) = self.offset_override {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   255
            offset_override
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   256
        } else {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   257
            let mut bytes = [0; 8];
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   258
            bytes[2..8].copy_from_slice(&self.bytes[0..=5]);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   259
            BigEndian::read_u64(&bytes[..]) as usize
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   260
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   261
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   262
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   263
    /// Return the compressed length of the data.
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
   264
    pub fn compressed_len(&self) -> u32 {
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
   265
        BigEndian::read_u32(&self.bytes[8..=11])
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   266
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   267
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   268
    /// Return the uncompressed length of the data.
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
   269
    pub fn uncompressed_len(&self) -> i32 {
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
   270
        BigEndian::read_i32(&self.bytes[12..=15])
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   271
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   272
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   273
    /// Return the revision upon which the data has been derived.
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   274
    pub fn base_revision_or_base_of_delta_chain(&self) -> Revision {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   275
        // TODO Maybe return an Option when base_revision == rev?
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   276
        //      Requires to add rev to IndexEntry
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   277
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   278
        BigEndian::read_i32(&self.bytes[16..])
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   279
    }
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   280
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   281
    pub fn p1(&self) -> Revision {
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   282
        BigEndian::read_i32(&self.bytes[24..])
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   283
    }
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   284
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   285
    pub fn p2(&self) -> Revision {
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   286
        BigEndian::read_i32(&self.bytes[28..])
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   287
    }
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   288
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   289
    /// Return the hash of revision's full text.
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   290
    ///
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   291
    /// Currently, SHA-1 is used and only the first 20 bytes of this field
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   292
    /// are used.
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
   293
    pub fn hash(&self) -> &'a Node {
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 45602
diff changeset
   294
        (&self.bytes[32..52]).try_into().unwrap()
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
   295
    }
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   296
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   297
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   298
#[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   299
mod tests {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   300
    use super::*;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   301
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   302
    #[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   303
    #[derive(Debug, Copy, Clone)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   304
    pub struct IndexEntryBuilder {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   305
        is_first: bool,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   306
        is_inline: bool,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   307
        is_general_delta: bool,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   308
        version: u16,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   309
        offset: usize,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   310
        compressed_len: usize,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   311
        uncompressed_len: usize,
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   312
        base_revision_or_base_of_delta_chain: Revision,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   313
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   314
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   315
    #[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   316
    impl IndexEntryBuilder {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   317
        pub fn new() -> Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   318
            Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   319
                is_first: false,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   320
                is_inline: false,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   321
                is_general_delta: true,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   322
                version: 2,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   323
                offset: 0,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   324
                compressed_len: 0,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   325
                uncompressed_len: 0,
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   326
                base_revision_or_base_of_delta_chain: 0,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   327
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   328
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   329
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   330
        pub fn is_first(&mut self, value: bool) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   331
            self.is_first = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   332
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   333
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   334
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   335
        pub fn with_inline(&mut self, value: bool) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   336
            self.is_inline = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   337
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   338
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   339
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   340
        pub fn with_general_delta(&mut self, value: bool) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   341
            self.is_general_delta = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   342
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   343
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   344
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   345
        pub fn with_version(&mut self, value: u16) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   346
            self.version = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   347
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   348
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   349
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   350
        pub fn with_offset(&mut self, value: usize) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   351
            self.offset = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   352
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   353
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   354
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   355
        pub fn with_compressed_len(&mut self, value: usize) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   356
            self.compressed_len = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   357
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   358
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   359
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   360
        pub fn with_uncompressed_len(&mut self, value: usize) -> &mut Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   361
            self.uncompressed_len = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   362
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   363
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   364
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   365
        pub fn with_base_revision_or_base_of_delta_chain(
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   366
            &mut self,
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   367
            value: Revision,
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   368
        ) -> &mut Self {
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   369
            self.base_revision_or_base_of_delta_chain = value;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   370
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   371
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   372
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   373
        pub fn build(&self) -> Vec<u8> {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   374
            let mut bytes = Vec::with_capacity(INDEX_ENTRY_SIZE);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   375
            if self.is_first {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   376
                bytes.extend(&match (self.is_general_delta, self.is_inline) {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   377
                    (false, false) => [0u8, 0],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   378
                    (false, true) => [0u8, 1],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   379
                    (true, false) => [0u8, 2],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   380
                    (true, true) => [0u8, 3],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   381
                });
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   382
                bytes.extend(&self.version.to_be_bytes());
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   383
                // Remaining offset bytes.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   384
                bytes.extend(&[0u8; 2]);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   385
            } else {
46887
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46443
diff changeset
   386
                // Offset stored on 48 bits (6 bytes)
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46443
diff changeset
   387
                bytes.extend(&(self.offset as u64).to_be_bytes()[2..]);
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   388
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   389
            bytes.extend(&[0u8; 2]); // Revision flags.
46887
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46443
diff changeset
   390
            bytes.extend(&(self.compressed_len as u32).to_be_bytes());
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46443
diff changeset
   391
            bytes.extend(&(self.uncompressed_len as u32).to_be_bytes());
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   392
            bytes.extend(
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   393
                &self.base_revision_or_base_of_delta_chain.to_be_bytes(),
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   394
            );
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   395
            bytes
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   396
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   397
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   398
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   399
    pub fn is_inline(index_bytes: &[u8]) -> bool {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   400
        IndexHeader::parse(index_bytes)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   401
            .expect("too short")
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   402
            .format_flags()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   403
            .is_inline()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   404
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   405
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   406
    pub fn uses_generaldelta(index_bytes: &[u8]) -> bool {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   407
        IndexHeader::parse(index_bytes)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   408
            .expect("too short")
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   409
            .format_flags()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   410
            .uses_generaldelta()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   411
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   412
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   413
    pub fn get_version(index_bytes: &[u8]) -> u16 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   414
        IndexHeader::parse(index_bytes)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   415
            .expect("too short")
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   416
            .format_version()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   417
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   418
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   419
    #[test]
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   420
    fn flags_when_no_inline_flag_test() {
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   421
        let bytes = IndexEntryBuilder::new()
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   422
            .is_first(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   423
            .with_general_delta(false)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   424
            .with_inline(false)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   425
            .build();
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   426
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   427
        assert_eq!(is_inline(&bytes), false);
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   428
        assert_eq!(uses_generaldelta(&bytes), false);
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   429
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   430
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   431
    #[test]
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   432
    fn flags_when_inline_flag_test() {
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   433
        let bytes = IndexEntryBuilder::new()
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   434
            .is_first(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   435
            .with_general_delta(false)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   436
            .with_inline(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   437
            .build();
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   438
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   439
        assert_eq!(is_inline(&bytes), true);
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   440
        assert_eq!(uses_generaldelta(&bytes), false);
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   441
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   442
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   443
    #[test]
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   444
    fn flags_when_inline_and_generaldelta_flags_test() {
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   445
        let bytes = IndexEntryBuilder::new()
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   446
            .is_first(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   447
            .with_general_delta(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   448
            .with_inline(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   449
            .build();
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   450
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   451
        assert_eq!(is_inline(&bytes), true);
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   452
        assert_eq!(uses_generaldelta(&bytes), true);
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   453
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   454
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   455
    #[test]
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   456
    fn test_offset() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   457
        let bytes = IndexEntryBuilder::new().with_offset(1).build();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   458
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   459
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   460
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   461
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   462
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   463
        assert_eq!(entry.offset(), 1)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   464
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   465
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   466
    #[test]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   467
    fn test_with_overridden_offset() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   468
        let bytes = IndexEntryBuilder::new().with_offset(1).build();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   469
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   470
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   471
            offset_override: Some(2),
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   472
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   473
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   474
        assert_eq!(entry.offset(), 2)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   475
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   476
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   477
    #[test]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   478
    fn test_compressed_len() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   479
        let bytes = IndexEntryBuilder::new().with_compressed_len(1).build();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   480
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   481
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   482
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   483
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   484
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   485
        assert_eq!(entry.compressed_len(), 1)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   486
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   487
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   488
    #[test]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   489
    fn test_uncompressed_len() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   490
        let bytes = IndexEntryBuilder::new().with_uncompressed_len(1).build();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   491
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   492
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   493
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   494
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   495
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   496
        assert_eq!(entry.uncompressed_len(), 1)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   497
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   498
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   499
    #[test]
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   500
    fn test_base_revision_or_base_of_delta_chain() {
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   501
        let bytes = IndexEntryBuilder::new()
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   502
            .with_base_revision_or_base_of_delta_chain(1)
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   503
            .build();
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   504
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   505
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   506
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   507
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   508
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
   509
        assert_eq!(entry.base_revision_or_base_of_delta_chain(), 1)
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   510
    }
48457
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   511
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   512
    #[test]
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   513
    fn version_test() {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   514
        let bytes = IndexEntryBuilder::new()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   515
            .is_first(true)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   516
            .with_version(1)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   517
            .build();
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   518
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   519
        assert_eq!(get_version(&bytes), 1)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48226
diff changeset
   520
    }
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   521
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   522
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   523
#[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   524
pub use tests::IndexEntryBuilder;