rust/hg-core/src/revlog/index.rs
author Raphaël Gomès <rgomes@octobus.net>
Thu, 03 Aug 2023 15:50:14 +0200
changeset 51234 62e39bef36ca
parent 51233 9b06e7f32bc5
child 51236 a7bba7df9189
permissions -rw-r--r--
rust-index: add support for delta-chain computation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51233
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
     1
use std::collections::HashSet;
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
     2
use std::fmt::Debug;
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
     3
use std::ops::Deref;
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
     4
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
     5
45537
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
     6
use byteorder::{BigEndian, ByteOrder};
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
     7
use bytes_cast::{unaligned, BytesCast};
45537
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
     8
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
     9
use super::REVIDX_KNOWN_FLAGS;
46511
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46091
diff changeset
    10
use crate::errors::HgError;
51230
e9d47e2f5dcf rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents: 51226
diff changeset
    11
use crate::node::{NODE_BYTES_LENGTH, NULL_NODE, STORED_NODE_ID_BYTES};
46037
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 45605
diff changeset
    12
use crate::revlog::node::Node;
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    13
use crate::revlog::{Revision, NULL_REVISION};
51233
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
    14
use crate::{
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
    15
    BaseRevision, FastHashMap, Graph, GraphError, RevlogError, RevlogIndex,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
    16
    UncheckedRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
    17
};
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    18
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    19
pub const INDEX_ENTRY_SIZE: usize = 64;
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
    20
