annotate rust/hg-core/src/dirstate_tree/dirstate_map.rs @ 49913:c15b415d1bff

rust: use `logging_timer` instead of `micro_timer` I am the author of `micro_timer`. I built it at the time because I couldn't find a crate that was simple to use and flexible to do function timing with. Turns out I just couldn't find it because crates.io's search isn't all that great, or maybe I didn't look hard enough. `logging_timer` is better in every way: - supports changing the logging level - supports start and end logging - supports intermediary messages - supports inline macros - supports formatting the output - better IDE/tree-sitter integration thanks to a more robust proc macro I also changed all uses to one-liners, so it's easier to copy-paste.
author Raphaël Gomès <rgomes@octobus.net>
date Fri, 06 Jan 2023 18:52:04 +0100
parents f8ec7b16c98f
children 5fff90c7ea9d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1 use bytes_cast::BytesCast;
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
2 use std::borrow::Cow;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
3 use std::path::PathBuf;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
4
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
5 use super::on_disk;
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
6 use super::on_disk::DirstateV2ParseError;
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
7 use super::owning::OwningDirstateMap;
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
8 use super::path_with_basename::WithBasename;
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
9 use crate::dirstate::parsers::pack_entry;
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
10 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
11 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
12 use crate::dirstate::CopyMapIter;
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
13 use crate::dirstate::DirstateV2Data;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
14 use crate::dirstate::ParentFileData;
48068
bf8837e3d7ce dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents: 48061
diff changeset
15 use crate::dirstate::StateMapIter;
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
16 use crate::dirstate::TruncatedTimestamp;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
17 use crate::matchers::Matcher;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
18 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
19 use crate::DirstateEntry;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
20 use crate::DirstateError;
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
21 use crate::DirstateMapError;
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
22 use crate::DirstateParents;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
23 use crate::DirstateStatus;
48950
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
24 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
25 use crate::PatternFileWarning;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
26 use crate::StatusError;
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
27 use crate::StatusOptions;
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
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
40 #[derive(Debug)]
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
41 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
42 /// 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
43 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
44
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
45 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
46
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
47 /// 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
48 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
49
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
50 /// 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
51 /// `.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
52 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
53
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47352
diff changeset
54 /// See on_disk::Header
0ef8231e413f dirstate-v2: Store a hash of ignore patterns (.hgignore)
Simon Sapin <simon.sapin@octobus.net>
parents: 47352
diff changeset
55 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
56
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
57 /// 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
58 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
59
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
60 /// Size of the data used to first load this `DirstateMap`. Used in case
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
61 /// we need to write some new metadata, but no new data on disk.
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
62 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
63
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
64 pub(super) dirstate_version: DirstateVersion,
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
65 }
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
66
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
67 /// 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
68 /// 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
69 /// 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
70 /// 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
71 /// 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
72 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
73
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
74 /// 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
75 /// 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
76 #[derive(Debug)]
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
77 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
78 InMemory(&'tree HgPathBuf),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
79 OnDisk(&'on_disk HgPath),
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
80 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
81
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
82 #[derive(Debug)]
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
83 pub(super) enum ChildNodes<'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
84 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
85 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
86 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
87
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
88 #[derive(Debug)]
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
89 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
90 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
91 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
92 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
93
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
94 #[derive(Debug)]
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
95 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
96 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
97 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
98 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
99
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
100 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
101 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
102 match *self {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
103 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
104 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
105 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
106 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
107 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
108
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
109 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
110 type Target = HgPath;
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
111
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
112 fn deref(&self) -> &HgPath {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
113 match *self {
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
114 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
115 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
116 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
117 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
118 }
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
119
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
120 impl Default for ChildNodes<'_> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
121 fn default() -> Self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
122 ChildNodes::InMemory(Default::default())
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
123 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
124 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
125
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
126 impl<'on_disk> ChildNodes<'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
127 pub(super) fn as_ref<'tree>(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
128 &'tree self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
129 ) -> ChildNodesRef<'tree, 'on_disk> {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
130 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
131 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
132 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
133 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
134 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
135
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
136 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
137 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
138 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
139 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
140 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
141 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
142
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
143 fn make_mut(
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
144 &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
145 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
146 unreachable_bytes: &mut u32,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
147 ) -> Result<
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
148 &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
149 DirstateV2ParseError,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
150 > {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
151 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
152 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
153 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
154 *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
155 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
156 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
157 .iter()
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
158 .map(|node| {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
159 Ok((
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
160 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
161 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
162 ))
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
163 })
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
164 .collect::<Result<_, _>>()?;
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
165 *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
166 match self {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
167 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
168 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
169 }
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
170 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
171 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
172 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
173 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
174
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
175 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
176 pub(super) fn get(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
177 &self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
178 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
179 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
180 ) -> 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
181 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
182 ChildNodesRef::InMemory(nodes) => Ok(nodes
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
183 .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
184 .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
185 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
186 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
187 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
188 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
189 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
190 Err(e) => {
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
191 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
192 // 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
193 // 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
194 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
195 }
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
196 }
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
197 });
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
198 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
199 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
200 })
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
201 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
202 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
203 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
204
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
205 /// Iterate in undefined order
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
206 pub(super) fn iter(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
207 &self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
208 ) -> 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
209 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
210 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
211 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
212 ),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
213 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
214 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
215 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
216 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
217 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
218
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
219 /// Iterate in parallel in undefined order
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
220 pub(super) fn par_iter(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
221 &self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
222 ) -> 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
223 {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
224 use rayon::prelude::*;
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
225 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
226 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
227 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
228 ),
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
229 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
230 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
231 ),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
232 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
233 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
234
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
235 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
236 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
237 ChildNodesRef::InMemory(nodes) => {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
238 let mut vec: Vec<_> = nodes
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
239 .iter()
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
240 .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
241 .collect();
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
242 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
243 match node {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
244 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
245 NodeRef::OnDisk(_) => unreachable!(),
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
246 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
247 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
248 // `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
249 // 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
250 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
251 vec
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
252 }
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
253 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
254 // 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
255 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
256 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
257 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
258 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
259 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
260
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
261 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
262 pub(super) fn full_path(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
263 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
264 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
265 ) -> Result<&'tree HgPath, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
266 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
267 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
268 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
269 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
270 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
271
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
272 /// 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
273 /// HgPath>` detached from `'tree`
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
274 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
275 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
276 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
277 ) -> 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
278 match self {
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
279 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
280 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
281 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
282 },
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
283 NodeRef::OnDisk(node) => {
47347
73ddcedeaadf dirstate-tree: Change status() results to not borrow DirstateMap
Simon Sapin <simon.sapin@octobus.net>
parents: 47337
diff changeset
284 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
285 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
286 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
287 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
288
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
289 pub(super) fn base_name(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
290 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
291 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
292 ) -> Result<&'tree HgPath, DirstateV2ParseError> {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
293 match self {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
294 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
295 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
296 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
297 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
298
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
299 pub(super) fn children(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
300 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
301 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
302 ) -> 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
303 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
304 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
305 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
306 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
307 }
47333
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 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
310
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
311 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
312 match self {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
313 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
314 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
315 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
316 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
317
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
318 pub(super) fn copy_source(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
319 &self,
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
320 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
321 ) -> Result<Option<&'tree HgPath>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
322 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
323 NodeRef::InMemory(_path, node) => {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
324 Ok(node.copy_source.as_ref().map(|s| &**s))
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
325 }
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
326 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
327 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
328 }
48454
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
329 /// 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
330 /// HgPath>` detached from `'tree`
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
331 pub(super) fn copy_source_borrowed(
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
332 &self,
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
333 on_disk: &'on_disk [u8],
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
334 ) -> 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
335 {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
336 Ok(match self {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
337 NodeRef::InMemory(_path, node) => {
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
338 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
339 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
340 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
341 })
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
342 }
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
343 NodeRef::OnDisk(node) => node
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
344 .copy_source(on_disk)?
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
345 .map(|source| BorrowedPath::OnDisk(source)),
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
346 })
473af5cbc209 rhg: Add support for `rhg status --copies`
Simon Sapin <simon.sapin@octobus.net>
parents: 48421
diff changeset
347 }
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
348
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
349 pub(super) fn entry(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
350 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
351 ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
352 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
353 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
354 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
355 }
47337
0654b3b3d2b5 dirstate-v2: Parse the dirstate lazily, with copy-on-write nodes
Simon Sapin <simon.sapin@octobus.net>
parents: 47336
diff changeset
356 NodeRef::OnDisk(node) => node.entry(),
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
357 }
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
358 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
359
47349
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
360 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
361 &self,
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
362 ) -> 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
363 match self {
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
364 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
365 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
366 _ => None,
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
367 }),
47349
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
368 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
369 }
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
370 }
7138c863d0a1 dirstate-v2: Skip readdir in status based on directory mtime
Simon Sapin <simon.sapin@octobus.net>
parents: 47348
diff changeset
371
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
372 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
373 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
374 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
375 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
376 }
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
377 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
378 }
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
379 }
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
380
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
381 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
382 match self {
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
383 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
384 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
385 }
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 }
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
388
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
389 /// 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
390 #[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
391 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
392 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
393
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
394 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
395
47125
9be618452c3b dirstate-tree: Borrow copy source paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47124
diff changeset
396 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
397
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
398 /// 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
399 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
400
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
401 /// 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
402 /// 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
403 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
404 }
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
405
49125
28a6178a07a2 rust: add `Debug` trait to a bunch of structs
Raphaël Gomès <rgomes@octobus.net>
parents: 49124
diff changeset
406 #[derive(Debug)]
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
407 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
408 Entry(DirstateEntry),
48193
320de901896a dirstate-v2: Truncate directory mtimes to 31 bits of seconds
Simon Sapin <simon.sapin@octobus.net>
parents: 48192
diff changeset
409 CachedDirectory { mtime: TruncatedTimestamp },
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
410 None,
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
411 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
412
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
413 impl Default for NodeData {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
414 fn default() -> Self {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
415 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
416 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
417 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
418
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
419 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
420 fn has_entry(&self) -> bool {
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
421 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
422 NodeData::Entry(_) => true,
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
423 _ => false,
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
424 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
425 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
426
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
427 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
428 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
429 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
430 _ => None,
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
431 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
432 }
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
433
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
434 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
435 match self {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
436 NodeData::Entry(entry) => Some(entry),
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
437 _ => None,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
438 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
439 }
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
440 }
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
441
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
442 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
443 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
444 Self {
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
445 on_disk,
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
446 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
447 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
448 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
449 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
450 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
451 old_data_size: 0,
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
452 dirstate_version: DirstateVersion::V1,
47283
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
453 }
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
454 }
2a9ddc8094c7 dirstate-v2: Change the on-disk format to be tree-shaped
Simon Sapin <simon.sapin@octobus.net>
parents: 47282
diff changeset
455
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
456 #[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
457 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
458 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
459 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
460 metadata: &[u8],
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
461 ) -> Result<Self, DirstateError> {
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
462 if let Some(data) = on_disk.get(..data_size) {
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47681
diff changeset
463 Ok(on_disk::read(data, metadata)?)
47675
48aec076b8fb dirstate-v2: Enforce data size read from the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47674
diff changeset
464 } else {
49373
f8ec7b16c98f rust: add message to `DirstateV2ParseError` to give some context
Raphaël Gomès <rgomes@octobus.net>
parents: 49365
diff changeset
465 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
466 }
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
467 }
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
468
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
469 #[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
470 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
471 on_disk: &'on_disk [u8],
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
472 ) -> 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
473 let mut map = Self::empty(on_disk);
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
474 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
475 return Ok((map, None));
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
476 }
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
477
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
478 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
479 map.on_disk,
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
480 |path, entry, copy_source| {
49136
3f5e207f78be rust: use `entry.tracked()` directly
Raphaël Gomès <rgomes@octobus.net>
parents: 49134
diff changeset
481 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
482 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
483 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
484 &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
485 &mut map.root,
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
486 path,
47126
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
487 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
488 |ancestor| {
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
489 if tracked {
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
490 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
491 }
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
492 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
493 },
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
494 )?;
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
495 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
496 !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
497 "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
498 );
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
499 assert!(
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
500 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
501 "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
502 );
47348
a4de570e61fa dirstate-v2: Allow tree nodes without an entry to store a timestamp
Simon Sapin <simon.sapin@octobus.net>
parents: 47347
diff changeset
503 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
504 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
505 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
506 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
507 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
508 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
509 Ok(())
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
510 },
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
511 )?;
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
512 let parents = Some(parents.clone());
47123
d8ac62374943 dirstate-tree: Make `DirstateMap` borrow from a bytes buffer
Simon Sapin <simon.sapin@octobus.net>
parents: 47121
diff changeset
513
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
514 Ok((map, parents))
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
515 }
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
516
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
517 /// 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
518 /// 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
519 /// 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
520 pub(super) fn write_should_append(&self) -> bool {
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
521 let ratio = self.unreachable_bytes as f32 / self.on_disk.len() as f32;
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
522 ratio < ACCEPTABLE_UNREACHABLE_BYTES_RATIO
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
523 }
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
524
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
525 fn get_node<'tree>(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
526 &'tree self,
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
527 path: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
528 ) -> 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
529 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
530 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
531 let mut component =
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
532 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
533 loop {
47336
8d0260d0dbc9 dirstate-v2: Make the dirstate bytes buffer available in more places
Simon Sapin <simon.sapin@octobus.net>
parents: 47335
diff changeset
534 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
535 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
536 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
537 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
538 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
539 return Ok(Some(child));
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
540 }
47099
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
541 } else {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
542 return Ok(None);
47099
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
543 }
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
544 }
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
545 }
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
546
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
547 /// 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
548 ///
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
549 /// `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
550 /// 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
551 /// 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
552 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
553 &'tree mut self,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
554 path: &HgPath,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
555 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
556 ) -> 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
557 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
558 self.on_disk,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
559 &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
560 &mut self.root,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
561 path,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
562 each_ancestor,
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
563 )
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
564 }
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
565
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
566 /// 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
567 ///
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
568 /// 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
569 /// 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
570 ///
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
571 /// `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
572 /// 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
573 /// 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
574 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
575 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
576 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
577 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
578 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
579 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
580 ) -> 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
581 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
582 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
583 let mut component =
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
584 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
585 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
586 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
587 .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
588 .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
589 {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
590 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
591 each_ancestor(child);
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
592 component = next_component;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
593 children = &mut child.children;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
594 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
595 return Ok(Some(child));
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
596 }
47104
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
597 } else {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
598 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
599 }
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
600 }
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
601 }
fdf6cfa0e254 dirstate-tree: Add copy_map_insert and copy_map_remove
Simon Sapin <simon.sapin@octobus.net>
parents: 47103
diff changeset
602
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
603 /// 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
604 /// 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
605 ///
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
606 /// `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
607 /// 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
608 /// 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
609 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
610 &'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
611 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
612 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
613 ) -> 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
614 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
615 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
616 &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
617 &mut self.root,
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
618 path,
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
619 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
620 each_ancestor,
47474
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
621 )
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
622 }
c657beacdf2e dirstate-v2: Drop cached read_dir results after .hgignore changes
Simon Sapin <simon.sapin@octobus.net>
parents: 47409
diff changeset
623
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
624 /// 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
625 /// 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
626 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
627 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
628 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
629 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
630 path: &'path HgPath,
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
631 to_cow: impl Fn(
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
632 WithBasename<&'path HgPath>,
ecfe0819ada5 dirstate-tree: Borrow paths from the "on disk" bytes
Simon Sapin <simon.sapin@octobus.net>
parents: 47125
diff changeset
633 ) -> 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
634 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
635 ) -> 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
636 let mut child_nodes = root;
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
637 let mut inclusive_ancestor_paths =
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
638 WithBasename::inclusive_ancestors_of(path);
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
639 let mut ancestor_path = inclusive_ancestor_paths
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
640 .next()
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
641 .expect("expected at least one inclusive ancestor");
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
642 loop {
48950
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
643 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
644 .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
645 .raw_entry_mut()
11c0411bf4e2 dirstate-tree: optimize HashMap lookups with raw_entry_mut
Simon Sapin <simon.sapin@octobus.net>
parents: 48454
diff changeset
646 .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
647 .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
648 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
649 each_ancestor(child_node);
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
650 ancestor_path = next;
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
651 child_nodes = &mut child_node.children;
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
652 } else {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
653 return Ok(child_node);
47097
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
654 }
e66ea29e2b1a dirstate-tree: Implement DirstateMap::read
Simon Sapin <simon.sapin@octobus.net>
parents: 47095
diff changeset
655 }
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
656 }
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
657
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
658 fn reset_state(
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
659 &mut self,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
660 filename: &HgPath,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
661 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
662 wc_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
663 p1_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
664 p2_info: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
665 has_meaningful_mtime: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
666 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
667 ) -> Result<(), DirstateError> {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
668 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
669 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
670 None => (false, false),
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
671 };
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
672 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
673 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
674 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
675 }
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
676 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
677 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
678 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
679 .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
680 .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
681 .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
682 }
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
683 } else {
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
684 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
685 ancestor.tracked_descendants_count += 1;
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
686 }
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
687 }
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
688 })?;
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
689
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
690 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
691 DirstateV2Data {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
692 wc_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
693 p1_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
694 p2_info,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
695 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
696 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
697 parent_file_data.mtime
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
698 } else {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
699 None
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
700 },
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
701 ..Default::default()
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
702 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
703 } else {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
704 DirstateV2Data {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
705 wc_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
706 p1_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
707 p2_info,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
708 ..Default::default()
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
709 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
710 };
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
711 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
712 if !had_entry {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
713 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
714 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
715 Ok(())
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
716 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
717
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
718 fn set_tracked(
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
719 &mut self,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
720 filename: &HgPath,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
721 old_entry_opt: Option<DirstateEntry>,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
722 ) -> Result<bool, DirstateV2ParseError> {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
723 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
724 let had_entry = old_entry_opt.is_some();
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
725 let tracked_count_increment = if was_tracked { 0 } else { 1 };
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
726 let mut new = false;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
727
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
728 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
729 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
730 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
731 }
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
732
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
733 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
734 })?;
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
735 if let Some(old_entry) = old_entry_opt {
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
736 let mut e = old_entry.clone();
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
737 if e.tracked() {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
738 // XXX
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
739 // 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
740 // 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
741 // 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
742 e.set_possibly_dirty();
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
743 } else {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
744 new = true;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
745 e.set_tracked();
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
746 }
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
747 node.data = NodeData::Entry(e)
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
748 } 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
749 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
750 self.nodes_with_entry_count += 1;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
751 new = true;
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
752 };
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
753 Ok(new)
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
754 }
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
755
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
756 /// 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
757 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
758 /// 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
759 /// 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
760 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
761 /// # 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
762 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
763 /// 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
764 fn set_untracked(
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
765 &mut self,
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
766 filename: &HgPath,
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
767 old_entry: DirstateEntry,
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
768 ) -> Result<(), DirstateV2ParseError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
769 let node = self
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
770 .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
771 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
772 .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
773 .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
774 .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
775 })?
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
776 .expect("node should exist");
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
777 let mut new_entry = old_entry.clone();
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
778 new_entry.set_untracked();
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
779 node.data = NodeData::Entry(new_entry);
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
780 Ok(())
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
781 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
782
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
783 /// 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
784 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
785 /// 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
786 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
787 /// # 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
788 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
789 /// 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
790 fn set_clean(
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
791 &mut self,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
792 filename: &HgPath,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
793 old_entry: DirstateEntry,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
794 mode: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
795 size: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
796 mtime: TruncatedTimestamp,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
797 ) -> Result<(), DirstateError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
798 let node = self
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
799 .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
800 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
801 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
802 }
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
803 })?
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
804 .expect("node should exist");
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
805 let mut new_entry = old_entry.clone();
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
806 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
807 node.data = NodeData::Entry(new_entry);
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
808 Ok(())
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
809 }
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
810
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
811 /// 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
812 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
813 /// # 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
814 ///
7276a6007573 rust-dirstatemap: use `get_node_mut` instead or `get_or_insert_node`
Raphaël Gomès <rgomes@octobus.net>
parents: 49131
diff changeset
815 /// 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
816 fn set_possibly_dirty(
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
817 &mut self,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
818 filename: &HgPath,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
819 ) -> Result<(), DirstateError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
820 let node = self
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
821 .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
822 .expect("node should exist");
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
823 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
824 entry.set_possibly_dirty();
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
825 node.data = NodeData::Entry(*entry);
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
826 Ok(())
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
827 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
828
49127
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
829 /// 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
830 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
831 &mut self,
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
832 path: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
833 ) -> Result<(), DirstateV2ParseError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
834 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
835 Some(node) => node,
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
836 None => return Ok(()),
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
837 };
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
838 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
839 node.data = NodeData::None
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
840 }
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
841 Ok(())
f3e8b0b0a8c2 rust-dirstatemap: add `clear_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49126
diff changeset
842 }
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
843
49128
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
844 /// 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
845 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
846 &mut self,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
847 path: &HgPath,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
848 mtime: TruncatedTimestamp,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
849 ) -> Result<(), DirstateV2ParseError> {
49133
23a5659125c8 rust-dirstatemap: add simpler version of `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49132
diff changeset
850 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
851 Some(node) => node,
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
852 None => return Ok(()),
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
853 };
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
854 match &node.data {
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
855 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
856 NodeData::CachedDirectory { .. } | NodeData::None => {
464747faef14 rust-dirstatemap: add `set_cached_mtime` helper method
Raphaël Gomès <rgomes@octobus.net>
parents: 49127
diff changeset
857 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
858 }
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
859 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
860 Ok(())
47103
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
861 }
214ae40e136b dirstate-tree: Maintain a counter of DirstateEntry’s and copy sources
Simon Sapin <simon.sapin@octobus.net>
parents: 47102
diff changeset
862
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
863 fn iter_nodes<'tree>(
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
864 &'tree self,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
865 ) -> impl Iterator<
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
866 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
867 > + 'tree {
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
868 // Depth first tree traversal.
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
869 //
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
870 // 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
871 // this would look like:
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
872 //
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
873 // ```
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
874 // fn traverse_children(
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
875 // children: &ChildNodes,
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
876 // each: &mut impl FnMut(&Node),
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
877 // ) {
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
878 // for child in children.values() {
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
879 // traverse_children(&child.children, each);
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
880 // each(child);
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
881 // }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
882 // }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
883 // ```
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
884 //
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
885 // 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
886 // call stack. Use an explicit stack instead:
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
887 let mut stack = Vec::new();
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
888 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
889 std::iter::from_fn(move || {
47333
69530e5d4fe5 dirstate-tree: Add `NodeRef` and `ChildNodesRef` enums
Simon Sapin <simon.sapin@octobus.net>
parents: 47332
diff changeset
890 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
891 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
892 Ok(children) => children,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
893 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
894 };
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
895 // Pseudo-recursion
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
896 let new_iter = children.iter();
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
897 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
898 stack.push((child_node, old_iter));
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
899 }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
900 // 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
901 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
902 // "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
903 // explicit stack
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
904 iter = next_iter;
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
905
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
906 Some(Ok(child_node))
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
907 } else {
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
908 // 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
909 None
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
910 }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
911 })
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
912 }
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
913
47681
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
914 fn count_dropped_path(unreachable_bytes: &mut u32, path: &Cow<HgPath>) {
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
915 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
916 *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
917 }
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
918 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
919 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
920
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
921 /// Like `Iterator::filter_map`, but over a fallible iterator of `Result`s.
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
922 ///
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
923 /// The callback is only called for incoming `Ok` values. Errors are passed
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
924 /// through as-is. In order to let it use the `?` operator the callback is
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
925 /// expected to return a `Result` of `Option`, instead of an `Option` of
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
926 /// `Result`.
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
927 fn filter_map_results<'a, I, F, A, B, E>(
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
928 iter: I,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
929 f: F,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
930 ) -> impl Iterator<Item = Result<B, E>> + 'a
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
931 where
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
932 I: Iterator<Item = Result<A, E>> + 'a,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
933 F: Fn(A) -> Result<Option<B>, E> + 'a,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
934 {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
935 iter.filter_map(move |result| match result {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
936 Ok(node) => f(node).transpose(),
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
937 Err(e) => Some(Err(e)),
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
938 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
939 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
940
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
941 impl OwningDirstateMap {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
942 pub fn clear(&mut self) {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
943 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
944 map.root = Default::default();
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
945 map.nodes_with_entry_count = 0;
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
946 map.nodes_with_copy_source_count = 0;
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
947 });
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
948 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
949
49097
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
950 pub fn set_tracked(
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
951 &mut self,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
952 filename: &HgPath,
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
953 ) -> Result<bool, DirstateV2ParseError> {
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
954 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
955 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
956 }
791430b0b2d2 rust-dirstatemap: add `set_tracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49045
diff changeset
957
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
958 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
959 &mut self,
9b2a51b2c36a dirstate: Propagate dirstate-v2 parse errors from set_dirstate_item
Simon Sapin <simon.sapin@octobus.net>
parents: 48046
diff changeset
960 filename: &HgPath,
49108
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
961 ) -> Result<bool, DirstateError> {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
962 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
963 match old_entry_opt {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
964 None => Ok(false),
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
965 Some(old_entry) => {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
966 if !old_entry.tracked() {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
967 // `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
968 // 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
969 // tracked counters while going down.
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
970 return Ok(true);
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
971 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
972 if old_entry.added() {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
973 // 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
974 // 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
975 // 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
976 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
977 return Ok(true);
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
978 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
979 if !old_entry.p2_info() {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
980 self.copy_map_remove(filename)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
981 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
982
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
983 self.with_dmap_mut(|map| {
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
984 map.set_untracked(filename, old_entry)?;
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
985 Ok(true)
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
986 })
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
987 }
119c7e2b4248 rust-dirstatemap: add `set_untracked` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49106
diff changeset
988 }
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
989 }
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
990
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
991 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
992 &mut self,
47107
7dfc598ddcfe dirstate-tree: Add add_file, remove_file, and drop_file
Simon Sapin <simon.sapin@octobus.net>
parents: 47106
diff changeset
993 filename: &HgPath,
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
994 mode: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
995 size: u32,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
996 mtime: TruncatedTimestamp,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
997 ) -> Result<(), DirstateError> {
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
998 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
999 None => {
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1000 return Err(
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1001 DirstateMapError::PathNotFound(filename.into()).into()
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1002 )
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1003 }
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1004 Some(e) => e,
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1005 };
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1006 self.copy_map_remove(filename)?;
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1007 self.with_dmap_mut(|map| {
49104
b5c2aca84618 rust-dirstatemap: add `set_clean` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49101
diff changeset
1008 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
1009 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1010 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1011
49106
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1012 pub fn set_possibly_dirty(
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1013 &mut self,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1014 filename: &HgPath,
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1015 ) -> Result<(), DirstateError> {
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1016 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
1017 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
1018 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1019 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
1020 }
c1a3fdedc492 rust-dirstatemap: add `set_possibly_dirty` method
Raphaël Gomès <rgomes@octobus.net>
parents: 49104
diff changeset
1021
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1022 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
1023 &mut self,
47107
7dfc598ddcfe dirstate-tree: Add add_file, remove_file, and drop_file
Simon Sapin <simon.sapin@octobus.net>
parents: 47106
diff changeset
1024 filename: &HgPath,
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1025 wc_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1026 p1_tracked: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1027 p2_info: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1028 has_meaningful_mtime: bool,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1029 parent_file_data_opt: Option<ParentFileData>,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1030 ) -> Result<(), DirstateError> {
49101
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1031 if !(p1_tracked || p2_info || wc_tracked) {
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1032 self.drop_entry_and_copy_source(filename)?;
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1033 return Ok(());
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1034 }
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1035 self.copy_map_remove(filename)?;
47511
eaae39894312 dirstate: move most of the `remove` logic with dirstatemap `removefile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47478
diff changeset
1036 let old_entry_opt = self.get(filename)?;
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1037 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
1038 map.reset_state(
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1039 filename,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1040 old_entry_opt,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1041 wc_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1042 p1_tracked,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1043 p2_info,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1044 has_meaningful_mtime,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1045 parent_file_data_opt,
dd0430434ce9 rust-dirstatemap: add Rust implementation of `reset_state`
Raphaël Gomès <rgomes@octobus.net>
parents: 49097
diff changeset
1046 )
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1047 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1048 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1049
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1050 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
1051 &mut self,
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1052 filename: &HgPath,
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1053 ) -> Result<(), DirstateError> {
49123
afe60def963d rust-dirstatemap: use `DirstateEntry::tracked` directly
Raphaël Gomès <rgomes@octobus.net>
parents: 49121
diff changeset
1054 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
1055 struct Dropped {
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1056 was_tracked: bool,
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1057 had_entry: bool,
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1058 had_copy_source: bool,
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1059 }
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1060
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1061 /// 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
1062 ///
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1063 /// * `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
1064 /// * `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
1065 /// 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
1066 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
1067 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
1068 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
1069 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
1070 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
1071 ) -> 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
1072 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
1073 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
1074 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
1075 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
1076 {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1077 node
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1078 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1079 return Ok(None);
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1080 };
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1081 let dropped;
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1082 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
1083 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
1084 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
1085 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
1086 &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
1087 rest,
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1088 )? {
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1089 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
1090 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
1091 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
1092 .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
1093 .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
1094 .expect(
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1095 "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
1096 );
47478
ca8121d26732 dirstate-tree: Keep a counter of descendant nodes that have an entry
Simon Sapin <simon.sapin@octobus.net>
parents: 47477
diff changeset
1097 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1098 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
1099 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
1100 .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
1101 .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
1102 .expect(
2593873cda0f rust-dirstate: panic if the DirstateMap counters go below 0
Raphaël Gomès <rgomes@octobus.net>
parents: 49000
diff changeset
1103 "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
1104 );
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1105 }
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1106
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1107 // 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
1108 // child node
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1109 if removed {
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1110 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
1111 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
1112 }
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1113 }
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1114 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1115 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
1116 }
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1117 } else {
49002
fbc02ccc207e rust-dirstatemap: properly decrement counter for tracked descendants
Raphaël Gomès <rgomes@octobus.net>
parents: 49001
diff changeset
1118 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
1119 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
1120 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
1121 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
1122 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
1123 }
49003
ce919b1a1063 rust-dirstatemap: correctly decrement the copies counter
Raphaël Gomès <rgomes@octobus.net>
parents: 49002
diff changeset
1124 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
1125 if let Some(source) = &node.copy_source {
48050
2ac0e6b23222 dirstate: Replace dropfile with drop_item_and_copy_source
Simon Sapin <simon.sapin@octobus.net>
parents: 48048
diff changeset
1126 DirstateMap::count_dropped_path(unreachable_bytes, source);
49003
ce919b1a1063 rust-dirstatemap: correctly decrement the copies counter
Raphaël Gomès <rgomes@octobus.net>
parents: 49002
diff changeset
1127 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
1128 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
1129 }
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1130 dropped = Dropped {
49002
fbc02ccc207e rust-dirstatemap: properly decrement counter for tracked descendants
Raphaël Gomès <rgomes@octobus.net>
parents: 49001
diff changeset
1131 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
1132 had_entry,
49003
ce919b1a1063 rust-dirstatemap: correctly decrement the copies counter
Raphaël Gomès <rgomes@octobus.net>
parents: 49002
diff changeset
1133 had_copy_source,
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1134 };
47193
47ccab19bf9f dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`
Simon Sapin <simon.sapin@octobus.net>
parents: 47192
diff changeset
1135 }
47ccab19bf9f dirstate-tree: Remove newly-empty nodes after removing a `DirstateEntry`
Simon Sapin <simon.sapin@octobus.net>
parents: 47192
diff changeset
1136 // 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
1137 // 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
1138 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
1139 && 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
1140 && 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
1141 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
1142 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
1143 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
1144 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
1145 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
1146 key.full_path(),
d94118365ec5 dirstate-v2: Add heuristic for when to create a new data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47678
diff changeset
1147 )
47192
1249eb9cc332 dirstate-tree: Refactor DirstateMap::drop_file to be recursive
Simon Sapin <simon.sapin@octobus.net>
parents: 47126
diff changeset
1148 }
47352
9d58e54b5966 dirstate-v2: Drop parent directory cache when removing a dirstate node
Simon Sapin <simon.sapin@octobus.net>
parents: 47351
diff changeset
1149 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
1150 }
47107
7dfc598ddcfe dirstate-tree: Add add_file, remove_file, and drop_file
Simon Sapin <simon.sapin@octobus.net>
parents: 47106
diff changeset
1151
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1152 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1153 if let Some((dropped, _removed)) = recur(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1154 map.on_disk,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1155 &mut map.unreachable_bytes,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1156 &mut map.root,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1157 filename,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1158 )? {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1159 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
1160 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
1161 .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
1162 .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
1163 .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
1164 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1165 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
1166 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
1167 .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
1168 .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
1169 .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
1170 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1171 } else {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1172 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
1173 }
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1174 Ok(())
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1175 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1176 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1177
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1178 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
1179 &mut self,
47106
52906934b775 dirstate-tree: Add has_dir and has_tracked_dir
Simon Sapin <simon.sapin@octobus.net>
parents: 47105
diff changeset
1180 directory: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1181 ) -> Result<bool, DirstateError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1182 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1183 if let Some(node) = map.get_node(directory)? {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1184 // 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
1185 // 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
1186 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
1187 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
1188 } else {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1189 Ok(false)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1190 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1191 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1192 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1193
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1194 pub fn has_dir(
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1195 &mut self,
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1196 directory: &HgPath,
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1197 ) -> Result<bool, DirstateError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1198 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1199 if let Some(node) = map.get_node(directory)? {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1200 // 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
1201 // 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
1202 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
1203 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
1204 } else {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1205 Ok(false)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1206 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1207 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1208 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1209
49913
c15b415d1bff rust: use `logging_timer` instead of `micro_timer`
Raphaël Gomès <rgomes@octobus.net>
parents: 49373
diff changeset
1210 #[logging_timer::time("trace")]
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1211 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
1212 &self,
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1213 parents: DirstateParents,
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1214 ) -> 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
1215 let map = self.get_map();
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1216 // 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
1217 // reallocations
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1218 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
1219 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
1220 let node = node?;
48392
434de12918fd dirstate: remove need_delay logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 48260
diff changeset
1221 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
1222 size += packed_entry_size(
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1223 node.full_path(map.on_disk)?,
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1224 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
1225 );
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1226 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1227 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1228
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1229 let mut packed = Vec::with_capacity(size);
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1230 packed.extend(parents.as_bytes());
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1231
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1232 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
1233 let node = node?;
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1234 if let Some(entry) = node.entry()? {
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1235 pack_entry(
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1236 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
1237 &entry,
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1238 node.copy_source(map.on_disk)?,
47102
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1239 &mut packed,
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1240 );
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1241 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1242 }
d6c94ca40863 dirstate-tree: Serialize to disk
Simon Sapin <simon.sapin@octobus.net>
parents: 47101
diff changeset
1243 Ok(packed)
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1244 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1245
47682
78f7f0d490ee dirstate-v2: Move fixed-size tree metadata into the docket file
Simon Sapin <simon.sapin@octobus.net>
parents: 47681
diff changeset
1246 /// 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
1247 /// 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
1248 /// `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
1249 /// (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
1250 #[logging_timer::time("trace")]
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1251 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
1252 &self,
47678
065e61628980 dirstate-v2: Support appending to the same data file
Simon Sapin <simon.sapin@octobus.net>
parents: 47675
diff changeset
1253 can_append: bool,
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
1254 ) -> 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
1255 {
48416
c1b633db67fc rust: Serializing a DirstateMap does not mutate it anymore
Simon Sapin <simon.sapin@octobus.net>
parents: 48392
diff changeset
1256 let map = self.get_map();
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1257 on_disk::write(map, can_append)
47280
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
1258 }
1766130fe9ba dirstate-v2: Change the on-disk format when the requirement is enabled
Simon Sapin <simon.sapin@octobus.net>
parents: 47193
diff changeset
1259
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1260 /// `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
1261 /// 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
1262 /// 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
1263 /// we need to borrow from `Self`.
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1264 pub fn with_status<R>(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1265 &mut self,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1266 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
1267 root_dir: PathBuf,
d5956136d19d dirstate-tree: Give to `status()` mutable access to the `DirstateMap`
Simon Sapin <simon.sapin@octobus.net>
parents: 47110
diff changeset
1268 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
1269 options: StatusOptions,
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1270 callback: impl for<'r> FnOnce(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1271 Result<(DirstateStatus<'r>, Vec<PatternFileWarning>), StatusError>,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1272 ) -> R,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1273 ) -> R {
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 callback(super::status::status(
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1276 map,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1277 matcher,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1278 root_dir,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1279 ignore_files,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1280 options,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1281 ))
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1282 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1283 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1284
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1285 pub fn copy_map_len(&self) -> usize {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1286 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1287 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
1288 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1289
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1290 pub fn copy_map_iter(&self) -> CopyMapIter<'_> {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1291 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1292 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
1293 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
1294 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
1295 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1296 None
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1297 })
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1298 }))
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1299 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1300
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1301 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
1302 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1303 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1304 ) -> Result<bool, DirstateV2ParseError> {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1305 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1306 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
1307 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
1308 } else {
3da19db33cbc dirstate-tree: Add map `get` and `contains_key` methods
Simon Sapin <simon.sapin@octobus.net>
parents: 47098
diff changeset
1309 false
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1310 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1311 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1312
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1313 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
1314 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1315 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1316 ) -> Result<Option<&HgPath>, DirstateV2ParseError> {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1317 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1318 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
1319 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
1320 return Ok(Some(source));
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1321 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1322 }
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1323 Ok(None)
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1324 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1325
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1326 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
1327 &mut self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1328 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1329 ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1330 self.with_dmap_mut(|map| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1331 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
1332 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
1333 Ok(DirstateMap::get_node_mut_inner(
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1334 map.on_disk,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1335 unreachable_bytes,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1336 &mut map.root,
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1337 key,
49131
fcf6f943a142 rust-dirstatemap: add `each_ancestor` argument to `get_node_mut`
Raphaël Gomès <rgomes@octobus.net>
parents: 49130
diff changeset
1338 |_ancestor| {},
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1339 )?
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1340 .and_then(|node| {
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1341 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
1342 *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
1343 .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
1344 .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
1345 DirstateMap::count_dropped_path(unreachable_bytes, source);
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1346 }
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1347 node.copy_source.take().map(Cow::into_owned)
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1348 }))
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1349 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1350 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1351
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1352 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
1353 &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
1354 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
1355 value: &HgPath,
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1356 ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1357 self.with_dmap_mut(|map| {
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
1358 let node = map.get_or_insert_node(&key, |_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
1359 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
1360 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
1361 .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
1362 .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
1363 .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
1364 if had_copy_source {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1365 map.nodes_with_copy_source_count += 1
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1366 }
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
1367 Ok(old)
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1368 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1369 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1370
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1371 pub fn len(&self) -> usize {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1372 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1373 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
1374 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1375
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1376 pub fn contains_key(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1377 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1378 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1379 ) -> Result<bool, DirstateV2ParseError> {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1380 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
1381 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1382
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1383 pub fn get(
47335
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1384 &self,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1385 key: &HgPath,
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1386 ) -> Result<Option<DirstateEntry>, DirstateV2ParseError> {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1387 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1388 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
1389 node.entry()?
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1390 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1391 None
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1392 })
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1393 }
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1394
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1395 pub fn iter(&self) -> StateMapIter<'_> {
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1396 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1397 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
1398 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
1399 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
1400 } else {
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1401 None
ed1583a845d2 dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents: 47334
diff changeset
1402 })
47100
caa3031c9ed5 dirstate-tree: Add tree traversal/iteration
Simon Sapin <simon.sapin@octobus.net>
parents: 47099
diff changeset
1403 }))
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1404 }
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1405
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1406 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
1407 &mut self,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1408 ) -> Result<
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1409 Box<
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1410 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
1411 + Send
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1412 + '_,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1413 >,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1414 DirstateError,
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1415 > {
49000
dd6b67d5c256 rust: fix unsound `OwningDirstateMap`
Raphaël Gomès <rgomes@octobus.net>
parents: 48454
diff changeset
1416 let map = self.get_map();
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1417 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
1418 Ok(Box::new(filter_map_results(
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1419 map.iter_nodes(),
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1420 move |node| {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1421 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
1422 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
1423 } else {
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1424 None
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1425 })
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1426 },
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1427 )))
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1428 }
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1429
49120
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1430 /// 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
1431 /// 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
1432 /// entries.
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1433 pub fn setparents_fixup(
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1434 &mut self,
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1435 ) -> 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
1436 // XXX
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1437 // 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
1438 // 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
1439 //
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1440 // 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
1441 // 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
1442 // 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
1443 let mut copies = vec![];
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1444 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
1445 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
1446 let (path, entry) = res?;
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1447 if entry.p2_info() {
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1448 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
1449 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1450 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1451 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
1452 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
1453 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
1454 let entry =
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1455 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
1456 entry.drop_merge_data();
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1457 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
1458 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
1459 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1460 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1461 Ok(copies)
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1462 })
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1463 }
3df46f3a3d6c rust-dirstatemap: implement part of the `setparents` logic
Raphaël Gomès <rgomes@octobus.net>
parents: 49112
diff changeset
1464
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1465 pub fn debug_iter(
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1466 &self,
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
1467 all: bool,
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1468 ) -> Box<
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1469 dyn Iterator<
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1470 Item = Result<
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1471 (&HgPath, (u8, i32, i32, i32)),
47351
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1472 DirstateV2ParseError,
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1473 >,
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1474 > + Send
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1475 + '_,
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1476 > {
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1477 let map = self.get_map();
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1478 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
1479 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
1480 entry.debug_tuple()
48023
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
1481 } else if !all {
357307feaf61 debugstate: Always call dirstatemap.debug_iter()
Simon Sapin <simon.sapin@octobus.net>
parents: 48022
diff changeset
1482 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
1483 } 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
1484 (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
1485 } else {
47683
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1486 (b' ', 0, -1, -1)
284a20269a97 dirstate-v2: Separate iterators for dirfoldmap and debugdirstate
Simon Sapin <simon.sapin@octobus.net>
parents: 47682
diff changeset
1487 };
48069
3d0a9c6e614d dirstate: Remove the Rust abstraction DirstateMapMethods
Simon Sapin <simon.sapin@octobus.net>
parents: 48068
diff changeset
1488 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
1489 }))
3b9914b28133 dirstate-v2: Add --dirs to debugdirstate command
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
1490 }
47095
473abf4728bf dirstate-tree: Empty shell for a second Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
diff changeset
1491 }
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1492 #[cfg(test)]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1493 mod tests {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1494 use super::*;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1495
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1496 /// 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
1497 /// Panics if the path does not exist.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1498 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
1499 let path = dbg!(HgPath::new(path));
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1500 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
1501 node.unwrap().unwrap().tracked_descendants_count()
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1502 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1503
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1504 /// Shortcut to return descendants with an entry.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1505 /// Panics if the path does not exist.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1506 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
1507 let path = dbg!(HgPath::new(path));
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1508 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
1509 node.unwrap().unwrap().descendants_with_entry_count()
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1510 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1511
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1512 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
1513 let path = dbg!(HgPath::new(path));
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1514 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
1515 assert!(node.unwrap().is_none());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1516 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1517
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1518 /// Shortcut for path creation in tests
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1519 fn p(b: &[u8]) -> &HgPath {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1520 HgPath::new(b)
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1521 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1522
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1523 /// 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
1524 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1525 fn test_tracked_descendants_simple() -> Result<(), DirstateError> {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1526 let mut map = OwningDirstateMap::new_empty(vec![]);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1527 assert_eq!(map.len(), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1528
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1529 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
1530
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1531 assert_eq!(map.len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1532 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
1533 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
1534 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
1535
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1536 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
1537 assert_eq!(map.len(), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1538 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
1539
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1540 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1541 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1542
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1543 /// 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
1544 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1545 fn test_tracked_descendants_multiple() -> Result<(), DirstateError> {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1546 let mut map = OwningDirstateMap::new_empty(vec![]);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1547
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1548 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
1549 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
1550 // 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
1551 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
1552 map.set_tracked(p(b"root_file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1553 map.set_tracked(p(b"some/file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1554 map.set_tracked(p(b"some/file2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1555 map.set_tracked(p(b"some/file3"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1556
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1557 assert_eq!(map.len(), 7);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1558 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
1559 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
1560 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
1561 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
1562 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
1563
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1564 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
1565 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1566 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
1567 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
1568 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
1569 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
1570
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1571 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
1572 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1573 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
1574 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
1575 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
1576 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
1577
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1578 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
1579 assert_eq!(map.len(), 4);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1580 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
1581 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
1582
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1583 map.set_untracked(p(b"root_file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1584 assert_eq!(map.len(), 3);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1585 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
1586 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
1587
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1588 map.set_untracked(p(b"some/file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1589 assert_eq!(map.len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1590 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
1591 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
1592
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1593 map.set_untracked(p(b"some/file2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1594 assert_eq!(map.len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1595 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
1596 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
1597
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1598 map.set_untracked(p(b"some/file3"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1599 assert_eq!(map.len(), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1600 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
1601
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1602 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1603 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1604
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1605 /// 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
1606 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1607 fn test_tracked_descendants_different() -> Result<(), DirstateError> {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1608 let mut map = OwningDirstateMap::new_empty(vec![]);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1609
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1610 // A file that was just added
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1611 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
1612 // This has no information, the dirstate should ignore it
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1613 map.reset_state(p(b"some/file"), false, false, false, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1614 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
1615
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1616 // A file that was removed
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1617 map.reset_state(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1618 p(b"some/nested/file"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1619 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1620 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1621 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1622 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1623 None,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1624 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1625 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
1626 // Only present in p2
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1627 map.reset_state(p(b"some/file3"), false, false, true, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1628 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
1629 // A file that was merged
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1630 map.reset_state(p(b"root_file"), true, true, true, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1631 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
1632 // 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
1633 // XXX is that actually possible?
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1634 map.reset_state(p(b"some/file2"), true, false, true, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1635 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
1636 // A clean file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1637 // 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
1638 map.reset_state(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1639 p(b"some/other/nested/path"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1640 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1641 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1642 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1643 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1644 None,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1645 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1646 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
1647
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1648 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1649 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
1650 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
1651 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
1652 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
1653 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
1654 assert_eq!(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1655 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
1656 0
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1657 );
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!(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
1660
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1661 // might as well check this
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1662 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
1663 assert_eq!(map.len(), 6);
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 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
1666 // 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
1667 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1668 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
1669 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
1670 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
1671 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
1672 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
1673 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
1674
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1675 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
1676 // 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
1677 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1678 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
1679 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
1680 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
1681 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
1682 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
1683
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1684 map.set_untracked(p(b"root_file"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1685 // Untracked but not deleted
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1686 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1687 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
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/file2"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1690 assert_eq!(map.len(), 5);
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"), 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1692 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
1693
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1694 map.set_untracked(p(b"some/file3"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1695 assert_eq!(map.len(), 5);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1696 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
1697 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
1698
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1699 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1700 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1701
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1702 /// Check that copies counter is correctly updated
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1703 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1704 fn test_copy_source() -> Result<(), DirstateError> {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1705 let mut map = OwningDirstateMap::new_empty(vec![]);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1706
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1707 // Clean file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1708 map.reset_state(p(b"files/clean"), true, true, false, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1709 // Merged file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1710 map.reset_state(p(b"files/from_p2"), true, true, true, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1711 // Removed file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1712 map.reset_state(p(b"removed"), false, true, false, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1713 // Added file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1714 map.reset_state(p(b"files/added"), true, false, false, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1715 // Add copy
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1716 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
1717 assert_eq!(map.copy_map_len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1718
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1719 // Copy override
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1720 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
1721 assert_eq!(map.copy_map_len(), 1);
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 // Multiple copies
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1724 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
1725 assert_eq!(map.copy_map_len(), 2);
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 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
1728 assert_eq!(map.copy_map_len(), 3);
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 // Added, so the entry is completely removed
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1731 map.set_untracked(p(b"files/added"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1732 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
1733 assert_eq!(map.copy_map_len(), 2);
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 // 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
1736 map.set_untracked(p(b"removed"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1737 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
1738 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1739
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1740 // 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
1741 map.set_untracked(p(b"files/clean"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1742 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
1743 assert_eq!(map.copy_map_len(), 1);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1744
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1745 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
1746 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1747
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1748 // 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
1749 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
1750 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
1751 assert_eq!(map.copy_map_len(), 2);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1752
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1753 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1754 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1755
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1756 /// 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
1757 /// 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
1758 /// tested.
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1759 #[test]
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1760 fn test_on_disk() -> Result<(), DirstateError> {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1761 // First let's create some data to put "on disk"
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1762 let mut map = OwningDirstateMap::new_empty(vec![]);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1763
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1764 // A file that was just added
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1765 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
1766 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
1767
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1768 // A file that was removed
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1769 map.reset_state(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1770 p(b"some/nested/removed"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1771 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1772 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1773 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1774 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1775 None,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1776 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1777 // Only present in p2
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1778 map.reset_state(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1779 p(b"other/p2_info_only"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1780 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1781 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1782 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1783 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1784 None,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1785 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1786 map.copy_map_insert(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1787 p(b"other/p2_info_only"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1788 p(b"other/p2_info_copy_source"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1789 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1790 // A file that was merged
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1791 map.reset_state(p(b"merged"), true, true, true, false, None)?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1792 // 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
1793 // XXX is that actually possible?
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1794 map.reset_state(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1795 p(b"other/added_with_p2"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1796 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1797 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1798 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1799 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1800 None,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1801 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1802 // 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
1803 // A clean file
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1804 map.reset_state(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1805 p(b"some/other/nested/clean"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1806 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1807 true,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1808 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1809 false,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1810 None,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1811 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1812
49147
10b9f11daf15 branching: merge stable into default
Raphaël Gomès <rgomes@octobus.net>
parents: 49143 49145
diff changeset
1813 let (packed, metadata, _should_append, _old_data_size) =
10b9f11daf15 branching: merge stable into default
Raphaël Gomès <rgomes@octobus.net>
parents: 49143 49145
diff changeset
1814 map.pack_v2(false)?;
49126
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1815 let packed_len = packed.len();
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1816 assert!(packed_len > 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1817
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1818 // Recreate "from disk"
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1819 let mut map = OwningDirstateMap::new_v2(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1820 packed,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1821 packed_len,
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1822 metadata.as_bytes(),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1823 )?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1824
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1825 // Check that everything is accounted for
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1826 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
1827 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
1828 assert!(map.contains_key(p(b"merged"))?);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1829 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
1830 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
1831 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
1832 assert_eq!(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1833 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
1834 Some(p(b"added_copy_source"))
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1835 );
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1836 assert_eq!(
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1837 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
1838 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
1839 );
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1840 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
1841 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
1842 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
1843 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
1844 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
1845 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
1846 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
1847 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
1848 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
1849 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
1850 assert_eq!(map.len(), 6);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1851 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
1852 assert_eq!(map.copy_map_len(), 2);
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 // 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
1855 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
1856 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
1857
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1858 match map.get_map().root {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1859 ChildNodes::InMemory(_) => {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1860 panic!("root should not have been mutated")
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1861 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1862 _ => (),
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 // 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
1865 // the append strategy
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1866 assert!(map.get_map().write_should_append());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1867
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1868 // 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
1869 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
1870 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
1871 assert!(unreachable_bytes > 0);
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1872
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1873 match map.get_map().root {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1874 ChildNodes::OnDisk(_) => panic!("root should have been mutated"),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1875 _ => (),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1876 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1877
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1878 // 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
1879 // 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
1880 map.set_untracked(p(b"merged"))?;
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1881 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
1882
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1883 match map.get_map().get_node(p(b"other/added_with_p2"))?.unwrap() {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1884 NodeRef::InMemory(_, _) => {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1885 panic!("'other/added_with_p2' should not have been mutated")
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1886 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1887 _ => (),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1888 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1889 // 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
1890 // than `<root>some/nested/add`
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1891 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
1892 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
1893
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1894 match map.get_map().get_node(p(b"other/added_with_p2"))?.unwrap() {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1895 NodeRef::OnDisk(_) => {
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1896 panic!("'other/added_with_p2' should have been mutated")
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1897 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1898 _ => (),
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1899 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1900
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1901 // 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
1902 assert!(!map.get_map().write_should_append());
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1903
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1904 Ok(())
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1905 }
e7b74bb602a4 rust-dirstatemap: add unit tests
Raphaël Gomès <rgomes@octobus.net>
parents: 49125
diff changeset
1906 }