annotate rust/hg-core/src/dirstate/dirstate_map.rs @ 52304:04b9a56c2d25

rust-lib: only export very common types to the top of the crate This was done very early in the Rust project's lifecycle and I had very little Rust experience. Let's keep the `DirstateParents` since they'll pop up in all higher-level code and make the rest more explicit imports to make the imports less confusing and the lib less cluttered.
author Raphaël Gomès <rgomes@octobus.net>
date Mon, 04 Nov 2024 11:13:05 +0100
parents b422acba55f1
children 79e8118cd846
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1 use bytes_cast::BytesCast;
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
2 use std::borrow::Cow;
52054
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
3 use std::fs::Metadata;
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
4 use std::os::unix::fs::MetadataExt;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
5 use std::path::PathBuf;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
6
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
7 use super::on_disk;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
8 use super::on_disk::DirstateV2ParseError;
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
9 use super::owning::OwningDirstateMap;
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
10 use super::path_with_basename::WithBasename;
52304
04b9a56c2d25 rust-lib: only export very common types to the top of the crate
Raphaël Gomès <rgomes@octobus.net>
parents: 52303
diff changeset
11 use super::status::{DirstateStatus, StatusError, StatusOptions};
52303
b422acba55f1 rust-dirstate: remove star exports
Raphaël Gomès <rgomes@octobus.net>
parents: 52302
diff changeset
12 use crate::dirstate::entry::{
b422acba55f1 rust-dirstate: remove star exports
Raphaël Gomès <rgomes@octobus.net>
parents: 52302
diff changeset
13 DirstateEntry, DirstateV2Data, ParentFileData, TruncatedTimestamp,
b422acba55f1 rust-dirstate: remove star exports
Raphaël Gomès <rgomes@octobus.net>
parents: 52302
diff changeset
14 };
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
15 use crate::dirstate::parsers::pack_entry;
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
16 use crate::dirstate::parsers::packed_entry_size;
47098
d7631d55da3e dirstate-tree: Add parsing only dirstate parents from disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47097
diff changeset
17 use crate::dirstate::parsers::parse_dirstate_entries;
48068
bf8837e3d7ce dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents: 48061
diff changeset
18 use crate::dirstate::CopyMapIter;
bf8837e3d7ce dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents: 48061
diff changeset
19 use crate::dirstate::StateMapIter;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
20 use crate::matchers::Matcher;
49979
f5b168979626 rust: move `filter_map_results` to public util
Raphaël Gomès <rgomes@octobus.net>
parents: 49930
diff changeset
21 use crate::utils::filter_map_results;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
22 use crate::utils::hg_path::{HgPath, HgPathBuf};
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
23 use crate::DirstateError;
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
24 use crate::DirstateMapError;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
25 use crate::DirstateParents;
48950
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
26 use crate::FastHashbrownMap as FastHashMap;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
27 use crate::PatternFileWarning;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
28
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
29 /// Append to an existing data file if the amount of unreachable data (not used
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
30 /// anymore) is less than this fraction of the total amount of existing data.
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
31 const ACCEPTABLE_UNREACHABLE_BYTES_RATIO: f32 = 0.5;
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
32
49337
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
33 #[derive(Debug, PartialEq, Eq)]
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
34 /// Version of the on-disk format
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
35 pub enum DirstateVersion {
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
36 V1,
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
37 V2,
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
38 }
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
39
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
40 #[derive(Debug, PartialEq, Eq)]
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
41 pub enum DirstateMapWriteMode {
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
42 Auto,
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
43 ForceNewDataFile,
50222
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
44 ForceAppend,
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
45 }
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
46
52054
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
47 /// Used to detect out-of-process changes in the dirstate
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
48 #[derive(Debug, Copy, Clone)]
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
49 pub struct DirstateIdentity {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
50 pub mode: u32,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
51 pub dev: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
52 pub ino: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
53 pub nlink: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
54 pub uid: u32,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
55 pub gid: u32,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
56 pub size: u64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
57 pub mtime: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
58 pub mtime_nsec: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
59 pub ctime: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
60 pub ctime_nsec: i64,
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
61 }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
62
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
63 impl From<Metadata> for DirstateIdentity {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
64 fn from(value: Metadata) -> Self {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
65 Self {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
66 mode: value.mode(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
67 dev: value.dev(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
68 ino: value.ino(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
69 nlink: value.nlink(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
70 uid: value.uid(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
71 gid: value.gid(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
72 size: value.size(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
73 mtime: value.mtime(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
74 mtime_nsec: value.mtime_nsec(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
75 ctime: value.ctime(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
76 ctime_nsec: value.ctime_nsec(),
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
77 }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
78 }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
79 }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
80
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
81 impl PartialEq for DirstateIdentity {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
82 fn eq(&self, other: &Self) -> bool {
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
83 // Some platforms return 0 when they have no support for nanos.
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
84 // This shouldn't be a problem in practice because of how highly
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
85 // unlikely it is that we actually get exactly 0 nanos, and worst
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
86 // case scenario, we don't write out the dirstate in a non-wlocked
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
87 // situation like status.
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
88 let mtime_nanos_equal = (self.mtime_nsec == 0
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
89 || other.mtime_nsec == 0)
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
90 || self.mtime_nsec == other.mtime_nsec;
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
91 let ctime_nanos_equal = (self.ctime_nsec == 0
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
92 || other.ctime_nsec == 0)
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
93 || self.ctime_nsec == other.ctime_nsec;
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
94
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
95 self.mode == other.mode
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
96 && self.dev == other.dev
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
97 && self.ino == other.ino
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
98 && self.nlink == other.nlink
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
99 && self.uid == other.uid
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
100 && self.gid == other.gid
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
101 && self.size == other.size
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
102 && self.mtime == other.mtime
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
103 && mtime_nanos_equal
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
104 && self.ctime == other.ctime
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
105 && ctime_nanos_equal
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
106 }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
107 }
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
108
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
109 #[derive(Debug)]
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
110 pub struct DirstateMap<'on_disk> {
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
111 /// Contents of the `.hg/dirstate` file
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
112 pub(super) on_disk: &'on_disk [u8],
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
113
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
114 pub(super) root: ChildNodes<'on_disk>,
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
115
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
116 /// Number of nodes anywhere in the tree that have `.entry.is_some()`.
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
117 pub(super) nodes_with_entry_count: u32,
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
118
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
119 /// Number of nodes anywhere in the tree that have
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
120 /// `.copy_source.is_some()`.
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
121 pub(super) nodes_with_copy_source_count: u32,
47409
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47352
diff changeset
122
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47352
diff changeset
123 /// See on_disk::Header
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47352
diff changeset
124 pub(super) ignore_patterns_hash: on_disk::IgnorePatternsHash,
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
125
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
126 /// How many bytes of `on_disk` are not used anymore
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
127 pub(super) unreachable_bytes: u32,
49145
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
128
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
129 /// Size of the data used to first load this `DirstateMap`. Used in case
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
130 /// we need to write some new metadata, but no new data on disk,
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
131 /// as well as to detect writes that have happened in another process
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
132 /// since first read.
49145
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
133 pub(super) old_data_size: usize,
49337
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
134
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
135 /// UUID used when first loading this `DirstateMap`. Used to check if
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
136 /// the UUID has been changed by another process since first read.
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
137 /// Can be `None` if using dirstate v1 or if it's a brand new dirstate.
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
138 pub(super) old_uuid: Option<Vec<u8>>,
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
139
50245
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
140 /// Identity of the dirstate file (for dirstate-v1) or the docket file
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
141 /// (v2). Used to detect if the file has changed from another process.
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
142 /// Since it's always written atomically, we can compare the inode to
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
143 /// check the file identity.
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
144 ///
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
145 /// TODO On non-Unix systems, something like hashing is a possibility?
52054
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
146 pub(super) identity: Option<DirstateIdentity>,
50245
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
147
49337
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
148 pub(super) dirstate_version: DirstateVersion,
50222
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
149
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
150 /// Controlled by config option `devel.dirstate.v2.data_update_mode`
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
151 pub(super) write_mode: DirstateMapWriteMode,
52049
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
152
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
153 /// Controlled by config option `format.use-dirstate-tracked-hint`
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
154 pub(super) use_tracked_hint: bool,
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
155 }
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
156
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
157 /// Using a plain `HgPathBuf` of the full path from the repository root as a
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
158 /// map key would also work: all paths in a given map have the same parent
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
159 /// path, so comparing full paths gives the same result as comparing base
47282
ce41ee53263f dirstate-tree: Extract into a method sorting children of a given node
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
160 /// names. However `HashMap` would waste time always re-hashing the same
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
161 /// string prefix.
47282
ce41ee53263f dirstate-tree: Extract into a method sorting children of a given node
Simon Sapin <simon.sapin@octobus.net>
parents: 47280
diff changeset
162 pub(super) type NodeKey<'on_disk> = WithBasename<Cow<'on_disk, HgPath>>;
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
163
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
164 /// Similar to `&'tree Cow<'on_disk, HgPath>`, but can also be returned
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
165 /// for on-disk nodes that don’t actually have a `Cow` to borrow.
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
166 #[derive(Debug)]
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
167 pub(super) enum BorrowedPath<'tree, 'on_disk> {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
168 InMemory(&'tree HgPathBuf),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
169 OnDisk(&'on_disk HgPath),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
170 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
171
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
172 #[derive(Debug)]
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
173 pub(super) enum ChildNodes<'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
174 InMemory(FastHashMap<NodeKey<'on_disk>, Node<'on_disk>>),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
175 OnDisk(&'on_disk [on_disk::Node]),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
176 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
177
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
178 #[derive(Debug)]
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
179 pub(super) enum ChildNodesRef<'tree, 'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
180 InMemory(&'tree FastHashMap<NodeKey<'on_disk>, Node<'on_disk>>),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
181 OnDisk(&'on_disk [on_disk::Node]),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
182 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
183
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
184 #[derive(Debug)]
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
185 pub(super) enum NodeRef<'tree, 'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
186 InMemory(&'tree NodeKey<'on_disk>, &'tree Node<'on_disk>),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
187 OnDisk(&'on_disk on_disk::Node),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
188 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
189
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
190 impl<'tree, 'on_disk> BorrowedPath<'tree, 'on_disk> {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
191 pub fn detach_from_tree(&self) -> Cow<'on_disk, HgPath> {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
192 match *self {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
193 BorrowedPath::InMemory(in_memory) => Cow::Owned(in_memory.clone()),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
194 BorrowedPath::OnDisk(on_disk) => Cow::Borrowed(on_disk),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
195 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
196 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
197 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
198
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
199 impl<'tree, 'on_disk> std::ops::Deref for BorrowedPath<'tree, 'on_disk> {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
200 type Target = HgPath;
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
201
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
202 fn deref(&self) -> &HgPath {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
203 match *self {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
204 BorrowedPath::InMemory(in_memory) => in_memory,
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
205 BorrowedPath::OnDisk(on_disk) => on_disk,
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
206 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
207 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
208 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
209
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
210 impl Default for ChildNodes<'_> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
211 fn default() -> Self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
212 ChildNodes::InMemory(Default::default())
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
213 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
214 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
215
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
216 impl<'on_disk> ChildNodes<'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
217 pub(super) fn as_ref<'tree>(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
218 &'tree self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
219 ) -> ChildNodesRef<'tree, 'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
220 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
221 ChildNodes::InMemory(nodes) => ChildNodesRef::InMemory(nodes),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
222 ChildNodes::OnDisk(nodes) => ChildNodesRef::OnDisk(nodes),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
223 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
224 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
225
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
226 pub(super) fn is_empty(&self) -> bool {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
227 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
228 ChildNodes::InMemory(nodes) => nodes.is_empty(),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
229 ChildNodes::OnDisk(nodes) => nodes.is_empty(),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
230 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
231 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
232
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
233 fn make_mut(
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
234 &mut self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
235 on_disk: &'on_disk [u8],
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
236 unreachable_bytes: &mut u32,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
237 ) -> Result<
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
238 &mut FastHashMap<NodeKey<'on_disk>, Node<'on_disk>>,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
239 DirstateV2ParseError,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
240 > {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
241 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
242 ChildNodes::InMemory(nodes) => Ok(nodes),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
243 ChildNodes::OnDisk(nodes) => {
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
244 *unreachable_bytes +=
51120
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Raphaël Gomès <rgomes@octobus.net>
parents: 50863
diff changeset
245 std::mem::size_of_val::<[on_disk::Node]>(*nodes) as u32;
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
246 let nodes = nodes
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
247 .iter()
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
248 .map(|node| {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
249 Ok((
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
250 node.path(on_disk)?,
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
251 node.to_in_memory_node(on_disk)?,
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
252 ))
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
253 })
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
254 .collect::<Result<_, _>>()?;
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
255 *self = ChildNodes::InMemory(nodes);
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
256 match self {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
257 ChildNodes::InMemory(nodes) => Ok(nodes),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
258 ChildNodes::OnDisk(_) => unreachable!(),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
259 }
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
260 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
261 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
262 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
263 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
264
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
265 impl<'tree, 'on_disk> ChildNodesRef<'tree, 'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
266 pub(super) fn get(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
267 &self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
268 base_name: &HgPath,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
269 on_disk: &'on_disk [u8],
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
270 ) -> Result<Option<NodeRef<'tree, 'on_disk>>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
271 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
272 ChildNodesRef::InMemory(nodes) => Ok(nodes
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
273 .get_key_value(base_name)
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
274 .map(|(k, v)| NodeRef::InMemory(k, v))),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
275 ChildNodesRef::OnDisk(nodes) => {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
276 let mut parse_result = Ok(());
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
277 let search_result = nodes.binary_search_by(|node| {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
278 match node.base_name(on_disk) {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
279 Ok(node_base_name) => node_base_name.cmp(base_name),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
280 Err(e) => {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
281 parse_result = Err(e);
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
282 // Dummy comparison result, `search_result` won’t
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
283 // be used since `parse_result` is an error
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
284 std::cmp::Ordering::Equal
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
285 }
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
286 }
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
287 });
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
288 parse_result.map(|()| {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
289 search_result.ok().map(|i| NodeRef::OnDisk(&nodes[i]))
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
290 })
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
291 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
292 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
293 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
294
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
295 /// Iterate in undefined order
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
296 pub(super) fn iter(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
297 &self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
298 ) -> impl Iterator<Item = NodeRef<'tree, 'on_disk>> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
299 match self {
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
300 ChildNodesRef::InMemory(nodes) => itertools::Either::Left(
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
301 nodes.iter().map(|(k, v)| NodeRef::InMemory(k, v)),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
302 ),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
303 ChildNodesRef::OnDisk(nodes) => {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
304 itertools::Either::Right(nodes.iter().map(NodeRef::OnDisk))
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
305 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
306 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
307 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
308
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
309 /// Iterate in parallel in undefined order
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
310 pub(super) fn par_iter(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
311 &self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
312 ) -> impl rayon::iter::ParallelIterator<Item = NodeRef<'tree, 'on_disk>>
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
313 {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
314 use rayon::prelude::*;
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
315 match self {
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
316 ChildNodesRef::InMemory(nodes) => rayon::iter::Either::Left(
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
317 nodes.par_iter().map(|(k, v)| NodeRef::InMemory(k, v)),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
318 ),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
319 ChildNodesRef::OnDisk(nodes) => rayon::iter::Either::Right(
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
320 nodes.par_iter().map(NodeRef::OnDisk),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
321 ),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
322 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
323 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
324
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
325 pub(super) fn sorted(&self) -> Vec<NodeRef<'tree, 'on_disk>> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
326 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
327 ChildNodesRef::InMemory(nodes) => {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
328 let mut vec: Vec<_> = nodes
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
329 .iter()
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
330 .map(|(k, v)| NodeRef::InMemory(k, v))
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
331 .collect();
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
332 fn sort_key<'a>(node: &'a NodeRef) -> &'a HgPath {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
333 match node {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
334 NodeRef::InMemory(path, _node) => path.base_name(),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
335 NodeRef::OnDisk(_) => unreachable!(),
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
336 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
337 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
338 // `sort_unstable_by_key` doesn’t allow keys borrowing from the
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
339 // value: https://github.com/rust-lang/rust/issues/34162
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
340 vec.sort_unstable_by(|a, b| sort_key(a).cmp(sort_key(b)));
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
341 vec
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
342 }
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
343 ChildNodesRef::OnDisk(nodes) => {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
344 // Nodes on disk are already sorted
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
345 nodes.iter().map(NodeRef::OnDisk).collect()
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
346 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
347 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
348 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
349 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
350
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
351 impl<'tree, 'on_disk> NodeRef<'tree, 'on_disk> {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
352 pub(super) fn full_path(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
353 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
354 on_disk: &'on_disk [u8],
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
355 ) -> Result<&'tree HgPath, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
356 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
357 NodeRef::InMemory(path, _node) => Ok(path.full_path()),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
358 NodeRef::OnDisk(node) => node.full_path(on_disk),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
359 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
360 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
361
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
362 /// Returns a `BorrowedPath`, which can be turned into a `Cow<'on_disk,
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
363 /// HgPath>` detached from `'tree`
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
364 pub(super) fn full_path_borrowed(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
365 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
366 on_disk: &'on_disk [u8],
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
367 ) -> Result<BorrowedPath<'tree, 'on_disk>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
368 match self {
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
369 NodeRef::InMemory(path, _node) => match path.full_path() {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
370 Cow::Borrowed(on_disk) => Ok(BorrowedPath::OnDisk(on_disk)),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
371 Cow::Owned(in_memory) => Ok(BorrowedPath::InMemory(in_memory)),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
372 },
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
373 NodeRef::OnDisk(node) => {
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
374 Ok(BorrowedPath::OnDisk(node.full_path(on_disk)?))
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
375 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
376 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
377 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
378
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
379 pub(super) fn base_name(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
380 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
381 on_disk: &'on_disk [u8],
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
382 ) -> Result<&'tree HgPath, DirstateV2ParseError> {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
383 match self {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
384 NodeRef::InMemory(path, _node) => Ok(path.base_name()),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
385 NodeRef::OnDisk(node) => node.base_name(on_disk),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
386 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
387 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
388
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
389 pub(super) fn children(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
390 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
391 on_disk: &'on_disk [u8],
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
392 ) -> Result<ChildNodesRef<'tree, 'on_disk>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
393 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
394 NodeRef::InMemory(_path, node) => Ok(node.children.as_ref()),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
395 NodeRef::OnDisk(node) => {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
396 Ok(ChildNodesRef::OnDisk(node.children(on_disk)?))
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
397 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
398 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
399 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
400
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
401 pub(super) fn has_copy_source(&self) -> bool {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
402 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
403 NodeRef::InMemory(_path, node) => node.copy_source.is_some(),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
404 NodeRef::OnDisk(node) => node.has_copy_source(),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
405 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
406 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
407
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
408 pub(super) fn copy_source(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
409 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
410 on_disk: &'on_disk [u8],
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
411 ) -> Result<Option<&'tree HgPath>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
412 match self {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
413 NodeRef::InMemory(_path, node) => Ok(node.copy_source.as_deref()),
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
414 NodeRef::OnDisk(node) => node.copy_source(on_disk),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
415 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
416 }
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
417 /// Returns a `BorrowedPath`, which can be turned into a `Cow<'on_disk,
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
418 /// HgPath>` detached from `'tree`
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
419 pub(super) fn copy_source_borrowed(
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
420 &self,
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
421 on_disk: &'on_disk [u8],
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
422 ) -> Result<Option<BorrowedPath<'tree, 'on_disk>>, DirstateV2ParseError>
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
423 {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
424 Ok(match self {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
425 NodeRef::InMemory(_path, node) => {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
426 node.copy_source.as_ref().map(|source| match source {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
427 Cow::Borrowed(on_disk) => BorrowedPath::OnDisk(on_disk),
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
428 Cow::Owned(in_memory) => BorrowedPath::InMemory(in_memory),
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
429 })
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
430 }
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
431 NodeRef::OnDisk(node) => {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
432 node.copy_source(on_disk)?.map(BorrowedPath::OnDisk)
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
433 }
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
434 })
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
435 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
436
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
437 pub(super) fn entry(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
438 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
439 ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
440 match self {
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
441 NodeRef::InMemory(_path, node) => {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
442 Ok(node.data.as_entry().copied())
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
443 }
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
444 NodeRef::OnDisk(node) => node.entry(),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
445 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
446 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
447
47349
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
448 pub(super) fn cached_directory_mtime(
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
449 &self,
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
450 ) -> Result<Option<TruncatedTimestamp>, DirstateV2ParseError> {
47349
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
451 match self {
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
452 NodeRef::InMemory(_path, node) => Ok(match node.data {
47349
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
453 NodeData::CachedDirectory { mtime } => Some(mtime),
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
454 _ => None,
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
455 }),
47349
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
456 NodeRef::OnDisk(node) => node.cached_directory_mtime(),
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
457 }
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
458 }
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
459
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
460 pub(super) fn descendants_with_entry_count(&self) -> u32 {
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
461 match self {
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
462 NodeRef::InMemory(_path, node) => {
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
463 node.descendants_with_entry_count
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
464 }
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
465 NodeRef::OnDisk(node) => node.descendants_with_entry_count.get(),
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
466 }
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
467 }
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
468
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
469 pub(super) fn tracked_descendants_count(&self) -> u32 {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
470 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
471 NodeRef::InMemory(_path, node) => node.tracked_descendants_count,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
472 NodeRef::OnDisk(node) => node.tracked_descendants_count.get(),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
473 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
474 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
475 }
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
476
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
477 /// Represents a file or a directory
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
478 #[derive(Default, Debug)]
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
479 pub(super) struct Node<'on_disk> {
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
480 pub(super) data: NodeData,
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
481
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
482 pub(super) copy_source: Option<Cow<'on_disk, HgPath>>,
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
483
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
484 pub(super) children: ChildNodes<'on_disk>,
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
485
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
486 /// How many (non-inclusive) descendants of this node have an entry.
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
487 pub(super) descendants_with_entry_count: u32,
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
488
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
489 /// How many (non-inclusive) descendants of this node have an entry whose
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
490 /// state is "tracked".
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
491 pub(super) tracked_descendants_count: u32,
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
492 }
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
493
51707
ec7171748350 rust: apply clippy lints
Raphaël Gomès <rgomes@octobus.net>
parents: 51120
diff changeset
494 #[derive(Debug, Default)]
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
495 pub(super) enum NodeData {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
496 Entry(DirstateEntry),
51735
76c44ae8862e rustfmt: apply formatting expected by newer nightly version
Raphaël Gomès <rgomes@octobus.net>
parents: 51707
diff changeset
497 CachedDirectory {
76c44ae8862e rustfmt: apply formatting expected by newer nightly version
Raphaël Gomès <rgomes@octobus.net>
parents: 51707
diff changeset
498 mtime: TruncatedTimestamp,
76c44ae8862e rustfmt: apply formatting expected by newer nightly version
Raphaël Gomès <rgomes@octobus.net>
parents: 51707
diff changeset
499 },
51707
ec7171748350 rust: apply clippy lints
Raphaël Gomès <rgomes@octobus.net>
parents: 51120
diff changeset
500 #[default]
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
501 None,
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
502 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
503
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
504 impl NodeData {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
505 fn has_entry(&self) -> bool {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
506 matches!(self, NodeData::Entry(_))
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
507 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
508
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
509 fn as_entry(&self) -> Option<&DirstateEntry> {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
510 match self {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
511 NodeData::Entry(entry) => Some(entry),
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
512 _ => None,
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
513 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
514 }
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
515
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
516 fn as_entry_mut(&mut self) -> Option<&mut DirstateEntry> {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
517 match self {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
518 NodeData::Entry(entry) => Some(entry),
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
519 _ => None,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
520 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
521 }
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
522 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
523
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
524 impl<'on_disk> DirstateMap<'on_disk> {
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
525 pub(super) fn empty(on_disk: &'on_disk [u8]) -> Self {
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
526 Self {
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
527 on_disk,
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
528 root: ChildNodes::default(),
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
529 nodes_with_entry_count: 0,
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
530 nodes_with_copy_source_count: 0,
47409
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47352
diff changeset
531 ignore_patterns_hash: [0; on_disk::IGNORE_PATTERNS_HASH_LEN],
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
532 unreachable_bytes: 0,
49145
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
533 old_data_size: 0,
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
534 old_uuid: None,
50245
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
535 identity: None,
49337
6cd249556e20 rust-status: don't trigger dirstate v1 rewrite when only v2 data is changed
Raphaël Gomès <rgomes@octobus.net>
parents: 49145
diff changeset
536 dirstate_version: DirstateVersion::V1,
50222
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
537 write_mode: DirstateMapWriteMode::Auto,
52049
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
538 use_tracked_hint: false,
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
539 }
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
540 }
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
541
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
542 #[logging_timer::time("trace")]
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
543 pub fn new_v2(
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
544 on_disk: &'on_disk [u8],
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
545 data_size: usize,
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47681
diff changeset
546 metadata: &[u8],
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
547 uuid: Vec<u8>,
52054
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
548 identity: Option<DirstateIdentity>,
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
549 ) -> Result<Self, DirstateError> {
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
550 if let Some(data) = on_disk.get(..data_size) {
50245
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
551 Ok(on_disk::read(data, metadata, uuid, identity)?)
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
552 } else {
49373
f8ec7b16c98f rust: add message to `DirstateV2ParseError` to give some context
Raphaël Gomès <rgomes@octobus.net>
parents: 49365
diff changeset
553 Err(DirstateV2ParseError::new("not enough bytes on disk").into())
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
554 }
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
555 }
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
556
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
557 #[logging_timer::time("trace")]
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
558 pub fn new_v1(
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
559 on_disk: &'on_disk [u8],
52054
ea0467ed76aa rust-dirstate-map: use a more precise identity
Raphaël Gomès <rgomes@octobus.net>
parents: 52049
diff changeset
560 identity: Option<DirstateIdentity>,
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
561 ) -> Result<(Self, Option<DirstateParents>), DirstateError> {
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
562 let mut map = Self::empty(on_disk);
52033
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
563 map.identity = identity;
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
564
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
565 if map.on_disk.is_empty() {
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
566 return Ok((map, None));
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
567 }
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
568
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
569 let parents = parse_dirstate_entries(
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
570 map.on_disk,
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
571 |path, entry, copy_source| {
49136
3f5e207f78be rust: use `entry.tracked()` directly
Raphaël Gomès <rgomes@octobus.net>
parents: 49134
diff changeset
572 let tracked = entry.tracked();
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
573 let node = Self::get_or_insert_node_inner(
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
574 map.on_disk,
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
575 &mut map.unreachable_bytes,
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
576 &mut map.root,
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
577 path,
47126
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
578 WithBasename::to_cow_borrowed,
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
579 |ancestor| {
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
580 if tracked {
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
581 ancestor.tracked_descendants_count += 1
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
582 }
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
583 ancestor.descendants_with_entry_count += 1
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
584 },
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
585 )?;
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
586 assert!(
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
587 !node.data.has_entry(),
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
588 "duplicate dirstate entry in read"
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
589 );
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
590 assert!(
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
591 node.copy_source.is_none(),
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
592 "duplicate dirstate entry in read"
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
593 );
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
594 node.data = NodeData::Entry(*entry);
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
595 node.copy_source = copy_source.map(Cow::Borrowed);
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
596 map.nodes_with_entry_count += 1;
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
597 if copy_source.is_some() {
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
598 map.nodes_with_copy_source_count += 1
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
599 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
600 Ok(())
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
601 },
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
602 )?;
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
603 let parents = Some(*parents);
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
604
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
605 Ok((map, parents))
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
606 }
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
607
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
608 /// Assuming dirstate-v2 format, returns whether the next write should
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
609 /// append to the existing data file that contains `self.on_disk` (true),
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
610 /// or create a new data file from scratch (false).
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
611 pub(super) fn write_should_append(&self) -> bool {
50222
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
612 match self.write_mode {
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
613 DirstateMapWriteMode::ForceAppend => true,
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
614 DirstateMapWriteMode::ForceNewDataFile => false,
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
615 DirstateMapWriteMode::Auto => {
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
616 let ratio =
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
617 self.unreachable_bytes as f32 / self.on_disk.len() as f32;
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
618 ratio < ACCEPTABLE_UNREACHABLE_BYTES_RATIO
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
619 }
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
620 }
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
621 }
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
622
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
623 fn get_node<'tree>(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
624 &'tree self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
625 path: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
626 ) -> Result<Option<NodeRef<'tree, 'on_disk>>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
627 let mut children = self.root.as_ref();
47099
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
628 let mut components = path.components();
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
629 let mut component =
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
630 components.next().expect("expected at least one components");
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
631 loop {
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
632 if let Some(child) = children.get(component, self.on_disk)? {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
633 if let Some(next_component) = components.next() {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
634 component = next_component;
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
635 children = child.children(self.on_disk)?;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
636 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
637 return Ok(Some(child));
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
638 }
47099
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
639 } else {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
640 return Ok(None);
47099
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
641 }
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
642 }
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
643 }
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
644
50863
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
645 pub fn has_node(
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
646 &self,
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
647 path: &HgPath,
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
648 ) -> Result<bool, DirstateV2ParseError> {
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
649 let node = self.get_node(path)?;
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
650 Ok(node.is_some())
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
651 }
264072107105 rust-status: error on non-existent files in file_set
Spencer Baugh <sbaugh@janestreet.com>
parents: 50724
diff changeset
652
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
653 /// Returns a mutable reference to the node at `path` if it exists
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
654 ///
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
655 /// `each_ancestor` is a callback that is called for each ancestor node
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
656 /// when descending the tree. It is used to keep the different counters
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
657 /// of the `DirstateMap` up-to-date.
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
658 fn get_node_mut<'tree>(
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
659 &'tree mut self,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
660 path: &HgPath,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
661 each_ancestor: impl FnMut(&mut Node),
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
662 ) -> Result<Option<&'tree mut Node<'on_disk>>, DirstateV2ParseError> {
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
663 Self::get_node_mut_inner(
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
664 self.on_disk,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
665 &mut self.unreachable_bytes,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
666 &mut self.root,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
667 path,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
668 each_ancestor,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
669 )
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
670 }
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
671
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
672 /// Lower-level version of `get_node_mut`.
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
673 ///
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
674 /// This takes `root` instead of `&mut self` so that callers can mutate
49131
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
675 /// other fields while the returned borrow is still valid.
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
676 ///
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
677 /// `each_ancestor` is a callback that is called for each ancestor node
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
678 /// when descending the tree. It is used to keep the different counters
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
679 /// of the `DirstateMap` up-to-date.
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
680 fn get_node_mut_inner<'tree>(
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
681 on_disk: &'on_disk [u8],
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
682 unreachable_bytes: &mut u32,
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
683 root: &'tree mut ChildNodes<'on_disk>,
47104
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
684 path: &HgPath,
49131
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
685 mut each_ancestor: impl FnMut(&mut Node),
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
686 ) -> Result<Option<&'tree mut Node<'on_disk>>, DirstateV2ParseError> {
47104
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
687 let mut children = root;
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
688 let mut components = path.components();
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
689 let mut component =
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
690 components.next().expect("expected at least one components");
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
691 loop {
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
692 if let Some(child) = children
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
693 .make_mut(on_disk, unreachable_bytes)?
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
694 .get_mut(component)
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
695 {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
696 if let Some(next_component) = components.next() {
49131
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
697 each_ancestor(child);
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
698 component = next_component;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
699 children = &mut child.children;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
700 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
701 return Ok(Some(child));
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
702 }
47104
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
703 } else {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
704 return Ok(None);
47104
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
705 }
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
706 }
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
707 }
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
708
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
709 /// Get a mutable reference to the node at `path`, creating it if it does
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
710 /// not exist.
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
711 ///
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
712 /// `each_ancestor` is a callback that is called for each ancestor node
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
713 /// when descending the tree. It is used to keep the different counters
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
714 /// of the `DirstateMap` up-to-date.
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
715 fn get_or_insert_node<'tree, 'path>(
47474
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
716 &'tree mut self,
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
717 path: &'path HgPath,
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
718 each_ancestor: impl FnMut(&mut Node),
47474
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
719 ) -> Result<&'tree mut Node<'on_disk>, DirstateV2ParseError> {
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
720 Self::get_or_insert_node_inner(
47474
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
721 self.on_disk,
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
722 &mut self.unreachable_bytes,
47474
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
723 &mut self.root,
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
724 path,
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
725 WithBasename::to_cow_owned,
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
726 each_ancestor,
47474
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
727 )
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
728 }
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
729
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
730 /// Lower-level version of `get_or_insert_node_inner`, which is used when
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
731 /// parsing disk data to remove allocations for new nodes.
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
732 fn get_or_insert_node_inner<'tree, 'path>(
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
733 on_disk: &'on_disk [u8],
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
734 unreachable_bytes: &mut u32,
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
735 root: &'tree mut ChildNodes<'on_disk>,
47126
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
736 path: &'path HgPath,
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
737 to_cow: impl Fn(
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
738 WithBasename<&'path HgPath>,
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
739 ) -> WithBasename<Cow<'on_disk, HgPath>>,
47120
7109a38830c9 dirstate-tree: Fold "tracked descendants" counter update in main walk
Simon Sapin <simon.sapin@octobus.net>
parents: 47119
diff changeset
740 mut each_ancestor: impl FnMut(&mut Node),
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
741 ) -> Result<&'tree mut Node<'on_disk>, DirstateV2ParseError> {
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
742 let mut child_nodes = root;
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
743 let mut inclusive_ancestor_paths =
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
744 WithBasename::inclusive_ancestors_of(path);
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
745 let mut ancestor_path = inclusive_ancestor_paths
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
746 .next()
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
747 .expect("expected at least one inclusive ancestor");
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
748 loop {
48950
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
749 let (_, child_node) = child_nodes
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
750 .make_mut(on_disk, unreachable_bytes)?
48950
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
751 .raw_entry_mut()
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
752 .from_key(ancestor_path.base_name())
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
753 .or_insert_with(|| (to_cow(ancestor_path), Node::default()));
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
754 if let Some(next) = inclusive_ancestor_paths.next() {
47120
7109a38830c9 dirstate-tree: Fold "tracked descendants" counter update in main walk
Simon Sapin <simon.sapin@octobus.net>
parents: 47119
diff changeset
755 each_ancestor(child_node);
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
756 ancestor_path = next;
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
757 child_nodes = &mut child_node.children;
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
758 } else {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
759 return Ok(child_node);
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
760 }
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
761 }
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
762 }
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
763
49921
5fff90c7ea9d rust-clippy: reassure `clippy` that 8 arguments is expected
Raphaël Gomès <rgomes@octobus.net>
parents: 49913
diff changeset
764 #[allow(clippy::too_many_arguments)]
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
765 fn reset_state(
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
766 &mut self,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
767 filename: &HgPath,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
768 old_entry_opt: Option<DirstateEntry>,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
769 wc_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
770 p1_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
771 p2_info: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
772 has_meaningful_mtime: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
773 parent_file_data_opt: Option<ParentFileData>,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
774 ) -> Result<(), DirstateError> {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
775 let (had_entry, was_tracked) = match old_entry_opt {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
776 Some(old_entry) => (true, old_entry.tracked()),
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
777 None => (false, false),
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
778 };
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
779 let node = self.get_or_insert_node(filename, |ancestor| {
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
780 if !had_entry {
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
781 ancestor.descendants_with_entry_count += 1;
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
782 }
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
783 if was_tracked {
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
784 if !wc_tracked {
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
785 ancestor.tracked_descendants_count = ancestor
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
786 .tracked_descendants_count
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
787 .checked_sub(1)
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
788 .expect("tracked count to be >= 0");
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
789 }
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
790 } else if wc_tracked {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
791 ancestor.tracked_descendants_count += 1;
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
792 }
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
793 })?;
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
794
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
795 let v2_data = if let Some(parent_file_data) = parent_file_data_opt {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
796 DirstateV2Data {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
797 wc_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
798 p1_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
799 p2_info,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
800 mode_size: parent_file_data.mode_size,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
801 mtime: if has_meaningful_mtime {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
802 parent_file_data.mtime
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
803 } else {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
804 None
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
805 },
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
806 ..Default::default()
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
807 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
808 } else {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
809 DirstateV2Data {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
810 wc_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
811 p1_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
812 p2_info,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
813 ..Default::default()
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
814 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
815 };
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
816 node.data = NodeData::Entry(DirstateEntry::from_v2_data(v2_data));
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
817 if !had_entry {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
818 self.nodes_with_entry_count += 1;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
819 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
820 Ok(())
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
821 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
822
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
823 fn set_tracked(
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
824 &mut self,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
825 filename: &HgPath,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
826 old_entry_opt: Option<DirstateEntry>,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
827 ) -> Result<bool, DirstateV2ParseError> {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
828 let was_tracked = old_entry_opt.map_or(false, |e| e.tracked());
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
829 let had_entry = old_entry_opt.is_some();
51120
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Raphaël Gomès <rgomes@octobus.net>
parents: 50863
diff changeset
830 let tracked_count_increment = u32::from(!was_tracked);
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
831 let mut new = false;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
832
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
833 let node = self.get_or_insert_node(filename, |ancestor| {
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
834 if !had_entry {
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
835 ancestor.descendants_with_entry_count += 1;
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
836 }
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
837
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
838 ancestor.tracked_descendants_count += tracked_count_increment;
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
839 })?;
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
840 if let Some(old_entry) = old_entry_opt {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
841 let mut e = old_entry;
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
842 if e.tracked() {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
843 // XXX
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
844 // This is probably overkill for more case, but we need this to
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
845 // fully replace the `normallookup` call with `set_tracked`
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
846 // one. Consider smoothing this in the future.
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
847 e.set_possibly_dirty();
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
848 } else {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
849 new = true;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
850 e.set_tracked();
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
851 }
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
852 node.data = NodeData::Entry(e)
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
853 } else {
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
854 node.data = NodeData::Entry(DirstateEntry::new_tracked());
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
855 self.nodes_with_entry_count += 1;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
856 new = true;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
857 };
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
858 Ok(new)
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
859 }
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
860
49132
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
861 /// Set a node as untracked in the dirstate.
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
862 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
863 /// It is the responsibility of the caller to remove the copy source and/or
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
864 /// the entry itself if appropriate.
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
865 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
866 /// # Panics
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
867 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
868 /// Panics if the node does not exist.
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
869 fn set_untracked(
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
870 &mut self,
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
871 filename: &HgPath,
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
872 old_entry: DirstateEntry,
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
873 ) -> Result<(), DirstateV2ParseError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
874 let node = self
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
875 .get_node_mut(filename, |ancestor| {
49132
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
876 ancestor.tracked_descendants_count = ancestor
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
877 .tracked_descendants_count
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
878 .checked_sub(1)
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
879 .expect("tracked_descendants_count should be >= 0");
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
880 })?
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
881 .expect("node should exist");
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
882 let mut new_entry = old_entry;
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
883 new_entry.set_untracked();
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
884 node.data = NodeData::Entry(new_entry);
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
885 Ok(())
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
886 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
887
49132
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
888 /// Set a node as clean in the dirstate.
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
889 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
890 /// It is the responsibility of the caller to remove the copy source.
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
891 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
892 /// # Panics
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
893 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
894 /// Panics if the node does not exist.
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
895 fn set_clean(
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
896 &mut self,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
897 filename: &HgPath,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
898 old_entry: DirstateEntry,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
899 mode: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
900 size: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
901 mtime: TruncatedTimestamp,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
902 ) -> Result<(), DirstateError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
903 let node = self
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
904 .get_node_mut(filename, |ancestor| {
49132
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
905 if !old_entry.tracked() {
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
906 ancestor.tracked_descendants_count += 1;
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
907 }
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
908 })?
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
909 .expect("node should exist");
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
910 let mut new_entry = old_entry;
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
911 new_entry.set_clean(mode, size, mtime);
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
912 node.data = NodeData::Entry(new_entry);
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
913 Ok(())
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
914 }
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
915
49132
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
916 /// Set a node as possibly dirty in the dirstate.
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
917 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
918 /// # Panics
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
919 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
920 /// Panics if the node does not exist.
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
921 fn set_possibly_dirty(
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
922 &mut self,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
923 filename: &HgPath,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
924 ) -> Result<(), DirstateError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
925 let node = self
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
926 .get_node_mut(filename, |_ancestor| {})?
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
927 .expect("node should exist");
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
928 let entry = node.data.as_entry_mut().expect("entry should exist");
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
929 entry.set_possibly_dirty();
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
930 node.data = NodeData::Entry(*entry);
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
931 Ok(())
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
932 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
933
49127
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
934 /// Clears the cached mtime for the (potential) folder at `path`.
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
935 pub(super) fn clear_cached_mtime(
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
936 &mut self,
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
937 path: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
938 ) -> Result<(), DirstateV2ParseError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
939 let node = match self.get_node_mut(path, |_ancestor| {})? {
49127
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
940 Some(node) => node,
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
941 None => return Ok(()),
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
942 };
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
943 if let NodeData::CachedDirectory { .. } = &node.data {
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
944 node.data = NodeData::None
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
945 }
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
946 Ok(())
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
947 }
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
948
49128
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
949 /// Sets the cached mtime for the (potential) folder at `path`.
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
950 pub(super) fn set_cached_mtime(
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
951 &mut self,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
952 path: &HgPath,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
953 mtime: TruncatedTimestamp,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
954 ) -> Result<(), DirstateV2ParseError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
955 let node = match self.get_node_mut(path, |_ancestor| {})? {
49128
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
956 Some(node) => node,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
957 None => return Ok(()),
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
958 };
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
959 match &node.data {
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
960 NodeData::Entry(_) => {} // Don’t overwrite an entry
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
961 NodeData::CachedDirectory { .. } | NodeData::None => {
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
962 node.data = NodeData::CachedDirectory { mtime }
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
963 }
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
964 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
965 Ok(())
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
966 }
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
967
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
968 fn iter_nodes<'tree>(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
969 &'tree self,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
970 ) -> impl Iterator<
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
971 Item = Result<NodeRef<'tree, 'on_disk>, DirstateV2ParseError>,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
972 > + 'tree {
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
973 // Depth first tree traversal.
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
974 //
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
975 // If we could afford internal iteration and recursion,
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
976 // this would look like:
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
977 //
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
978 // ```
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
979 // fn traverse_children(
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
980 // children: &ChildNodes,
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
981 // each: &mut impl FnMut(&Node),
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
982 // ) {
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
983 // for child in children.values() {
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
984 // traverse_children(&child.children, each);
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
985 // each(child);
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
986 // }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
987 // }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
988 // ```
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
989 //
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
990 // However we want an external iterator and therefore can’t use the
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
991 // call stack. Use an explicit stack instead:
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
992 let mut stack = Vec::new();
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
993 let mut iter = self.root.as_ref().iter();
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
994 std::iter::from_fn(move || {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
995 while let Some(child_node) = iter.next() {
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
996 let children = match child_node.children(self.on_disk) {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
997 Ok(children) => children,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
998 Err(error) => return Some(Err(error)),
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
999 };
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1000 // Pseudo-recursion
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1001 let new_iter = children.iter();
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1002 let old_iter = std::mem::replace(&mut iter, new_iter);
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
1003 stack.push((child_node, old_iter));
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1004 }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1005 // Found the end of a `children.iter()` iterator.
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
1006 if let Some((child_node, next_iter)) = stack.pop() {
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1007 // "Return" from pseudo-recursion by restoring state from the
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1008 // explicit stack
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1009 iter = next_iter;
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1010
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1011 Some(Ok(child_node))
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1012 } else {
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1013 // Reached the bottom of the stack, we’re done
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1014 None
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1015 }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1016 })
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1017 }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1018
49922
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1019 fn count_dropped_path(unreachable_bytes: &mut u32, path: Cow<HgPath>) {
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1020 if let Cow::Borrowed(path) = path {
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1021 *unreachable_bytes += path.len() as u32
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1022 }
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1023 }
50222
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
1024
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
1025 pub(crate) fn set_write_mode(&mut self, write_mode: DirstateMapWriteMode) {
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
1026 self.write_mode = write_mode;
ecd28d89c29e dirstate-v2: add devel config option to control write behavior
Raphaël Gomès <rgomes@octobus.net>
parents: 50221
diff changeset
1027 }
52049
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
1028
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
1029 pub(crate) fn set_tracked_hint(&mut self, tracked_hint: bool) {
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
1030 self.use_tracked_hint = tracked_hint;
a8cf6a852f11 rust-dirstate: pass dirstate tracked key from the requirements
Raphaël Gomès <rgomes@octobus.net>
parents: 52044
diff changeset
1031 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1032 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1033
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1034 /// Sets the parameters for resetting a dirstate entry
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1035 pub struct DirstateEntryReset<'a> {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1036 /// Which entry are we resetting
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1037 pub filename: &'a HgPath,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1038 /// Whether the entry is tracked in the working copy
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1039 pub wc_tracked: bool,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1040 /// Whether the entry is tracked in p1
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1041 pub p1_tracked: bool,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1042 /// Whether the entry has merge information
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1043 pub p2_info: bool,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1044 /// Whether the entry's mtime should be trusted
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1045 pub has_meaningful_mtime: bool,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1046 /// Information from the parent file data (from the manifest)
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1047 pub parent_file_data_opt: Option<ParentFileData>,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1048 /// Set this to `true` if you are *certain* that there is no old entry for
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1049 /// this filename. Yield better performance in cases where we do a lot
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1050 /// of additions to the dirstate.
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1051 pub from_empty: bool,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1052 }
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1053
49924
66ffe3749a48 rust-clippy: simplify return type of debug function
Raphaël Gomès <rgomes@octobus.net>
parents: 49923
diff changeset
1054 type DebugDirstateTuple<'a> = (&'a HgPath, (u8, i32, i32, i32));
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1055
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1056 impl OwningDirstateMap {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1057 pub fn clear(&mut self) {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1058 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1059 map.root = Default::default();
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1060 map.nodes_with_entry_count = 0;
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1061 map.nodes_with_copy_source_count = 0;
50724
a10d823a8e3d dirstate: avoid leaking disk space in `hg debugrebuilddirstate`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50252
diff changeset
1062 map.unreachable_bytes = map.on_disk.len() as u32;
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1063 });
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1064 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1065
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1066 pub fn set_tracked(
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1067 &mut self,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1068 filename: &HgPath,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1069 ) -> Result<bool, DirstateV2ParseError> {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1070 let old_entry_opt = self.get(filename)?;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1071 self.with_dmap_mut(|map| map.set_tracked(filename, old_entry_opt))
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1072 }
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
1073
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1074 pub fn set_untracked(
48047
9b2a51b2c36a dirstate: Propagate dirstate-v2 parse errors from set_dirstate_item
Simon Sapin <simon.sapin@octobus.net>
parents: 48046
diff changeset
1075 &mut self,
9b2a51b2c36a dirstate: Propagate dirstate-v2 parse errors from set_dirstate_item
Simon Sapin <simon.sapin@octobus.net>
parents: 48046
diff changeset
1076 filename: &HgPath,
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1077 ) -> Result<bool, DirstateError> {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1078 let old_entry_opt = self.get(filename)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1079 match old_entry_opt {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1080 None => Ok(false),
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1081 Some(old_entry) => {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1082 if !old_entry.tracked() {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1083 // `DirstateMap::set_untracked` is not a noop if
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1084 // already not tracked as it will decrement the
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1085 // tracked counters while going down.
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1086 return Ok(true);
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1087 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1088 if old_entry.added() {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1089 // Untracking an "added" entry will just result in a
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1090 // worthless entry (and other parts of the code will
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1091 // complain about it), just drop it entirely.
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1092 self.drop_entry_and_copy_source(filename)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1093 return Ok(true);
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1094 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1095 if !old_entry.p2_info() {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1096 self.copy_map_remove(filename)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1097 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1098
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1099 self.with_dmap_mut(|map| {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1100 map.set_untracked(filename, old_entry)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1101 Ok(true)
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1102 })
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1103 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
1104 }
47692
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
1105 }
e5fb14a07866 dirstate-map: move most of `dirstate.update_file` logic in the dsmap
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47683
diff changeset
1106
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1107 pub fn set_clean(
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1108 &mut self,
47107
7dfc598ddcfe dirstate-tree: Add add_file, remove_file, and drop_file
Simon Sapin <simon.sapin@octobus.net>
parents: 47106
diff changeset
1109 filename: &HgPath,
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1110 mode: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1111 size: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1112 mtime: TruncatedTimestamp,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1113 ) -> Result<(), DirstateError> {
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1114 let old_entry = match self.get(filename)? {
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1115 None => {
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1116 return Err(
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1117 DirstateMapError::PathNotFound(filename.into()).into()
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1118 )
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1119 }
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1120 Some(e) => e,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1121 };
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1122 self.copy_map_remove(filename)?;
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1123 self.with_dmap_mut(|map| {
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1124 map.set_clean(filename, old_entry, mode, size, mtime)
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1125 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1126 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1127
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1128 pub fn set_possibly_dirty(
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1129 &mut self,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1130 filename: &HgPath,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1131 ) -> Result<(), DirstateError> {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1132 if self.get(filename)?.is_none() {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1133 return Err(DirstateMapError::PathNotFound(filename.into()).into());
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1134 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1135 self.with_dmap_mut(|map| map.set_possibly_dirty(filename))
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1136 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1137
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1138 pub fn reset_state(
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1139 &mut self,
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1140 reset: DirstateEntryReset,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1141 ) -> Result<(), DirstateError> {
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1142 if !(reset.p1_tracked || reset.p2_info || reset.wc_tracked) {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1143 self.drop_entry_and_copy_source(reset.filename)?;
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1144 return Ok(());
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1145 }
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1146 if !reset.from_empty {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1147 self.copy_map_remove(reset.filename)?;
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1148 }
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1149
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1150 let old_entry_opt = if reset.from_empty {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1151 None
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1152 } else {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1153 self.get(reset.filename)?
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1154 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1155
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1156 self.with_dmap_mut(|map| {
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1157 map.reset_state(
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1158 reset.filename,
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1159 old_entry_opt,
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1160 reset.wc_tracked,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1161 reset.p1_tracked,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1162 reset.p2_info,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1163 reset.has_meaningful_mtime,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1164 reset.parent_file_data_opt,
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1165 )
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1166 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1167 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1168
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1169 pub fn drop_entry_and_copy_source(
48050
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1170 &mut self,
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1171 filename: &HgPath,
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1172 ) -> Result<(), DirstateError> {
49123
afe60def963d rust-dirstatemap: use `DirstateEntry::tracked` directly
Raphaël Gomès <rgomes@octobus.net>
parents: 49121
diff changeset
1173 let was_tracked = self.get(filename)?.map_or(false, |e| e.tracked());
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1174 struct Dropped {
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1175 was_tracked: bool,
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1176 had_entry: bool,
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1177 had_copy_source: bool,
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1178 }
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1179
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1180 /// If this returns `Ok(Some((dropped, removed)))`, then
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1181 ///
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1182 /// * `dropped` is about the leaf node that was at `filename`
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1183 /// * `removed` is whether this particular level of recursion just
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1184 /// removed a node in `nodes`.
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
1185 fn recur<'on_disk>(
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
1186 on_disk: &'on_disk [u8],
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1187 unreachable_bytes: &mut u32,
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
1188 nodes: &mut ChildNodes<'on_disk>,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1189 path: &HgPath,
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1190 ) -> Result<Option<(Dropped, bool)>, DirstateV2ParseError> {
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1191 let (first_path_component, rest_of_path) =
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1192 path.split_first_component();
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1193 let nodes = nodes.make_mut(on_disk, unreachable_bytes)?;
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1194 let node = if let Some(node) = nodes.get_mut(first_path_component)
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1195 {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1196 node
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1197 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1198 return Ok(None);
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1199 };
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1200 let dropped;
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1201 if let Some(rest) = rest_of_path {
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1202 if let Some((d, removed)) = recur(
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1203 on_disk,
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1204 unreachable_bytes,
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1205 &mut node.children,
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1206 rest,
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1207 )? {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1208 dropped = d;
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
1209 if dropped.had_entry {
49001
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1210 node.descendants_with_entry_count = node
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1211 .descendants_with_entry_count
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1212 .checked_sub(1)
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1213 .expect(
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1214 "descendants_with_entry_count should be >= 0",
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1215 );
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
1216 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1217 if dropped.was_tracked {
49001
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1218 node.tracked_descendants_count = node
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1219 .tracked_descendants_count
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1220 .checked_sub(1)
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1221 .expect(
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1222 "tracked_descendants_count should be >= 0",
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1223 );
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1224 }
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1225
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1226 // Directory caches must be invalidated when removing a
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1227 // child node
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1228 if removed {
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1229 if let NodeData::CachedDirectory { .. } = &node.data {
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1230 node.data = NodeData::None
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1231 }
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1232 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1233 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1234 return Ok(None);
47120
7109a38830c9 dirstate-tree: Fold "tracked descendants" counter update in main walk
Simon Sapin <simon.sapin@octobus.net>
parents: 47119
diff changeset
1235 }
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1236 } else {
49002
fbc02ccc207e rust-dirstatemap: properly decrement counter for tracked descendants
Raphaël Gomès <rgomes@octobus.net>
parents: 49001
diff changeset
1237 let entry = node.data.as_entry();
fbc02ccc207e rust-dirstatemap: properly decrement counter for tracked descendants
Raphaël Gomès <rgomes@octobus.net>
parents: 49001
diff changeset
1238 let was_tracked = entry.map_or(false, |entry| entry.tracked());
fbc02ccc207e rust-dirstatemap: properly decrement counter for tracked descendants
Raphaël Gomès <rgomes@octobus.net>
parents: 49001
diff changeset
1239 let had_entry = entry.is_some();
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
1240 if had_entry {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
1241 node.data = NodeData::None
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
1242 }
49003
ce919b1a1063 rust-dirstatemap: correctly decrement the copies counter
Raphaël Gomès <rgomes@octobus.net>
parents: 49002
diff changeset
1243 let mut had_copy_source = false;
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1244 if let Some(source) = &node.copy_source {
49922
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1245 DirstateMap::count_dropped_path(
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1246 unreachable_bytes,
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1247 Cow::Borrowed(source),
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1248 );
49003
ce919b1a1063 rust-dirstatemap: correctly decrement the copies counter
Raphaël Gomès <rgomes@octobus.net>
parents: 49002
diff changeset
1249 had_copy_source = true;
48050
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1250 node.copy_source = None
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1251 }
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1252 dropped = Dropped {
49002
fbc02ccc207e rust-dirstatemap: properly decrement counter for tracked descendants
Raphaël Gomès <rgomes@octobus.net>
parents: 49001
diff changeset
1253 was_tracked,
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
1254 had_entry,
49003
ce919b1a1063 rust-dirstatemap: correctly decrement the copies counter
Raphaël Gomès <rgomes@octobus.net>
parents: 49002
diff changeset
1255 had_copy_source,
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1256 };
47193
47ccab19bf9f dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`
Simon Sapin <simon.sapin@octobus.net>
parents: 47192
diff changeset
1257 }
47ccab19bf9f dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`
Simon Sapin <simon.sapin@octobus.net>
parents: 47192
diff changeset
1258 // After recursion, for both leaf (rest_of_path is None) nodes and
47ccab19bf9f dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`
Simon Sapin <simon.sapin@octobus.net>
parents: 47192
diff changeset
1259 // parent nodes, remove a node if it just became empty.
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1260 let remove = !node.data.has_entry()
47193
47ccab19bf9f dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`
Simon Sapin <simon.sapin@octobus.net>
parents: 47192
diff changeset
1261 && node.copy_source.is_none()
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1262 && node.children.is_empty();
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1263 if remove {
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1264 let (key, _) =
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1265 nodes.remove_entry(first_path_component).unwrap();
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1266 DirstateMap::count_dropped_path(
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1267 unreachable_bytes,
49922
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1268 Cow::Borrowed(key.full_path()),
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1269 )
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1270 }
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1271 Ok(Some((dropped, remove)))
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1272 }
47107
7dfc598ddcfe dirstate-tree: Add add_file, remove_file, and drop_file
Simon Sapin <simon.sapin@octobus.net>
parents: 47106
diff changeset
1273
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1274 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1275 if let Some((dropped, _removed)) = recur(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1276 map.on_disk,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1277 &mut map.unreachable_bytes,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1278 &mut map.root,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1279 filename,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1280 )? {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1281 if dropped.had_entry {
49001
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1282 map.nodes_with_entry_count = map
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1283 .nodes_with_entry_count
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1284 .checked_sub(1)
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1285 .expect("nodes_with_entry_count should be >= 0");
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1286 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1287 if dropped.had_copy_source {
49001
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1288 map.nodes_with_copy_source_count = map
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1289 .nodes_with_copy_source_count
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1290 .checked_sub(1)
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1291 .expect("nodes_with_copy_source_count should be >= 0");
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1292 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1293 } else {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1294 debug_assert!(!was_tracked);
47107
7dfc598ddcfe dirstate-tree: Add add_file, remove_file, and drop_file
Simon Sapin <simon.sapin@octobus.net>
parents: 47106
diff changeset
1295 }
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1296 Ok(())
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1297 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1298 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1299
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1300 pub fn has_tracked_dir(
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1301 &mut self,
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
1302 directory: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1303 ) -> Result<bool, DirstateError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1304 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1305 if let Some(node) = map.get_node(directory)? {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1306 // A node without a `DirstateEntry` was created to hold child
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1307 // nodes, and is therefore a directory.
49140
748ac6400eaa rust-dirstatemap: stop using `state()` in the cache logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49136
diff changeset
1308 let is_dir = node.entry()?.is_none();
748ac6400eaa rust-dirstatemap: stop using `state()` in the cache logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49136
diff changeset
1309 Ok(is_dir && node.tracked_descendants_count() > 0)
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1310 } else {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1311 Ok(false)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1312 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1313 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1314 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1315
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1316 pub fn has_dir(
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1317 &mut self,
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1318 directory: &HgPath,
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1319 ) -> Result<bool, DirstateError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1320 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1321 if let Some(node) = map.get_node(directory)? {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1322 // A node without a `DirstateEntry` was created to hold child
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1323 // nodes, and is therefore a directory.
49140
748ac6400eaa rust-dirstatemap: stop using `state()` in the cache logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49136
diff changeset
1324 let is_dir = node.entry()?.is_none();
748ac6400eaa rust-dirstatemap: stop using `state()` in the cache logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49136
diff changeset
1325 Ok(is_dir && node.descendants_with_entry_count() > 0)
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1326 } else {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1327 Ok(false)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1328 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1329 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1330 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1331
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
1332 #[logging_timer::time("trace")]
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1333 pub fn pack_v1(
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
1334 &self,
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1335 parents: DirstateParents,
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1336 ) -> Result<Vec<u8>, DirstateError> {
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
1337 let map = self.get_map();
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1338 // Optizimation (to be measured?): pre-compute size to avoid `Vec`
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1339 // reallocations
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1340 let mut size = parents.as_bytes().len();
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1341 for node in map.iter_nodes() {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1342 let node = node?;
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
1343 if node.entry()?.is_some() {
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
1344 size += packed_entry_size(
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1345 node.full_path(map.on_disk)?,
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1346 node.copy_source(map.on_disk)?,
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
1347 );
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1348 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1349 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1350
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1351 let mut packed = Vec::with_capacity(size);
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1352 packed.extend(parents.as_bytes());
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1353
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1354 for node in map.iter_nodes() {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1355 let node = node?;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1356 if let Some(entry) = node.entry()? {
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1357 pack_entry(
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1358 node.full_path(map.on_disk)?,
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
1359 &entry,
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1360 node.copy_source(map.on_disk)?,
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1361 &mut packed,
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1362 );
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1363 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1364 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1365 Ok(packed)
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1366 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1367
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47681
diff changeset
1368 /// Returns new data and metadata together with whether that data should be
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47681
diff changeset
1369 /// appended to the existing data file whose content is at
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1370 /// `map.on_disk` (true), instead of written to a new data file
49145
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
1371 /// (false), and the previous size of data on disk.
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
1372 #[logging_timer::time("trace")]
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1373 pub fn pack_v2(
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
1374 &self,
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
1375 write_mode: DirstateMapWriteMode,
49145
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
1376 ) -> Result<(Vec<u8>, on_disk::TreeMetadata, bool, usize), DirstateError>
dd2503a63d33 rust-dirstate-v2: save proper data size if no new data on append
Raphaël Gomès <rgomes@octobus.net>
parents: 49003
diff changeset
1377 {
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
1378 let map = self.get_map();
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
1379 on_disk::write(map, write_mode)
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
1380 }
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
1381
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1382 /// `callback` allows the caller to process and do something with the
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1383 /// results of the status. This is needed to do so efficiently (i.e.
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1384 /// without cloning the `DirstateStatus` object with its paths) because
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1385 /// we need to borrow from `Self`.
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1386 pub fn with_status<R>(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1387 &mut self,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1388 matcher: &(dyn Matcher + Sync),
47112
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47110
diff changeset
1389 root_dir: PathBuf,
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47110
diff changeset
1390 ignore_files: Vec<PathBuf>,
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47110
diff changeset
1391 options: StatusOptions,
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1392 callback: impl for<'r> FnOnce(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1393 Result<(DirstateStatus<'r>, Vec<PatternFileWarning>), StatusError>,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1394 ) -> R,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1395 ) -> R {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1396 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1397 callback(super::status::status(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1398 map,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1399 matcher,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1400 root_dir,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1401 ignore_files,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1402 options,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1403 ))
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1404 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1405 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1406
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1407 pub fn copy_map_len(&self) -> usize {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1408 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1409 map.nodes_with_copy_source_count as usize
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1410 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1411
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1412 pub fn copy_map_iter(&self) -> CopyMapIter<'_> {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1413 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1414 Box::new(filter_map_results(map.iter_nodes(), move |node| {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1415 Ok(if let Some(source) = node.copy_source(map.on_disk)? {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1416 Some((node.full_path(map.on_disk)?, source))
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1417 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1418 None
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1419 })
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1420 }))
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1421 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1422
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1423 pub fn copy_map_contains_key(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1424 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1425 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1426 ) -> Result<bool, DirstateV2ParseError> {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1427 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1428 Ok(if let Some(node) = map.get_node(key)? {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1429 node.has_copy_source()
47099
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
1430 } else {
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
1431 false
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1432 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1433 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1434
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1435 pub fn copy_map_get(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1436 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1437 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1438 ) -> Result<Option<&HgPath>, DirstateV2ParseError> {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1439 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1440 if let Some(node) = map.get_node(key)? {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1441 if let Some(source) = node.copy_source(map.on_disk)? {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1442 return Ok(Some(source));
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1443 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1444 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1445 Ok(None)
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1446 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1447
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1448 pub fn copy_map_remove(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1449 &mut self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1450 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1451 ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1452 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1453 let count = &mut map.nodes_with_copy_source_count;
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1454 let unreachable_bytes = &mut map.unreachable_bytes;
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
1455 Ok(DirstateMap::get_node_mut_inner(
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1456 map.on_disk,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1457 unreachable_bytes,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1458 &mut map.root,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1459 key,
49131
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
1460 |_ancestor| {},
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1461 )?
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1462 .and_then(|node| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1463 if let Some(source) = &node.copy_source {
49134
8c59d8adcf5b rust-dirstatemap: use a checked sub instead of a potentially underflowing one
Raphaël Gomès <rgomes@octobus.net>
parents: 49133
diff changeset
1464 *count = count
8c59d8adcf5b rust-dirstatemap: use a checked sub instead of a potentially underflowing one
Raphaël Gomès <rgomes@octobus.net>
parents: 49133
diff changeset
1465 .checked_sub(1)
8c59d8adcf5b rust-dirstatemap: use a checked sub instead of a potentially underflowing one
Raphaël Gomès <rgomes@octobus.net>
parents: 49133
diff changeset
1466 .expect("nodes_with_copy_source_count should be >= 0");
49922
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1467 DirstateMap::count_dropped_path(
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1468 unreachable_bytes,
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1469 Cow::Borrowed(source),
b6dc4802e7ef rust: don't use a reference to a `Cow`
Raphaël Gomès <rgomes@octobus.net>
parents: 49921
diff changeset
1470 );
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1471 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1472 node.copy_source.take().map(Cow::into_owned)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1473 }))
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1474 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1475 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1476
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1477 pub fn copy_map_insert(
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1478 &mut self,
49124
d9a66d62c604 rust-dirstatemap: use `&HgPath` instead of `HgPathBuf` in `copy_map_insert`
Raphaël Gomès <rgomes@octobus.net>
parents: 49123
diff changeset
1479 key: &HgPath,
d9a66d62c604 rust-dirstatemap: use `&HgPath` instead of `HgPathBuf` in `copy_map_insert`
Raphaël Gomès <rgomes@octobus.net>
parents: 49123
diff changeset
1480 value: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1481 ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1482 self.with_dmap_mut(|map| {
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
1483 let node = map.get_or_insert_node(key, |_ancestor| {})?;
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1484 let had_copy_source = node.copy_source.is_none();
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1485 let old = node
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1486 .copy_source
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1487 .replace(value.to_owned().into())
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1488 .map(Cow::into_owned);
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1489 if had_copy_source {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1490 map.nodes_with_copy_source_count += 1
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1491 }
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1492 Ok(old)
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1493 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1494 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1495
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1496 pub fn len(&self) -> usize {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1497 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1498 map.nodes_with_entry_count as usize
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1499 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1500
49923
547d6817e0c3 rust-clippy: add `is_empty` method to please the `clippy` gods
Raphaël Gomès <rgomes@octobus.net>
parents: 49922
diff changeset
1501 pub fn is_empty(&self) -> bool {
547d6817e0c3 rust-clippy: add `is_empty` method to please the `clippy` gods
Raphaël Gomès <rgomes@octobus.net>
parents: 49922
diff changeset
1502 self.len() == 0
547d6817e0c3 rust-clippy: add `is_empty` method to please the `clippy` gods
Raphaël Gomès <rgomes@octobus.net>
parents: 49922
diff changeset
1503 }
547d6817e0c3 rust-clippy: add `is_empty` method to please the `clippy` gods
Raphaël Gomès <rgomes@octobus.net>
parents: 49922
diff changeset
1504
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1505 pub fn contains_key(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1506 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1507 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1508 ) -> Result<bool, DirstateV2ParseError> {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1509 Ok(self.get(key)?.is_some())
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1510 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1511
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1512 pub fn get(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1513 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1514 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1515 ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1516 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1517 Ok(if let Some(node) = map.get_node(key)? {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1518 node.entry()?
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1519 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1520 None
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1521 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1522 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1523
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1524 pub fn iter(&self) -> StateMapIter<'_> {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1525 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1526 Box::new(filter_map_results(map.iter_nodes(), move |node| {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1527 Ok(if let Some(entry) = node.entry()? {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1528 Some((node.full_path(map.on_disk)?, entry))
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1529 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1530 None
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1531 })
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1532 }))
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1533 }
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1534
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1535 pub fn iter_tracked_dirs(
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1536 &mut self,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1537 ) -> Result<
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1538 Box<
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1539 dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>>
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1540 + Send
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1541 + '_,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1542 >,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1543 DirstateError,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1544 > {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1545 let map = self.get_map();
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1546 let on_disk = map.on_disk;
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1547 Ok(Box::new(filter_map_results(
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1548 map.iter_nodes(),
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1549 move |node| {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1550 Ok(if node.tracked_descendants_count() > 0 {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1551 Some(node.full_path(on_disk)?)
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1552 } else {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1553 None
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1554 })
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1555 },
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1556 )))
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1557 }
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1558
49120
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1559 /// Only public because it needs to be exposed to the Python layer.
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1560 /// It is not the full `setparents` logic, only the parts that mutate the
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1561 /// entries.
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1562 pub fn setparents_fixup(
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1563 &mut self,
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1564 ) -> Result<Vec<(HgPathBuf, HgPathBuf)>, DirstateV2ParseError> {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1565 // XXX
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1566 // All the copying and re-querying is quite inefficient, but this is
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1567 // still a lot better than doing it from Python.
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1568 //
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1569 // The better solution is to develop a mechanism for `iter_mut`,
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1570 // which will be a lot more involved: we're dealing with a lazy,
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1571 // append-mostly, tree-like data structure. This will do for now.
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1572 let mut copies = vec![];
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1573 let mut files_with_p2_info = vec![];
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1574 for res in self.iter() {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1575 let (path, entry) = res?;
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1576 if entry.p2_info() {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1577 files_with_p2_info.push(path.to_owned())
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1578 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1579 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1580 self.with_dmap_mut(|map| {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1581 for path in files_with_p2_info.iter() {
49130
3926bfef28e4 rust-dirstatemap: add simpler method `get_or_insert_node` for the common case
Raphaël Gomès <rgomes@octobus.net>
parents: 49129
diff changeset
1582 let node = map.get_or_insert_node(path, |_| {})?;
49120
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1583 let entry =
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1584 node.data.as_entry_mut().expect("entry should exist");
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1585 entry.drop_merge_data();
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1586 if let Some(source) = node.copy_source.take().as_deref() {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1587 copies.push((path.to_owned(), source.to_owned()));
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1588 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1589 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1590 Ok(copies)
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1591 })
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1592 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1593
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1594 pub fn debug_iter(
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1595 &self,
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
1596 all: bool,
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1597 ) -> Box<
49924
66ffe3749a48 rust-clippy: simplify return type of debug function
Raphaël Gomès <rgomes@octobus.net>
parents: 49923
diff changeset
1598 dyn Iterator<Item = Result<DebugDirstateTuple, DirstateV2ParseError>>
66ffe3749a48 rust-clippy: simplify return type of debug function
Raphaël Gomès <rgomes@octobus.net>
parents: 49923
diff changeset
1599 + Send
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1600 + '_,
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1601 > {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1602 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1603 Box::new(filter_map_results(map.iter_nodes(), move |node| {
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1604 let debug_tuple = if let Some(entry) = node.entry()? {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1605 entry.debug_tuple()
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
1606 } else if !all {
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
1607 return Ok(None);
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
1608 } else if let Some(mtime) = node.cached_directory_mtime()? {
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
1609 (b' ', 0, -1, mtime.truncated_seconds() as i32)
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1610 } else {
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1611 (b' ', 0, -1, -1)
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1612 };
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1613 Ok(Some((node.full_path(map.on_disk)?, debug_tuple)))
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1614 }))
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1615 }
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1616 }
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1617 #[cfg(test)]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1618 mod tests {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1619 use super::*;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1620
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1621 /// Shortcut to return tracked descendants of a path.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1622 /// Panics if the path does not exist.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1623 fn tracked_descendants(map: &OwningDirstateMap, path: &[u8]) -> u32 {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1624 let path = dbg!(HgPath::new(path));
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1625 let node = map.get_map().get_node(path);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1626 node.unwrap().unwrap().tracked_descendants_count()
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1627 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1628
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1629 /// Shortcut to return descendants with an entry.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1630 /// Panics if the path does not exist.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1631 fn descendants_with_an_entry(map: &OwningDirstateMap, path: &[u8]) -> u32 {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1632 let path = dbg!(HgPath::new(path));
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1633 let node = map.get_map().get_node(path);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1634 node.unwrap().unwrap().descendants_with_entry_count()
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1635 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1636
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1637 fn assert_does_not_exist(map: &OwningDirstateMap, path: &[u8]) {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1638 let path = dbg!(HgPath::new(path));
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1639 let node = map.get_map().get_node(path);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1640 assert!(node.unwrap().is_none());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1641 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1642
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1643 /// Shortcut for path creation in tests
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1644 fn p(b: &[u8]) -> &HgPath {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1645 HgPath::new(b)
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1646 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1647
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1648 /// Test the very simple case a single tracked file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1649 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1650 fn test_tracked_descendants_simple() -> Result<(), DirstateError> {
52033
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
1651 let mut map = OwningDirstateMap::new_empty(vec![], None);
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1652 assert_eq!(map.len(), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1653
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1654 map.set_tracked(p(b"some/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1655
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1656 assert_eq!(map.len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1657 assert_eq!(tracked_descendants(&map, b"some"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1658 assert_eq!(tracked_descendants(&map, b"some/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1659 assert_eq!(tracked_descendants(&map, b"some/nested/path"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1660
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1661 map.set_untracked(p(b"some/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1662 assert_eq!(map.len(), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1663 assert!(map.get_map().get_node(p(b"some"))?.is_none());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1664
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1665 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1666 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1667
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1668 /// Test the simple case of all tracked, but multiple files
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1669 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1670 fn test_tracked_descendants_multiple() -> Result<(), DirstateError> {
52033
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
1671 let mut map = OwningDirstateMap::new_empty(vec![], None);
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1672
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1673 map.set_tracked(p(b"some/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1674 map.set_tracked(p(b"some/nested/file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1675 // one layer without any files to test deletion cascade
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1676 map.set_tracked(p(b"some/other/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1677 map.set_tracked(p(b"root_file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1678 map.set_tracked(p(b"some/file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1679 map.set_tracked(p(b"some/file2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1680 map.set_tracked(p(b"some/file3"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1681
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1682 assert_eq!(map.len(), 7);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1683 assert_eq!(tracked_descendants(&map, b"some"), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1684 assert_eq!(tracked_descendants(&map, b"some/nested"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1685 assert_eq!(tracked_descendants(&map, b"some/other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1686 assert_eq!(tracked_descendants(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1687 assert_eq!(tracked_descendants(&map, b"some/nested/path"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1688
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1689 map.set_untracked(p(b"some/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1690 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1691 assert_eq!(tracked_descendants(&map, b"some"), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1692 assert_eq!(tracked_descendants(&map, b"some/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1693 assert_eq!(tracked_descendants(&map, b"some/other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1694 assert_eq!(tracked_descendants(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1695
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1696 map.set_untracked(p(b"some/nested/file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1697 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1698 assert_eq!(tracked_descendants(&map, b"some"), 4);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1699 assert_eq!(tracked_descendants(&map, b"some/other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1700 assert_eq!(tracked_descendants(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1701 assert_does_not_exist(&map, b"some_nested");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1702
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1703 map.set_untracked(p(b"some/other/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1704 assert_eq!(map.len(), 4);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1705 assert_eq!(tracked_descendants(&map, b"some"), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1706 assert_does_not_exist(&map, b"some/other");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1707
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1708 map.set_untracked(p(b"root_file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1709 assert_eq!(map.len(), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1710 assert_eq!(tracked_descendants(&map, b"some"), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1711 assert_does_not_exist(&map, b"root_file");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1712
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1713 map.set_untracked(p(b"some/file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1714 assert_eq!(map.len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1715 assert_eq!(tracked_descendants(&map, b"some"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1716 assert_does_not_exist(&map, b"some/file");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1717
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1718 map.set_untracked(p(b"some/file2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1719 assert_eq!(map.len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1720 assert_eq!(tracked_descendants(&map, b"some"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1721 assert_does_not_exist(&map, b"some/file2");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1722
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1723 map.set_untracked(p(b"some/file3"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1724 assert_eq!(map.len(), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1725 assert_does_not_exist(&map, b"some/file3");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1726
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1727 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1728 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1729
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1730 /// Check with a mix of tracked and non-tracked items
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1731 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1732 fn test_tracked_descendants_different() -> Result<(), DirstateError> {
52033
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
1733 let mut map = OwningDirstateMap::new_empty(vec![], None);
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1734
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1735 // A file that was just added
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1736 map.set_tracked(p(b"some/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1737 // This has no information, the dirstate should ignore it
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1738 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1739 filename: p(b"some/file"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1740 wc_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1741 p1_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1742 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1743 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1744 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1745 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1746 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1747 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1748 assert_does_not_exist(&map, b"some/file");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1749
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1750 // A file that was removed
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1751 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1752 filename: p(b"some/nested/file"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1753 wc_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1754 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1755 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1756 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1757 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1758 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1759 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1760 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1761 assert!(!map.get(p(b"some/nested/file"))?.unwrap().tracked());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1762 // Only present in p2
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1763 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1764 filename: p(b"some/file3"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1765 wc_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1766 p1_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1767 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1768 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1769 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1770 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1771 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1772 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1773 assert!(!map.get(p(b"some/file3"))?.unwrap().tracked());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1774 // A file that was merged
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1775 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1776 filename: p(b"root_file"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1777 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1778 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1779 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1780 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1781 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1782 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1783 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1784 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1785 assert!(map.get(p(b"root_file"))?.unwrap().tracked());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1786 // A file that is added, with info from p2
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1787 // XXX is that actually possible?
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1788 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1789 filename: p(b"some/file2"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1790 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1791 p1_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1792 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1793 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1794 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1795 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1796 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1797 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1798 assert!(map.get(p(b"some/file2"))?.unwrap().tracked());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1799 // A clean file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1800 // One layer without any files to test deletion cascade
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1801 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1802 filename: p(b"some/other/nested/path"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1803 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1804 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1805 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1806 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1807 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1808 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1809 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1810 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1811 assert!(map.get(p(b"some/other/nested/path"))?.unwrap().tracked());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1812
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1813 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1814 assert_eq!(tracked_descendants(&map, b"some"), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1815 assert_eq!(descendants_with_an_entry(&map, b"some"), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1816 assert_eq!(tracked_descendants(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1817 assert_eq!(descendants_with_an_entry(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1818 assert_eq!(tracked_descendants(&map, b"some/other/nested/path"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1819 assert_eq!(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1820 descendants_with_an_entry(&map, b"some/other/nested/path"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1821 0
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1822 );
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1823 assert_eq!(tracked_descendants(&map, b"some/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1824 assert_eq!(descendants_with_an_entry(&map, b"some/nested"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1825
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1826 // might as well check this
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1827 map.set_untracked(p(b"path/does/not/exist"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1828 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1829
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1830 map.set_untracked(p(b"some/other/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1831 // It is set untracked but not deleted since it held other information
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1832 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1833 assert_eq!(tracked_descendants(&map, b"some"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1834 assert_eq!(descendants_with_an_entry(&map, b"some"), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1835 assert_eq!(descendants_with_an_entry(&map, b"some/other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1836 assert_eq!(descendants_with_an_entry(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1837 assert_eq!(tracked_descendants(&map, b"some/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1838 assert_eq!(descendants_with_an_entry(&map, b"some/nested"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1839
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1840 map.set_untracked(p(b"some/nested/path"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1841 // It is set untracked *and* deleted since it was only added
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1842 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1843 assert_eq!(tracked_descendants(&map, b"some"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1844 assert_eq!(descendants_with_an_entry(&map, b"some"), 4);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1845 assert_eq!(tracked_descendants(&map, b"some/nested"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1846 assert_eq!(descendants_with_an_entry(&map, b"some/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1847 assert_does_not_exist(&map, b"some/nested/path");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1848
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1849 map.set_untracked(p(b"root_file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1850 // Untracked but not deleted
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1851 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1852 assert!(map.get(p(b"root_file"))?.is_some());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1853
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1854 map.set_untracked(p(b"some/file2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1855 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1856 assert_eq!(tracked_descendants(&map, b"some"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1857 assert!(map.get(p(b"some/file2"))?.is_some());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1858
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1859 map.set_untracked(p(b"some/file3"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1860 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1861 assert_eq!(tracked_descendants(&map, b"some"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1862 assert!(map.get(p(b"some/file3"))?.is_some());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1863
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1864 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1865 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1866
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1867 /// Check that copies counter is correctly updated
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1868 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1869 fn test_copy_source() -> Result<(), DirstateError> {
52033
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
1870 let mut map = OwningDirstateMap::new_empty(vec![], None);
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1871
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1872 // Clean file
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1873 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1874 filename: p(b"files/clean"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1875 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1876 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1877 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1878 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1879 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1880 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1881 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1882 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1883 // Merged file
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1884 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1885 filename: p(b"files/from_p2"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1886 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1887 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1888 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1889 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1890 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1891 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1892 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1893 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1894 // Removed file
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1895 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1896 filename: p(b"removed"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1897 wc_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1898 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1899 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1900 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1901 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1902 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1903 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1904 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1905 // Added file
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1906 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1907 filename: p(b"files/added"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1908 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1909 p1_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1910 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1911 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1912 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1913 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1914 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1915 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1916 // Add copy
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1917 map.copy_map_insert(p(b"files/clean"), p(b"clean_copy_source"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1918 assert_eq!(map.copy_map_len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1919
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1920 // Copy override
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1921 map.copy_map_insert(p(b"files/clean"), p(b"other_clean_copy_source"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1922 assert_eq!(map.copy_map_len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1923
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1924 // Multiple copies
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1925 map.copy_map_insert(p(b"removed"), p(b"removed_copy_source"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1926 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1927
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1928 map.copy_map_insert(p(b"files/added"), p(b"added_copy_source"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1929 assert_eq!(map.copy_map_len(), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1930
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1931 // Added, so the entry is completely removed
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1932 map.set_untracked(p(b"files/added"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1933 assert_does_not_exist(&map, b"files/added");
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1934 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1935
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1936 // Removed, so the entry is kept around, so is its copy
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1937 map.set_untracked(p(b"removed"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1938 assert!(map.get(p(b"removed"))?.is_some());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1939 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1940
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1941 // Clean, so the entry is kept around, but not its copy
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1942 map.set_untracked(p(b"files/clean"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1943 assert!(map.get(p(b"files/clean"))?.is_some());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1944 assert_eq!(map.copy_map_len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1945
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1946 map.copy_map_insert(p(b"files/from_p2"), p(b"from_p2_copy_source"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1947 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1948
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1949 // Info from p2, so its copy source info is kept around
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1950 map.set_untracked(p(b"files/from_p2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1951 assert!(map.get(p(b"files/from_p2"))?.is_some());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1952 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1953
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1954 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1955 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1956
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1957 /// Test with "on disk" data. For the sake of this test, the "on disk" data
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1958 /// does not actually come from the disk, but it's opaque to the code being
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1959 /// tested.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1960 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1961 fn test_on_disk() -> Result<(), DirstateError> {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1962 // First let's create some data to put "on disk"
52033
88aa21d654e5 rust-dirstate: actually remember the identity
Raphaël Gomès <rgomes@octobus.net>
parents: 51735
diff changeset
1963 let mut map = OwningDirstateMap::new_empty(vec![], None);
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1964
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1965 // A file that was just added
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1966 map.set_tracked(p(b"some/nested/added"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1967 map.copy_map_insert(p(b"some/nested/added"), p(b"added_copy_source"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1968
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1969 // A file that was removed
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1970 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1971 filename: p(b"some/nested/removed"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1972 wc_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1973 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1974 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1975 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1976 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1977 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1978 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1979 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1980 // Only present in p2
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1981 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1982 filename: p(b"other/p2_info_only"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1983 wc_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1984 p1_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1985 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1986 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1987 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1988 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1989 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1990 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1991 map.copy_map_insert(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1992 p(b"other/p2_info_only"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1993 p(b"other/p2_info_copy_source"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1994 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1995 // A file that was merged
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1996 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1997 filename: p(b"merged"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1998 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
1999 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2000 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2001 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2002 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2003 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2004 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2005 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2006 // A file that is added, with info from p2
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2007 // XXX is that actually possible?
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2008 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2009 filename: p(b"other/added_with_p2"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2010 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2011 p1_tracked: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2012 p2_info: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2013 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2014 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2015 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2016 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2017 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2018 // One layer without any files to test deletion cascade
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2019 // A clean file
52044
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2020 let reset = DirstateEntryReset {
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2021 filename: p(b"some/other/nested/clean"),
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2022 wc_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2023 p1_tracked: true,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2024 p2_info: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2025 has_meaningful_mtime: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2026 parent_file_data_opt: None,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2027 from_empty: false,
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2028 };
0cd16b1d613f rust-dirstate: use a struct as arguments for the high-level `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 52033
diff changeset
2029 map.reset_state(reset)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2030
49147
10b9f11daf15 branching: merge stable into default
Raphaël Gomès <rgomes@octobus.net>
parents: 49143 49145
diff changeset
2031 let (packed, metadata, _should_append, _old_data_size) =
50221
1891086f6c7f dirstate: use more than a bool to control append behavior
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49373
diff changeset
2032 map.pack_v2(DirstateMapWriteMode::ForceNewDataFile)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2033 let packed_len = packed.len();
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2034 assert!(packed_len > 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2035
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2036 // Recreate "from disk"
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2037 let mut map = OwningDirstateMap::new_v2(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2038 packed,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2039 packed_len,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2040 metadata.as_bytes(),
50243
6cce0afc1454 rust-dirstate: remember the data file uuid dirstate was loaded with
Raphaël Gomès <rgomes@octobus.net>
parents: 50222
diff changeset
2041 vec![],
50245
dbe09fb038fc rhg: remember the inode of .hg/dirstate
Raphaël Gomès <rgomes@octobus.net>
parents: 50243
diff changeset
2042 None,
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2043 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2044
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2045 // Check that everything is accounted for
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2046 assert!(map.contains_key(p(b"some/nested/added"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2047 assert!(map.contains_key(p(b"some/nested/removed"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2048 assert!(map.contains_key(p(b"merged"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2049 assert!(map.contains_key(p(b"other/p2_info_only"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2050 assert!(map.contains_key(p(b"other/added_with_p2"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2051 assert!(map.contains_key(p(b"some/other/nested/clean"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2052 assert_eq!(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2053 map.copy_map_get(p(b"some/nested/added"))?,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2054 Some(p(b"added_copy_source"))
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2055 );
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2056 assert_eq!(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2057 map.copy_map_get(p(b"other/p2_info_only"))?,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2058 Some(p(b"other/p2_info_copy_source"))
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2059 );
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2060 assert_eq!(tracked_descendants(&map, b"some"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2061 assert_eq!(descendants_with_an_entry(&map, b"some"), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2062 assert_eq!(tracked_descendants(&map, b"other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2063 assert_eq!(descendants_with_an_entry(&map, b"other"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2064 assert_eq!(tracked_descendants(&map, b"some/other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2065 assert_eq!(descendants_with_an_entry(&map, b"some/other"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2066 assert_eq!(tracked_descendants(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2067 assert_eq!(descendants_with_an_entry(&map, b"some/other/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2068 assert_eq!(tracked_descendants(&map, b"some/nested"), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2069 assert_eq!(descendants_with_an_entry(&map, b"some/nested"), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2070 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2071 assert_eq!(map.get_map().unreachable_bytes, 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2072 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2073
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2074 // Shouldn't change anything since it's already not tracked
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2075 map.set_untracked(p(b"some/nested/removed"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2076 assert_eq!(map.get_map().unreachable_bytes, 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2077
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2078 if let ChildNodes::InMemory(_) = map.get_map().root {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2079 panic!("root should not have been mutated")
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2080 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2081 // We haven't mutated enough (nothing, actually), we should still be in
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2082 // the append strategy
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2083 assert!(map.get_map().write_should_append());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2084
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2085 // But this mutates the structure, so there should be unreachable_bytes
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2086 assert!(map.set_untracked(p(b"some/nested/added"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2087 let unreachable_bytes = map.get_map().unreachable_bytes;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2088 assert!(unreachable_bytes > 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2089
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2090 if let ChildNodes::OnDisk(_) = map.get_map().root {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2091 panic!("root should have been mutated")
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2092 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2093
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2094 // This should not mutate the structure either, since `root` has
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2095 // already been mutated along with its direct children.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2096 map.set_untracked(p(b"merged"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2097 assert_eq!(map.get_map().unreachable_bytes, unreachable_bytes);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2098
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2099 if let NodeRef::InMemory(_, _) =
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2100 map.get_map().get_node(p(b"other/added_with_p2"))?.unwrap()
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2101 {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2102 panic!("'other/added_with_p2' should not have been mutated")
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2103 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2104 // But this should, since it's in a different path
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2105 // than `<root>some/nested/add`
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2106 map.set_untracked(p(b"other/added_with_p2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2107 assert!(map.get_map().unreachable_bytes > unreachable_bytes);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2108
49930
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2109 if let NodeRef::OnDisk(_) =
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2110 map.get_map().get_node(p(b"other/added_with_p2"))?.unwrap()
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2111 {
e98fd81bb151 rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents: 49924
diff changeset
2112 panic!("'other/added_with_p2' should have been mutated")
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2113 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2114
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2115 // We have rewritten most of the tree, we should create a new file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2116 assert!(!map.get_map().write_should_append());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2117
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2118 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2119 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
2120 }