Mercurial > hg
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 |
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 | 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 } |