pub const COMPRESSION_MODE_INLINE: u8 = 2;
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
    21
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    22
pub struct IndexHeader {
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
    23
    pub(super) header_bytes: [u8; 4],
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    24
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    25
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    26
#[derive(Copy, Clone)]
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    27
pub struct IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    28
    flags: u16,
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    29
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    30
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    31
/// Corresponds to the high bits of `_format_flags` in python
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    32
impl IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    33
    /// Corresponds to FLAG_INLINE_DATA in python
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    34
    pub fn is_inline(self) -> bool {
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
    35
        self.flags & 1 != 0
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    36
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    37
    /// Corresponds to FLAG_GENERALDELTA in python
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    38
    pub fn uses_generaldelta(self) -> bool {
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
    39
        self.flags & 2 != 0
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    40
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    41
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    42
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    43
/// Corresponds to the INDEX_HEADER structure,
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    44
/// which is parsed as a `header` variable in `_loadindex` in `revlog.py`
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    45
impl IndexHeader {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    46
    fn format_flags(&self) -> IndexHeaderFlags {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    47
        // No "unknown flags" check here, unlike in python. Maybe there should
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    48
        // be.
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
    49
        IndexHeaderFlags {
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    50
            flags: BigEndian::read_u16(&self.header_bytes[0..2]),
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
    51
        }
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    52
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    53
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    54
    /// The only revlog version currently supported by rhg.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    55
    const REVLOGV1: u16 = 1;
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    56
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    57
    /// Corresponds to `_format_version` in Python.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    58
    fn format_version(&self) -> u16 {
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
    59
        BigEndian::read_u16(&self.header_bytes[2..4])
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    60
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    61
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
    62
    pub fn parse(index_bytes: &[u8]) -> Result<Option<IndexHeader>, HgError> {
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
    63
        if index_bytes.is_empty() {
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
    64
            return Ok(None);
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    65
        }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    66
        if index_bytes.len() < 4 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    67
            return Err(HgError::corrupted(
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    68
                "corrupted revlog: can't read the index format header",
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    69
            ));
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    70
        }
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
    71
        Ok(Some(IndexHeader {
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    72
            header_bytes: {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    73
                let bytes: [u8; 4] =
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    74
                    index_bytes[0..4].try_into().expect("impossible");
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    75
                bytes
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    76
            },
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
    77
        }))
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    78
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    79
}
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
    80
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    81
/// Abstracts the access to the index bytes since they can be spread between
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    82
/// the immutable (bytes) part and the mutable (added) part if any appends
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    83
/// happened. This makes it transparent for the callers.
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    84
struct IndexData {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    85
    /// Immutable bytes, most likely taken from disk
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    86
    bytes: Box<dyn Deref<Target = [u8]> + Send>,
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
    87
    /// Used when stripping index contents, keeps track of the start of the
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
    88
    /// first stripped revision, which is used to give a slice of the
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
    89
    /// `bytes` field.
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
    90
    truncation: Option<usize>,
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    91
    /// Bytes that were added after reading the index
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    92
    added: Vec<u8>,
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    93
}
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    94
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    95
impl IndexData {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    96
    pub fn new(bytes: Box<dyn Deref<Target = [u8]> + Send>) -> Self {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    97
        Self {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
    98
            bytes,
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
    99
            truncation: None,
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   100
            added: vec![],
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   101
        }
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   102
    }
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   103
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   104
    pub fn len(&self) -> usize {
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   105
        match self.truncation {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   106
            Some(truncation) => truncation + self.added.len(),
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   107
            None => self.bytes.len() + self.added.len(),
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   108
        }
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   109
    }
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   110
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   111
    fn remove(
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   112
        &mut self,
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   113
        rev: Revision,
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   114
        offsets: Option<&[usize]>,
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   115
    ) -> Result<(), RevlogError> {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   116
        let rev = rev.0 as usize;
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   117
        let truncation = if let Some(offsets) = offsets {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   118
            offsets[rev]
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   119
        } else {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   120
            rev * INDEX_ENTRY_SIZE
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   121
        };
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   122
        if truncation < self.bytes.len() {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   123
            self.truncation = Some(truncation);
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   124
            self.added.clear();
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   125
        } else {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   126
            self.added.truncate(truncation - self.bytes.len());
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   127
        }
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   128
        Ok(())
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   129
    }
51226
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   130
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   131
    fn is_new(&self) -> bool {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   132
        self.bytes.is_empty()
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   133
    }
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   134
}
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   135
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   136
impl std::ops::Index<std::ops::Range<usize>> for IndexData {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   137
    type Output = [u8];
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   138
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   139
    fn index(&self, index: std::ops::Range<usize>) -> &Self::Output {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   140
        let start = index.start;
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   141
        let end = index.end;
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   142
        let immutable_len = match self.truncation {
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   143
            Some(truncation) => truncation,
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   144
            None => self.bytes.len(),
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   145
        };
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   146
        if start < immutable_len {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   147
            if end > immutable_len {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   148
                panic!("index data cannot span existing and added ranges");
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   149
            }
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   150
            &self.bytes[index]
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   151
        } else {
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   152
            &self.added[start - immutable_len..end - immutable_len]
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   153
        }
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   154
    }
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   155
}
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   156
51226
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   157
#[derive(Debug, PartialEq, Eq)]
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   158
pub struct RevisionDataParams {
51213
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   159
    pub flags: u16,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   160
    pub data_offset: u64,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   161
    pub data_compressed_length: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   162
    pub data_uncompressed_length: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   163
    pub data_delta_base: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   164
    pub link_rev: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   165
    pub parent_rev_1: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   166
    pub parent_rev_2: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   167
    pub node_id: [u8; NODE_BYTES_LENGTH],
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   168
    pub _sidedata_offset: u64,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   169
    pub _sidedata_compressed_length: i32,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   170
    pub data_compression_mode: u8,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   171
    pub _sidedata_compression_mode: u8,
65c9032e2e5a rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51212
diff changeset
   172
    pub _rank: i32,
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   173
}
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   174
51226
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   175
impl Default for RevisionDataParams {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   176
    fn default() -> Self {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   177
        Self {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   178
            flags: 0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   179
            data_offset: 0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   180
            data_compressed_length: 0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   181
            data_uncompressed_length: 0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   182
            data_delta_base: -1,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   183
            link_rev: -1,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   184
            parent_rev_1: -1,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   185
            parent_rev_2: -1,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   186
            node_id: [0; NODE_BYTES_LENGTH],
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   187
            _sidedata_offset: 0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   188
            _sidedata_compressed_length: 0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   189
            data_compression_mode: COMPRESSION_MODE_INLINE,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   190
            _sidedata_compression_mode: COMPRESSION_MODE_INLINE,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   191
            _rank: -1,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   192
        }
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   193
    }
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   194
}
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   195
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   196
#[derive(BytesCast)]
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   197
#[repr(C)]
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   198
pub struct RevisionDataV1 {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   199
    data_offset_or_flags: unaligned::U64Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   200
    data_compressed_length: unaligned::I32Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   201
    data_uncompressed_length: unaligned::I32Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   202
    data_delta_base: unaligned::I32Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   203
    link_rev: unaligned::I32Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   204
    parent_rev_1: unaligned::I32Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   205
    parent_rev_2: unaligned::I32Be,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   206
    node_id: [u8; STORED_NODE_ID_BYTES],
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   207
}
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   208
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   209
fn _static_assert_size_of_revision_data_v1() {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   210
    let _ = std::mem::transmute::<RevisionDataV1, [u8; 64]>;
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   211
}
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   212
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   213
impl RevisionDataParams {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   214
    pub fn validate(&self) -> Result<(), RevlogError> {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   215
        if self.flags & !REVIDX_KNOWN_FLAGS != 0 {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   216
            return Err(RevlogError::corrupted(format!(
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   217
                "unknown revlog index flags: {}",
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   218
                self.flags
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   219
            )));
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   220
        }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   221
        if self.data_compression_mode != COMPRESSION_MODE_INLINE {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   222
            return Err(RevlogError::corrupted(format!(
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   223
                "invalid data compression mode: {}",
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   224
                self.data_compression_mode
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   225
            )));
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   226
        }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   227
        // FIXME isn't this only for v2 or changelog v2?
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   228
        if self._sidedata_compression_mode != COMPRESSION_MODE_INLINE {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   229
            return Err(RevlogError::corrupted(format!(
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   230
                "invalid sidedata compression mode: {}",
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   231
                self._sidedata_compression_mode
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   232
            )));
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   233
        }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   234
        Ok(())
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   235
    }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   236
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   237
    pub fn into_v1(self) -> RevisionDataV1 {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   238
        let data_offset_or_flags = self.data_offset << 16 | self.flags as u64;
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   239
        let mut node_id = [0; STORED_NODE_ID_BYTES];
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   240
        node_id[..NODE_BYTES_LENGTH].copy_from_slice(&self.node_id);
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   241
        RevisionDataV1 {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   242
            data_offset_or_flags: data_offset_or_flags.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   243
            data_compressed_length: self.data_compressed_length.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   244
            data_uncompressed_length: self.data_uncompressed_length.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   245
            data_delta_base: self.data_delta_base.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   246
            link_rev: self.link_rev.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   247
            parent_rev_1: self.parent_rev_1.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   248
            parent_rev_2: self.parent_rev_2.into(),
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   249
            node_id,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   250
        }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   251
    }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   252
}
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   253
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   254
/// A Revlog index
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   255
pub struct Index {
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   256
    bytes: IndexData,
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   257
    /// 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
   258
    /// Only needed when the index is interleaved with data.
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   259
    offsets: RwLock<Option<Vec<usize>>>,
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   260
    uses_generaldelta: bool,
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   261
    is_inline: bool,
45532
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
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   264
impl Debug for Index {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   265
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   266
        f.debug_struct("Index")
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   267
            .field("offsets", &self.offsets)
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   268
            .field("uses_generaldelta", &self.uses_generaldelta)
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   269
            .finish()
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   270
    }
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   271
}
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   272
50989
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   273
impl Graph for Index {
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   274
    fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> {
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   275
        let err = || GraphError::ParentOutOfRange(rev);
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   276
        match self.get_entry(rev) {
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   277
            Some(entry) => {
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   278
                // The C implementation checks that the parents are valid
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   279
                // before returning
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   280
                Ok([
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   281
                    self.check_revision(entry.p1()).ok_or_else(err)?,
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   282
                    self.check_revision(entry.p2()).ok_or_else(err)?,
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   283
                ])
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   284
            }
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   285
            None => Ok([NULL_REVISION, NULL_REVISION]),
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   286
        }
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   287
    }
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   288
}
27e773aa607d rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents: 50988
diff changeset
   289
51233
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   290
/// A cache suitable for find_snapshots
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   291
///
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   292
/// Logically equivalent to a mapping whose keys are [`BaseRevision`] and
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   293
/// values sets of [`BaseRevision`]
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   294
///
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   295
/// TODO the dubious part is insisting that errors must be RevlogError
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   296
/// we would probably need to sprinkle some magic here, such as an associated
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   297
/// type that would be Into<RevlogError> but even that would not be
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   298
/// satisfactory, as errors potentially have nothing to do with the revlog.
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   299
pub trait SnapshotsCache {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   300
    fn insert_for(
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   301
        &mut self,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   302
        rev: BaseRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   303
        value: BaseRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   304
    ) -> Result<(), RevlogError>;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   305
}
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   306
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   307
impl SnapshotsCache for FastHashMap<BaseRevision, HashSet<BaseRevision>> {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   308
    fn insert_for(
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   309
        &mut self,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   310
        rev: BaseRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   311
        value: BaseRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   312
    ) -> Result<(), RevlogError> {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   313
        let all_values = self.entry(rev).or_insert_with(HashSet::new);
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   314
        all_values.insert(value);
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   315
        Ok(())
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   316
    }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   317
}
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   318
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   319
impl Index {
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   320
    /// Create an index from bytes.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   321
    /// Calculate the start of each entry when is_inline is true.
45605
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   322
    pub fn new(
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   323
        bytes: Box<dyn Deref<Target = [u8]> + Send>,
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
   324
        default_header: IndexHeader,
47991
001d747c2baf rust: Return HgError instead of RevlogError in revlog constructors
Simon Sapin <simon.sapin@octobus.net>
parents: 46887
diff changeset
   325
    ) -> Result<Self, HgError> {
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
   326
        let header =
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
   327
            IndexHeader::parse(bytes.as_ref())?.unwrap_or(default_header);
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   328
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   329
        if header.format_version() != IndexHeader::REVLOGV1 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   330
            // A proper new version should have had a repo/store
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   331
            // requirement.
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   332
            return Err(HgError::corrupted("unsupported revlog version"));
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   333
        }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   334
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   335
        // 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: 48496
diff changeset
   336
        // 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: 48496
diff changeset
   337
        // 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: 48496
diff changeset
   338
        let uses_generaldelta = header.format_flags().uses_generaldelta();
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   339
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   340
        if header.format_flags().is_inline() {
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   341
            let mut offset: usize = 0;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   342
            let mut offsets = Vec::new();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   343
45593
11f3c3f408fd hg-core: minor code style change (D8958#inline-14993 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45542
diff changeset
   344
            while offset + INDEX_ENTRY_SIZE <= bytes.len() {
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   345
                offsets.push(offset);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   346
                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
   347
                let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   348
                    bytes: &bytes[offset..end],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   349
                    offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   350
                };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   351
48572
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48497
diff changeset
   352
                offset += INDEX_ENTRY_SIZE + entry.compressed_len() as usize;
45532
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
45605
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   355
            if offset == bytes.len() {
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   356
                Ok(Self {
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   357
                    bytes: IndexData::new(bytes),
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   358
                    offsets: RwLock::new(Some(offsets)),
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   359
                    uses_generaldelta,
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   360
                    is_inline: true,
45605
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   361
                })
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   362
            } else {
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   363
                Err(HgError::corrupted("unexpected inline revlog length"))
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   364
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   365
        } else {
45605
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   366
            Ok(Self {
51209
1ef4a36a934d rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents: 50990
diff changeset
   367
                bytes: IndexData::new(bytes),
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   368
                offsets: RwLock::new(None),
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   369
                uses_generaldelta,
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   370
                is_inline: false,
45605
1cef583541c0 hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents: 45604
diff changeset
   371
            })
45532
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
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   374
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   375
    pub fn uses_generaldelta(&self) -> bool {
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   376
        self.uses_generaldelta
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   377
    }
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   378
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   379
    /// 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: 45596
diff changeset
   380
    pub fn is_inline(&self) -> bool {
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   381
        self.is_inline
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   382
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   383
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   384
    /// 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: 45596
diff changeset
   385
    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: 45596
diff changeset
   386
        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: 45596
diff changeset
   387
            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: 45596
diff changeset
   388
        }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   389
        &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: 45596
diff changeset
   390
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   391
45542
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   392
    /// Return number of entries of the revlog index.
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   393
    pub fn len(&self) -> usize {
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   394
        if let Some(offsets) = &*self.get_offsets() {
45542
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   395
            offsets.len()
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   396
        } else {
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   397
            self.bytes.len() / INDEX_ENTRY_SIZE
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   398
        }
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   399
    }
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   400
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   401
    pub fn get_offsets(&self) -> RwLockReadGuard<Option<Vec<usize>>> {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   402
        if self.is_inline() {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   403
            {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   404
                // Wrap in a block to drop the read guard
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   405
                // TODO perf?
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   406
                let mut offsets = self.offsets.write().unwrap();
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   407
                if offsets.is_none() {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   408
                    offsets.replace(inline_scan(&self.bytes.bytes).1);
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   409
                }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   410
            }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   411
        }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   412
        self.offsets.read().unwrap()
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   413
    }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   414
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   415
    pub fn get_offsets_mut(&mut self) -> RwLockWriteGuard<Option<Vec<usize>>> {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   416
        let mut offsets = self.offsets.write().unwrap();
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   417
        if self.is_inline() && offsets.is_none() {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   418
            offsets.replace(inline_scan(&self.bytes.bytes).1);
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   419
        }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   420
        offsets
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   421
    }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   422
45542
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   423
    /// Returns `true` if the `Index` has zero `entries`.
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   424
    pub fn is_empty(&self) -> bool {
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   425
        self.len() == 0
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   426
    }
639f33f22faf hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45537
diff changeset
   427
51224
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   428
    /// Return the index entry corresponding to the given revision or `None`
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   429
    /// for [`NULL_REVISION`]
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   430
    ///
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   431
    /// The specified revision being of the checked type, it always exists
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   432
    /// if it was validated by this index.
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   433
    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
   434
        if rev == NULL_REVISION {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   435
            return None;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   436
        }
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   437
        Some(if let Some(offsets) = &*self.get_offsets() {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   438
            self.get_entry_inline(rev, offsets.as_ref())
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   439
        } else {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   440
            self.get_entry_separated(rev)
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   441
        })
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   442
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   443
51224
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   444
    /// Return the binary content of the index entry for the given revision
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   445
    ///
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   446
    /// See [get_entry()](`Self::get_entry()`) for cases when `None` is
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   447
    /// returned.
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   448
    pub fn entry_binary(&self, rev: Revision) -> Option<&[u8]> {
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   449
        self.get_entry(rev).map(|e| {
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   450
            let bytes = e.as_bytes();
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   451
            if rev.0 == 0 {
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   452
                &bytes[4..]
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   453
            } else {
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   454
                bytes
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   455
            }
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   456
        })
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   457
    }
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   458
51226
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   459
    pub fn entry_as_params(
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   460
        &self,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   461
        rev: UncheckedRevision,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   462
    ) -> Option<RevisionDataParams> {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   463
        let rev = self.check_revision(rev)?;
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   464
        self.get_entry(rev).map(|e| RevisionDataParams {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   465
            flags: e.flags(),
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   466
            data_offset: if rev.0 == 0 && !self.bytes.is_new() {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   467
                e.flags() as u64
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   468
            } else {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   469
                e.raw_offset()
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   470
            },
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   471
            data_compressed_length: e.compressed_len().try_into().unwrap(),
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   472
            data_uncompressed_length: e.uncompressed_len(),
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   473
            data_delta_base: e.base_revision_or_base_of_delta_chain().0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   474
            link_rev: e.link_revision().0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   475
            parent_rev_1: e.p1().0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   476
            parent_rev_2: e.p2().0,
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   477
            node_id: e.hash().as_bytes().try_into().unwrap(),
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   478
            ..Default::default()
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   479
        })
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   480
    }
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   481
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   482
    fn get_entry_inline(
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   483
        &self,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   484
        rev: Revision,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   485
        offsets: &[usize],
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   486
    ) -> IndexEntry {
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   487
        let start = offsets[rev.0 as usize];
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   488
        let end = start + INDEX_ENTRY_SIZE;
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   489
        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
   490
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   491
        // 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
   492
        let offset_override = Some(end);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   493
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   494
        IndexEntry {
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   495
            bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   496
            offset_override,
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   497
        }
45532
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
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   500
    fn get_entry_separated(&self, rev: Revision) -> IndexEntry {
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   501
        let start = rev.0 as usize * INDEX_ENTRY_SIZE;
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   502
        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
   503
        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
   504
45594
f38adf8b0711 hg-core: Explain offset override of first revision
Antoine cezar<acezar@chwitlabs.fr>
parents: 45593
diff changeset
   505
        // 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: 45593
diff changeset
   506
        // for the index's metadata (saving space because it is always 0)
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   507
        let offset_override = if rev == Revision(0) { Some(0) } else { None };
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   508
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   509
        IndexEntry {
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   510
            bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   511
            offset_override,
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   512
        }
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   513
    }
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   514
51234
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   515
    /// Obtain the delta chain for a revision.
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   516
    ///
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   517
    /// `stop_rev` specifies a revision to stop at. If not specified, we
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   518
    /// stop at the base of the chain.
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   519
    ///
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   520
    /// Returns a 2-tuple of (chain, stopped) where `chain` is a vec of
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   521
    /// revs in ascending order and `stopped` is a bool indicating whether
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   522
    /// `stoprev` was hit.
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   523
    pub fn delta_chain(
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   524
        &self,
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   525
        rev: Revision,
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   526
        stop_rev: Option<Revision>,
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   527
    ) -> Result<(Vec<Revision>, bool), HgError> {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   528
        let mut current_rev = rev;
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   529
        let mut entry = self.get_entry(rev).unwrap();
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   530
        let mut chain = vec![];
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   531
        while current_rev.0 != entry.base_revision_or_base_of_delta_chain().0
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   532
            && stop_rev.map(|r| r != current_rev).unwrap_or(true)
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   533
        {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   534
            chain.push(current_rev);
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   535
            let new_rev = if self.uses_generaldelta() {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   536
                entry.base_revision_or_base_of_delta_chain()
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   537
            } else {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   538
                UncheckedRevision(current_rev.0 - 1)
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   539
            };
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   540
            if new_rev.0 == NULL_REVISION.0 {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   541
                break;
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   542
            }
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   543
            current_rev = self.check_revision(new_rev).ok_or_else(|| {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   544
                HgError::corrupted(format!("Revision {new_rev} out of range"))
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   545
            })?;
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   546
            entry = self.get_entry(current_rev).unwrap()
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   547
        }
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   548
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   549
        let stopped = if stop_rev.map(|r| current_rev == r).unwrap_or(false) {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   550
            true
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   551
        } else {
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   552
            chain.push(current_rev);
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   553
            false
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   554
        };
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   555
        chain.reverse();
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   556
        Ok((chain, stopped))
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   557
    }
62e39bef36ca rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents: 51233
diff changeset
   558
51233
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   559
    pub fn find_snapshots(
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   560
        &self,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   561
        start_rev: UncheckedRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   562
        end_rev: UncheckedRevision,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   563
        cache: &mut impl SnapshotsCache,
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   564
    ) -> Result<(), RevlogError> {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   565
        let mut start_rev = start_rev.0;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   566
        let mut end_rev = end_rev.0;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   567
        end_rev += 1;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   568
        let len = self.len().try_into().unwrap();
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   569
        if end_rev > len {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   570
            end_rev = len;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   571
        }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   572
        if start_rev < 0 {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   573
            start_rev = 0;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   574
        }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   575
        for rev in start_rev..end_rev {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   576
            if !self.is_snapshot_unchecked(Revision(rev))? {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   577
                continue;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   578
            }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   579
            let mut base = self
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   580
                .get_entry(Revision(rev))
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   581
                .unwrap()
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   582
                .base_revision_or_base_of_delta_chain();
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   583
            if base.0 == rev {
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   584
                base = NULL_REVISION.into();
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   585
            }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   586
            cache.insert_for(base.0, rev)?;
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   587
        }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   588
        Ok(())
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   589
    }
9b06e7f32bc5 rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents: 51232
diff changeset
   590
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   591
    /// TODO move this to the trait probably, along with other things
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   592
    pub fn append(
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   593
        &mut self,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   594
        revision_data: RevisionDataParams,
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   595
    ) -> Result<(), RevlogError> {
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   596
        revision_data.validate()?;
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   597
        let new_offset = self.bytes.len();
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   598
        if let Some(offsets) = &mut *self.get_offsets_mut() {
51210
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   599
            offsets.push(new_offset)
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   600
        }
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   601
        self.bytes.added.extend(revision_data.into_v1().as_bytes());
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   602
        Ok(())
b4d152a28742 rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents: 51209
diff changeset
   603
    }
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   604
51219
51cc12158f97 rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents: 51218
diff changeset
   605
    pub fn pack_header(&self, header: i32) -> [u8; 4] {
51cc12158f97 rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents: 51218
diff changeset
   606
        header.to_be_bytes()
51cc12158f97 rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents: 51218
diff changeset
   607
    }
51cc12158f97 rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents: 51218
diff changeset
   608
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   609
    pub fn remove(&mut self, rev: Revision) -> Result<(), RevlogError> {
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   610
        let offsets = self.get_offsets().clone();
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   611
        self.bytes.remove(rev, offsets.as_deref())?;
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   612
        if let Some(offsets) = &mut *self.get_offsets_mut() {
51216
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   613
            offsets.truncate(rev.0 as usize)
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   614
        }
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   615
        Ok(())
f6403bcd9f96 rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents: 51213
diff changeset
   616
    }
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   617
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   618
    pub fn clear_caches(&mut self) {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   619
        // We need to get the 'inline' value from Python at init and use this
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   620
        // instead of offsets to determine whether we're inline since we might
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   621
        // clear caches. This implies re-populating the offsets on-demand.
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   622
        self.offsets = RwLock::new(None);
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   623
    }
51232
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   624
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   625
    /// Unchecked version of `is_snapshot`.
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   626
    /// Assumes the caller checked that `rev` is within a valid revision range.
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   627
    pub fn is_snapshot_unchecked(
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   628
        &self,
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   629
        mut rev: Revision,
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   630
    ) -> Result<bool, RevlogError> {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   631
        while rev.0 >= 0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   632
            let entry = self.get_entry(rev).unwrap();
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   633
            let mut base = entry.base_revision_or_base_of_delta_chain().0;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   634
            if base == rev.0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   635
                base = NULL_REVISION.0;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   636
            }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   637
            if base == NULL_REVISION.0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   638
                return Ok(true);
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   639
            }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   640
            let [mut p1, mut p2] = self
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   641
                .parents(rev)
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   642
                .map_err(|_| RevlogError::InvalidRevision)?;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   643
            while let Some(p1_entry) = self.get_entry(p1) {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   644
                if p1_entry.compressed_len() != 0 || p1.0 == 0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   645
                    break;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   646
                }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   647
                let parent_base =
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   648
                    p1_entry.base_revision_or_base_of_delta_chain();
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   649
                if parent_base.0 == p1.0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   650
                    break;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   651
                }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   652
                p1 = self
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   653
                    .check_revision(parent_base)
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   654
                    .ok_or(RevlogError::InvalidRevision)?;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   655
            }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   656
            while let Some(p2_entry) = self.get_entry(p2) {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   657
                if p2_entry.compressed_len() != 0 || p2.0 == 0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   658
                    break;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   659
                }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   660
                let parent_base =
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   661
                    p2_entry.base_revision_or_base_of_delta_chain();
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   662
                if parent_base.0 == p2.0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   663
                    break;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   664
                }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   665
                p2 = self
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   666
                    .check_revision(parent_base)
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   667
                    .ok_or(RevlogError::InvalidRevision)?;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   668
            }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   669
            if base == p1.0 || base == p2.0 {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   670
                return Ok(false);
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   671
            }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   672
            rev = self
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   673
                .check_revision(base.into())
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   674
                .ok_or(RevlogError::InvalidRevision)?;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   675
        }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   676
        Ok(rev == NULL_REVISION)
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   677
    }
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   678
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   679
    /// Return whether the given revision is a snapshot. Returns an error if
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   680
    /// `rev` is not within a valid revision range.
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   681
    pub fn is_snapshot(
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   682
        &self,
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   683
        rev: UncheckedRevision,
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   684
    ) -> Result<bool, RevlogError> {
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   685
        let rev = self
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   686
            .check_revision(rev)
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   687
            .ok_or_else(|| RevlogError::corrupted("test"))?;
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   688
        self.is_snapshot_unchecked(rev)
b8c89957a6b7 rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents: 51230
diff changeset
   689
    }
51218
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   690
}
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   691
fn inline_scan(bytes: &[u8]) -> (usize, Vec<usize>) {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   692
    let mut offset: usize = 0;
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   693
    let mut offsets = Vec::new();
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   694
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   695
    while offset + INDEX_ENTRY_SIZE <= bytes.len() {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   696
        offsets.push(offset);
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   697
        let end = offset + INDEX_ENTRY_SIZE;
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   698
        let entry = IndexEntry {
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   699
            bytes: &bytes[offset..end],
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   700
            offset_override: None,
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   701
        };
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   702
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   703
        offset += INDEX_ENTRY_SIZE + entry.compressed_len() as usize;
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   704
    }
4e6620b7fbbb rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents: 51216
diff changeset
   705
    (offset, offsets)
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   706
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   707
46091
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   708
impl super::RevlogIndex for Index {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   709
    fn len(&self) -> usize {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   710
        self.len()
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   711
    }
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   712
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   713
    fn node(&self, rev: Revision) -> Option<&Node> {
51230
e9d47e2f5dcf rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents: 51226
diff changeset
   714
        if rev == NULL_REVISION {
e9d47e2f5dcf rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents: 51226
diff changeset
   715
            return Some(&NULL_NODE);
e9d47e2f5dcf rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents: 51226
diff changeset
   716
        }
46091
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   717
        self.get_entry(rev).map(|entry| entry.hash())
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   718
    }
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   719
}
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   720
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   721
#[derive(Debug)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   722
pub struct IndexEntry<'a> {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   723
    bytes: &'a [u8],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   724
    /// 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
   725
    ///
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   726
    /// 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
   727
    /// 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
   728
    /// 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
   729
    /// 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
   730
    ///
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   731
    /// 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
   732
    /// 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
   733
    /// 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
   734
    offset_override: Option<usize>,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   735
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   736
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   737
impl<'a> IndexEntry<'a> {
45596
da30e4b553c3 hg-core: minor docstring update (D8958#inline-14991 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
   738
    /// Return the offset of the data.
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   739
    pub fn offset(&self) -> usize {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   740
        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
   741
            offset_override
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   742
        } else {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   743
            let mut bytes = [0; 8];
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   744
            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
   745
            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
   746
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   747
    }
51226
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   748
    pub fn raw_offset(&self) -> u64 {
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   749
        BigEndian::read_u64(&self.bytes[0..8])
002b49905aac rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents: 51224
diff changeset
   750
    }
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   751
48575
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48572
diff changeset
   752
    pub fn flags(&self) -> u16 {
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48572
diff changeset
   753
        BigEndian::read_u16(&self.bytes[6..=7])
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48572
diff changeset
   754
    }
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48572
diff changeset
   755
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   756
    /// Return the compressed length of the data.
48572
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48497
diff changeset
   757
    pub fn compressed_len(&self) -> u32 {
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48497
diff changeset
   758
        BigEndian::read_u32(&self.bytes[8..=11])
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   759
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   760
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   761
    /// Return the uncompressed length of the data.
48572
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48497
diff changeset
   762
    pub fn uncompressed_len(&self) -> i32 {
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48497
diff changeset
   763
        BigEndian::read_i32(&self.bytes[12..=15])
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   764
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   765
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   766
    /// Return the revision upon which the data has been derived.
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   767
    pub fn base_revision_or_base_of_delta_chain(&self) -> UncheckedRevision {
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   768
        // 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
   769
        //      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
   770
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   771
        BigEndian::read_i32(&self.bytes[16..]).into()
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   772
    }
45537
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   773
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   774
    pub fn link_revision(&self) -> UncheckedRevision {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   775
        BigEndian::read_i32(&self.bytes[20..]).into()
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   776
    }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   777
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   778
    pub fn p1(&self) -> UncheckedRevision {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   779
        BigEndian::read_i32(&self.bytes[24..]).into()
45537
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   780
    }
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   781
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   782
    pub fn p2(&self) -> UncheckedRevision {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
   783
        BigEndian::read_i32(&self.bytes[28..]).into()
45537
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   784
    }
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   785
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   786
    /// Return the hash of revision's full text.
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   787
    ///
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   788
    /// 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: 45532
diff changeset
   789
    /// are used.
46091
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46037
diff changeset
   790
    pub fn hash(&self) -> &'a Node {
46037
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 45605
diff changeset
   791
        (&self.bytes[32..52]).try_into().unwrap()
45537
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
   792
    }
51224
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   793
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   794
    pub fn as_bytes(&self) -> &'a [u8] {
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   795
        self.bytes
7434747343ab rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents: 51219
diff changeset
   796
    }
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   797
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   798
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   799
#[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   800
mod tests {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   801
    use super::*;
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   802
    use crate::node::NULL_NODE;
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   803
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   804
    #[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   805
    #[derive(Debug, Copy, Clone)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   806
    pub struct IndexEntryBuilder {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   807
        is_first: bool,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   808
        is_inline: bool,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   809
        is_general_delta: bool,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   810
        version: u16,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   811
        offset: usize,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   812
        compressed_len: usize,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   813
        uncompressed_len: usize,
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   814
        base_revision_or_base_of_delta_chain: Revision,
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   815
        link_revision: Revision,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   816
        p1: Revision,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   817
        p2: Revision,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   818
        node: Node,
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   819
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   820
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   821
    #[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   822
    impl IndexEntryBuilder {
49999
0780371d6b1e rust-clippy: tell `clippy` we don't need to declare a default here
Raphaël Gomès <rgomes@octobus.net>
parents: 49749
diff changeset
   823
        #[allow(clippy::new_without_default)]
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   824
        pub fn new() -> Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   825
            Self {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   826
                is_first: false,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   827
                is_inline: false,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   828
                is_general_delta: true,
49147
d200ecb76c72 rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents: 48575
diff changeset
   829
                version: 1,
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   830
                offset: 0,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   831
                compressed_len: 0,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   832
                uncompressed_len: 0,
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   833
                base_revision_or_base_of_delta_chain: Revision(0),
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   834
                link_revision: Revision(0),
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   835
                p1: NULL_REVISION,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   836
                p2: NULL_REVISION,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   837
                node: NULL_NODE,
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   838
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   839
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   840
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   841
        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
   842
            self.is_first = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   843
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   844
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   845
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   846
        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
   847
            self.is_inline = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   848
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   849
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   850
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   851
        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
   852
            self.is_general_delta = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   853
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   854
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   855
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   856
        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
   857
            self.version = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   858
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   859
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   860
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   861
        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
   862
            self.offset = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   863
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   864
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   865
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   866
        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
   867
            self.compressed_len = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   868
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   869
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   870
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   871
        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
   872
            self.uncompressed_len = value;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   873
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   874
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   875
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   876
        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: 48496
diff changeset
   877
            &mut self,
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   878
            value: Revision,
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   879
        ) -> &mut Self {
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   880
            self.base_revision_or_base_of_delta_chain = value;
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   881
            self
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   882
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   883
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   884
        pub fn with_link_revision(&mut self, value: Revision) -> &mut Self {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   885
            self.link_revision = value;
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   886
            self
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   887
        }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   888
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   889
        pub fn with_p1(&mut self, value: Revision) -> &mut Self {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   890
            self.p1 = value;
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   891
            self
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   892
        }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   893
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   894
        pub fn with_p2(&mut self, value: Revision) -> &mut Self {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   895
            self.p2 = value;
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   896
            self
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   897
        }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   898
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   899
        pub fn with_node(&mut self, value: Node) -> &mut Self {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   900
            self.node = value;
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   901
            self
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   902
        }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   903
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   904
        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
   905
            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
   906
            if self.is_first {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   907
                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
   908
                    (false, false) => [0u8, 0],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   909
                    (false, true) => [0u8, 1],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   910
                    (true, false) => [0u8, 2],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   911
                    (true, true) => [0u8, 3],
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   912
                });
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   913
                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
   914
                // Remaining offset bytes.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   915
                bytes.extend(&[0u8; 2]);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   916
            } else {
46887
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46511
diff changeset
   917
                // Offset stored on 48 bits (6 bytes)
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46511
diff changeset
   918
                bytes.extend(&(self.offset as u64).to_be_bytes()[2..]);
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   919
            }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   920
            bytes.extend(&[0u8; 2]); // Revision flags.
46887
6d5a26e94d9e unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents: 46511
diff changeset
   921
            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: 46511
diff changeset
   922
            bytes.extend(&(self.uncompressed_len as u32).to_be_bytes());
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   923
            bytes.extend(
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   924
                &self.base_revision_or_base_of_delta_chain.0.to_be_bytes(),
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
   925
            );
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   926
            bytes.extend(&self.link_revision.0.to_be_bytes());
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   927
            bytes.extend(&self.p1.0.to_be_bytes());
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
   928
            bytes.extend(&self.p2.0.to_be_bytes());
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   929
            bytes.extend(self.node.as_bytes());
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
   930
            bytes.extend(vec![0u8; 12]);
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   931
            bytes
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   932
        }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   933
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   934
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   935
    pub fn is_inline(index_bytes: &[u8]) -> bool {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   936
        IndexHeader::parse(index_bytes)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   937
            .expect("too short")
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
   938
            .unwrap()
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   939
            .format_flags()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   940
            .is_inline()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   941
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   942
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   943
    pub fn uses_generaldelta(index_bytes: &[u8]) -> bool {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   944
        IndexHeader::parse(index_bytes)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   945
            .expect("too short")
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
   946
            .unwrap()
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   947
            .format_flags()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   948
            .uses_generaldelta()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   949
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   950
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   951
    pub fn get_version(index_bytes: &[u8]) -> u16 {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   952
        IndexHeader::parse(index_bytes)
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   953
            .expect("too short")
51212
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents: 51210
diff changeset
   954
            .unwrap()
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   955
            .format_version()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   956
    }
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   957
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   958
    #[test]
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   959
    fn flags_when_no_inline_flag_test() {
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   960
        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: 45596
diff changeset
   961
            .is_first(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   962
            .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: 45596
diff changeset
   963
            .with_inline(false)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   964
            .build();
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   965
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   966
        assert!(!is_inline(&bytes));
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   967
        assert!(!uses_generaldelta(&bytes));
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   968
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   969
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   970
    #[test]
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   971
    fn flags_when_inline_flag_test() {
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   972
        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: 45596
diff changeset
   973
            .is_first(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   974
            .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: 45596
diff changeset
   975
            .with_inline(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   976
            .build();
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   977
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   978
        assert!(is_inline(&bytes));
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   979
        assert!(!uses_generaldelta(&bytes));
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   980
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   981
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   982
    #[test]
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
   983
    fn flags_when_inline_and_generaldelta_flags_test() {
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   984
        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: 45596
diff changeset
   985
            .is_first(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   986
            .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: 45596
diff changeset
   987
            .with_inline(true)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   988
            .build();
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   989
50003
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   990
        assert!(is_inline(&bytes));
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49999
diff changeset
   991
        assert!(uses_generaldelta(&bytes));
45604
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   992
    }
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   993
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45596
diff changeset
   994
    #[test]
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   995
    fn test_offset() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   996
        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
   997
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   998
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
   999
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1000
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1001
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1002
        assert_eq!(entry.offset(), 1)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1003
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1004
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1005
    #[test]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1006
    fn test_with_overridden_offset() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1007
        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
  1008
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1009
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1010
            offset_override: Some(2),
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1011
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1012
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1013
        assert_eq!(entry.offset(), 2)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1014
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1015
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1016
    #[test]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1017
    fn test_compressed_len() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1018
        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
  1019
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1020
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1021
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1022
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1023
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1024
        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
  1025
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1026
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1027
    #[test]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1028
    fn test_uncompressed_len() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1029
        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
  1030
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1031
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1032
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1033
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1034
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1035
        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
  1036
    }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1037
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1038
    #[test]
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
  1039
    fn test_base_revision_or_base_of_delta_chain() {
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
  1040
        let bytes = IndexEntryBuilder::new()
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
  1041
            .with_base_revision_or_base_of_delta_chain(Revision(1))
48497
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48496
diff changeset
  1042
            .build();
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1043
        let entry = IndexEntry {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1044
            bytes: &bytes,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1045
            offset_override: None,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1046
        };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1047
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
  1048
        assert_eq!(entry.base_revision_or_base_of_delta_chain(), 1.into())
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1049
    }
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1050
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1051
    #[test]
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1052
    fn link_revision_test() {
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
  1053
        let bytes = IndexEntryBuilder::new()
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
  1054
            .with_link_revision(Revision(123))
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
  1055
            .build();
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1056
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1057
        let entry = IndexEntry {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1058
            bytes: &bytes,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1059
            offset_override: None,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1060
        };
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1061
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
  1062
        assert_eq!(entry.link_revision(), 123.into());
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1063
    }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1064
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1065
    #[test]
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1066
    fn p1_test() {
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
  1067
        let bytes = IndexEntryBuilder::new().with_p1(Revision(123)).build();
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1068
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1069
        let entry = IndexEntry {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1070
            bytes: &bytes,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1071
            offset_override: None,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1072
        };
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1073
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
  1074
        assert_eq!(entry.p1(), 123.into());
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1075
    }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1076
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1077
    #[test]
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1078
    fn p2_test() {
50990
4c5f6e95df84 rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents: 50989
diff changeset
  1079
        let bytes = IndexEntryBuilder::new().with_p2(Revision(123)).build();
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1080
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1081
        let entry = IndexEntry {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1082
            bytes: &bytes,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1083
            offset_override: None,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1084
        };
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1085
50988
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents: 50003
diff changeset
  1086
        assert_eq!(entry.p2(), 123.into());
49148
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1087
    }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1088
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1089
    #[test]
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1090
    fn node_test() {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1091
        let node = Node::from_hex("0123456789012345678901234567890123456789")
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1092
            .unwrap();
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1093
        let bytes = IndexEntryBuilder::new().with_node(node).build();
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1094
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1095
        let entry = IndexEntry {
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1096
            bytes: &bytes,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1097
            offset_override: None,
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1098
        };
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1099
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1100
        assert_eq!(*entry.hash(), node);
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1101
    }
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1102
2a9a55ffe24f rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents: 49147
diff changeset
  1103
    #[test]
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1104
    fn version_test() {
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1105
        let bytes = IndexEntryBuilder::new()
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1106
            .is_first(true)
49147
d200ecb76c72 rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents: 48575
diff changeset
  1107
            .with_version(2)
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1108
            .build();
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1109
49147
d200ecb76c72 rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents: 48575
diff changeset
  1110
        assert_eq!(get_version(&bytes), 2)
48496
1fb3615dfce2 rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48238
diff changeset
  1111
    }
45532
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1112
}
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1113
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1114
#[cfg(test)]
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
  1115
pub use tests::IndexEntryBuilder;