Mercurial > hg
annotate rust/hg-core/src/copy_tracing.rs @ 50660:bf16ef96defe stable
rust-dirstate: fall back to v1 if reading v2 failed
This will help us not fail when a v1 dirstate is present on disk while a v2
was expected (which could happen with a racy/interrupted upgrade).
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Mon, 05 Jun 2023 16:43:27 +0200 |
parents | 83437ad8fe3d |
children |
rev | line source |
---|---|
46658
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
1 #[cfg(test)] |
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
2 #[macro_use] |
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
3 mod tests_support; |
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
4 |
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
5 #[cfg(test)] |
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
6 mod tests; |
fa21633af201
copies-rust: add a macro-based unit-testing framework
Simon Sapin <simon.sapin@octobus.net>
parents:
46657
diff
changeset
|
7 |
45973
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
8 use crate::utils::hg_path::HgPath; |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
9 use crate::utils::hg_path::HgPathBuf; |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
10 use crate::Revision; |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
11 use crate::NULL_REVISION; |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
13 use bytes_cast::{unaligned, BytesCast}; |
46153
0a721fc457bf
copies-rust: use the `entry` API for copy information too
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46152
diff
changeset
|
14 use im_rc::ordmap::Entry; |
45963
0d99778af68a
copies-rust: use immutable "OrdMap" to store copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45944
diff
changeset
|
15 use im_rc::ordmap::OrdMap; |
46585
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46584
diff
changeset
|
16 use im_rc::OrdSet; |
45963
0d99778af68a
copies-rust: use immutable "OrdMap" to store copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45944
diff
changeset
|
17 |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
18 use std::cmp::Ordering; |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 use std::collections::HashMap; |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
21 pub type PathCopies = HashMap<HgPathBuf, HgPathBuf>; |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
23 type PathToken = usize; |
46129
818502d2f5e3
copies-rust: pre-introduce a PathToken type and use it where applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46128
diff
changeset
|
24 |
46582
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
25 #[derive(Clone, Debug)] |
46565
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46564
diff
changeset
|
26 struct CopySource { |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
27 /// revision at which the copy information was added |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
28 rev: Revision, |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 /// the copy source, (Set to None in case of deletion of the associated |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
30 /// key) |
46129
818502d2f5e3
copies-rust: pre-introduce a PathToken type and use it where applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46128
diff
changeset
|
31 path: Option<PathToken>, |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
32 /// a set of previous `CopySource.rev` value directly or indirectly |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
33 /// overwritten by this one. |
46585
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46584
diff
changeset
|
34 overwritten: OrdSet<Revision>, |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
35 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
36 |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
37 impl CopySource { |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
38 /// create a new CopySource |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
39 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
40 /// Use this when no previous copy source existed. |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
41 fn new(rev: Revision, path: Option<PathToken>) -> Self { |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
42 Self { |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
43 rev, |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
44 path, |
46585
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46584
diff
changeset
|
45 overwritten: OrdSet::new(), |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
46 } |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
47 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
48 |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
49 /// create a new CopySource from merging two others |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
50 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
51 /// Use this when merging two InternalPathCopies requires active merging of |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
52 /// some entries. |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
53 fn new_from_merge(rev: Revision, winner: &Self, loser: &Self) -> Self { |
46585
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46584
diff
changeset
|
54 let mut overwritten = OrdSet::new(); |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
55 overwritten.extend(winner.overwritten.iter().copied()); |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
56 overwritten.extend(loser.overwritten.iter().copied()); |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
57 overwritten.insert(winner.rev); |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
58 overwritten.insert(loser.rev); |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
59 Self { |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
60 rev, |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
61 path: winner.path, |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49916
diff
changeset
|
62 overwritten, |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
63 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
64 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
65 |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
66 /// Update the value of a pre-existing CopySource |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
67 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
68 /// Use this when recording copy information from parent → child edges |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
69 fn overwrite(&mut self, rev: Revision, path: Option<PathToken>) { |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
70 self.overwritten.insert(self.rev); |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
71 self.rev = rev; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
72 self.path = path; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
73 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
74 |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
75 /// Mark pre-existing copy information as "dropped" by a file deletion |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
76 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
77 /// Use this when recording copy information from parent → child edges |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
78 fn mark_delete(&mut self, rev: Revision) { |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
79 self.overwritten.insert(self.rev); |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
80 self.rev = rev; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
81 self.path = None; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
82 } |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
83 |
46581
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
84 /// Mark pre-existing copy information as "dropped" by a file deletion |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
85 /// |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
86 /// Use this when recording copy information from parent → child edges |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
87 fn mark_delete_with_pair(&mut self, rev: Revision, other: &Self) { |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
88 self.overwritten.insert(self.rev); |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
89 if other.rev != rev { |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
90 self.overwritten.insert(other.rev); |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
91 } |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
92 self.overwritten.extend(other.overwritten.iter().copied()); |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
93 self.rev = rev; |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
94 self.path = None; |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
95 } |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
96 |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
97 fn is_overwritten_by(&self, other: &Self) -> bool { |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
98 other.overwritten.contains(&self.rev) |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
99 } |
46567
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
100 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46566
diff
changeset
|
101 |
46582
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
102 // For the same "dest", content generated for a given revision will always be |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
103 // the same. |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
104 impl PartialEq for CopySource { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
105 fn eq(&self, other: &Self) -> bool { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
106 #[cfg(debug_assertions)] |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
107 { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
108 if self.rev == other.rev { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
109 debug_assert!(self.path == other.path); |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
110 debug_assert!(self.overwritten == other.overwritten); |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
111 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
112 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
113 self.rev == other.rev |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
114 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
115 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46581
diff
changeset
|
116 |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
117 /// maps CopyDestination to Copy Source (+ a "timestamp" for the operation) |
46565
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46564
diff
changeset
|
118 type InternalPathCopies = OrdMap<PathToken, CopySource>; |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
119 |
45973
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
120 /// Represent active changes that affect the copy tracing. |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
121 enum Action<'a> { |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
122 /// The parent ? children edge is removing a file |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
123 /// |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
124 /// (actually, this could be the edge from the other parent, but it does |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
125 /// not matters) |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
126 Removed(&'a HgPath), |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
127 /// The parent ? children edge introduce copy information between (dest, |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
128 /// source) |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
129 CopiedFromP1(&'a HgPath, &'a HgPath), |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
130 CopiedFromP2(&'a HgPath, &'a HgPath), |
45973
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
131 } |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
132 |
45975
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
133 /// This express the possible "special" case we can get in a merge |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
134 /// |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
135 /// See mercurial/metadata.py for details on these values. |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
136 #[derive(PartialEq)] |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
137 enum MergeCase { |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
138 /// Merged: file had history on both side that needed to be merged |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
139 Merged, |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
140 /// Salvaged: file was candidate for deletion, but survived the merge |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
141 Salvaged, |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
142 /// Normal: Not one of the two cases above |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
143 Normal, |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
144 } |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
145 |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
146 const COPY_MASK: u8 = 3; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
147 const P1_COPY: u8 = 2; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
148 const P2_COPY: u8 = 3; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
149 const ACTION_MASK: u8 = 28; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
150 const REMOVED: u8 = 12; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
151 const MERGED: u8 = 8; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
152 const SALVAGED: u8 = 16; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
153 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
154 #[derive(BytesCast)] |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
155 #[repr(C)] |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
156 struct ChangedFilesIndexEntry { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
157 flags: u8, |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
158 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
159 /// Only the end position is stored. The start is at the end of the |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
160 /// previous entry. |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
161 destination_path_end_position: unaligned::U32Be, |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
162 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
163 source_index_entry_position: unaligned::U32Be, |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
164 } |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
165 |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
166 fn _static_assert_size_of() { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
167 let _ = std::mem::transmute::<ChangedFilesIndexEntry, [u8; 9]>; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
168 } |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
169 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
170 /// Represents the files affected by a changeset. |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
171 /// |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
172 /// This holds a subset of `mercurial.metadata.ChangingFiles` as we do not need |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
173 /// all the data categories tracked by it. |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
174 pub struct ChangedFiles<'a> { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
175 index: &'a [ChangedFilesIndexEntry], |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
176 paths: &'a [u8], |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
177 } |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
178 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
179 impl<'a> ChangedFiles<'a> { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
180 pub fn new(data: &'a [u8]) -> Self { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
181 let (header, rest) = unaligned::U32Be::from_bytes(data).unwrap(); |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
182 let nb_index_entries = header.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
183 let (index, paths) = |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
184 ChangedFilesIndexEntry::slice_from_bytes(rest, nb_index_entries) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
185 .unwrap(); |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
186 Self { index, paths } |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
187 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
188 |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
189 pub fn new_empty() -> Self { |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
190 ChangedFiles { |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
191 index: &[], |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
192 paths: &[], |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
193 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
194 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
195 |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
196 /// Internal function to return the filename of the entry at a given index |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
197 fn path(&self, idx: usize) -> &HgPath { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
198 let start = if idx == 0 { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
199 0 |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
200 } else { |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
201 self.index[idx - 1].destination_path_end_position.get() as usize |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
202 }; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
203 let end = self.index[idx].destination_path_end_position.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
204 HgPath::new(&self.paths[start..end]) |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
205 } |
45973
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
206 |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
207 /// Return an iterator over all the `Action` in this instance. |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
208 fn iter_actions(&self) -> impl Iterator<Item = Action> { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
209 self.index.iter().enumerate().flat_map(move |(idx, entry)| { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
210 let path = self.path(idx); |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
211 if (entry.flags & ACTION_MASK) == REMOVED { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
212 Some(Action::Removed(path)) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
213 } else if (entry.flags & COPY_MASK) == P1_COPY { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
214 let source_idx = |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
215 entry.source_index_entry_position.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
216 Some(Action::CopiedFromP1(path, self.path(source_idx))) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
217 } else if (entry.flags & COPY_MASK) == P2_COPY { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
218 let source_idx = |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
219 entry.source_index_entry_position.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
220 Some(Action::CopiedFromP2(path, self.path(source_idx))) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
221 } else { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
222 None |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
223 } |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
224 }) |
45973
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45972
diff
changeset
|
225 } |
45975
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
226 |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
227 /// return the MergeCase value associated with a filename |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
228 fn get_merge_case(&self, path: &HgPath) -> MergeCase { |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
229 if self.index.is_empty() { |
45975
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
230 return MergeCase::Normal; |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
231 } |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
232 let mut low_part = 0; |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
233 let mut high_part = self.index.len(); |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
234 |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
235 while low_part < high_part { |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
236 let cursor = (low_part + high_part - 1) / 2; |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
237 match path.cmp(self.path(cursor)) { |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
238 Ordering::Less => low_part = cursor + 1, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
239 Ordering::Greater => high_part = cursor, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
240 Ordering::Equal => { |
46657
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46619
diff
changeset
|
241 return match self.index[cursor].flags & ACTION_MASK { |
46057
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
242 MERGED => MergeCase::Merged, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
243 SALVAGED => MergeCase::Salvaged, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
244 _ => MergeCase::Normal, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
245 }; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
246 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
247 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
248 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45975
diff
changeset
|
249 MergeCase::Normal |
45975
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45974
diff
changeset
|
250 } |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
251 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
252 |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
253 /// A small "tokenizer" responsible of turning full HgPath into lighter |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
254 /// PathToken |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
255 /// |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
256 /// Dealing with small object, like integer is much faster, so HgPath input are |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
257 /// turned into integer "PathToken" and converted back in the end. |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
258 #[derive(Clone, Debug, Default)] |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
259 struct TwoWayPathMap { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
260 token: HashMap<HgPathBuf, PathToken>, |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
261 path: Vec<HgPathBuf>, |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
262 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
263 |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
264 impl TwoWayPathMap { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
265 fn tokenize(&mut self, path: &HgPath) -> PathToken { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
266 match self.token.get(path) { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
267 Some(a) => *a, |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
268 None => { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
269 let a = self.token.len(); |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
270 let buf = path.to_owned(); |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
271 self.path.push(buf.clone()); |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
272 self.token.insert(buf, a); |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
273 a |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
274 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
275 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
276 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
277 |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
278 fn untokenize(&self, token: PathToken) -> &HgPathBuf { |
46619
f2fc34e88238
copies-rust: remove an unnecessary format!() inside assert!()
Martin von Zweigbergk <martinvonz@google.com>
parents:
46612
diff
changeset
|
279 assert!(token < self.path.len(), "Unknown token: {}", token); |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
280 &self.path[token] |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
281 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
282 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
283 |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
284 /// Same as mercurial.copies._combine_changeset_copies, but in Rust. |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
285 pub struct CombineChangesetCopies { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
286 all_copies: HashMap<Revision, InternalPathCopies>, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
287 path_map: TwoWayPathMap, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
288 children_count: HashMap<Revision, usize>, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
289 } |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
290 |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
291 impl CombineChangesetCopies { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
292 pub fn new(children_count: HashMap<Revision, usize>) -> Self { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
293 Self { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
294 all_copies: HashMap::new(), |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
295 path_map: TwoWayPathMap::default(), |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
296 children_count, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
297 } |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
298 } |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
299 |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
300 /// Combined the given `changes` data specific to `rev` with the data |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
301 /// previously given for its parents (and transitively, its ancestors). |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
302 pub fn add_revision( |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
303 &mut self, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
304 rev: Revision, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
305 p1: Revision, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
306 p2: Revision, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
307 changes: ChangedFiles<'_>, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
308 ) { |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
309 self.add_revision_inner(rev, p1, p2, changes.iter_actions(), |path| { |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
310 changes.get_merge_case(path) |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
311 }) |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
312 } |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
313 |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
314 /// Separated out from `add_revsion` so that unit tests can call this |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
315 /// without synthetizing a `ChangedFiles` in binary format. |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
316 fn add_revision_inner<'a>( |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
317 &mut self, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
318 rev: Revision, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
319 p1: Revision, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
320 p2: Revision, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
321 copy_actions: impl Iterator<Item = Action<'a>>, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
322 get_merge_case: impl Fn(&HgPath) -> MergeCase + Copy, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
323 ) { |
46575
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
324 // Retrieve data computed in a previous iteration |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
325 let p1_copies = match p1 { |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
326 NULL_REVISION => None, |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
327 _ => get_and_clean_parent_copies( |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
328 &mut self.all_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
329 &mut self.children_count, |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
330 p1, |
46575
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
331 ), // will be None if the vertex is not to be traversed |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
332 }; |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
333 let p2_copies = match p2 { |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
334 NULL_REVISION => None, |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
335 _ => get_and_clean_parent_copies( |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
336 &mut self.all_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
337 &mut self.children_count, |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
338 p2, |
46575
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
339 ), // will be None if the vertex is not to be traversed |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46569
diff
changeset
|
340 }; |
46576
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
341 // combine it with data for that revision |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
342 let (p1_copies, p2_copies) = chain_changes( |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
343 &mut self.path_map, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
344 p1_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
345 p2_copies, |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
346 copy_actions, |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
347 rev, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
348 ); |
46576
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
349 let copies = match (p1_copies, p2_copies) { |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
350 (None, None) => None, |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
351 (c, None) => c, |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
352 (None, c) => c, |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
353 (Some(p1_copies), Some(p2_copies)) => Some(merge_copies_dict( |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
354 &self.path_map, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
355 rev, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
356 p2_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
357 p1_copies, |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
358 get_merge_case, |
46576
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
359 )), |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
360 }; |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46575
diff
changeset
|
361 if let Some(c) = copies { |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
362 self.all_copies.insert(rev, c); |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
363 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
364 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
365 |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
366 /// Drop intermediate data (such as which revision a copy was from) and |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
367 /// return the final mapping. |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
368 pub fn finish(mut self, target_rev: Revision) -> PathCopies { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
369 let tt_result = self |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
370 .all_copies |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
371 .remove(&target_rev) |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
372 .expect("target revision was not processed"); |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
373 let mut result = PathCopies::default(); |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
374 for (dest, tt_source) in tt_result { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
375 if let Some(path) = tt_source.path { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
376 let path_dest = self.path_map.untokenize(dest).to_owned(); |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
377 let path_path = self.path_map.untokenize(path).to_owned(); |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
378 result.insert(path_dest, path_path); |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
379 } |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
380 } |
46587
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46586
diff
changeset
|
381 result |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
382 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
383 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
384 |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
385 /// fetch previous computed information |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
386 /// |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
387 /// If no other children are expected to need this information, we drop it from |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
388 /// the cache. |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
389 /// |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
390 /// If parent is not part of the set we are expected to walk, return None. |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
391 fn get_and_clean_parent_copies( |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
392 all_copies: &mut HashMap<Revision, InternalPathCopies>, |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
393 children_count: &mut HashMap<Revision, usize>, |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
394 parent_rev: Revision, |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
395 ) -> Option<InternalPathCopies> { |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
396 let count = children_count.get_mut(&parent_rev)?; |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
397 *count -= 1; |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
398 if *count == 0 { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
399 match all_copies.remove(&parent_rev) { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
400 Some(c) => Some(c), |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
401 None => Some(InternalPathCopies::default()), |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
402 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
403 } else { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
404 match all_copies.get(&parent_rev) { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
405 Some(c) => Some(c.clone()), |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
406 None => Some(InternalPathCopies::default()), |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
407 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
408 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
409 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
410 |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
411 /// Combine ChangedFiles with some existing PathCopies information and return |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
412 /// the result |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
413 fn chain_changes<'a>( |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
414 path_map: &mut TwoWayPathMap, |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
415 base_p1_copies: Option<InternalPathCopies>, |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
416 base_p2_copies: Option<InternalPathCopies>, |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
417 copy_actions: impl Iterator<Item = Action<'a>>, |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
418 current_rev: Revision, |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
419 ) -> (Option<InternalPathCopies>, Option<InternalPathCopies>) { |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
420 // Fast path the "nothing to do" case. |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
421 if let (None, None) = (&base_p1_copies, &base_p2_copies) { |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
422 return (None, None); |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
423 } |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
424 |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
425 let mut p1_copies = base_p1_copies.clone(); |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
426 let mut p2_copies = base_p2_copies.clone(); |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
427 for action in copy_actions { |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
428 match action { |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
429 Action::CopiedFromP1(path_dest, path_source) => { |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
430 match &mut p1_copies { |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
431 None => (), // This is not a vertex we should proceed. |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
432 Some(copies) => add_one_copy( |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
433 current_rev, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
434 path_map, |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
435 copies, |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
436 base_p1_copies.as_ref().unwrap(), |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
437 path_dest, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
438 path_source, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
439 ), |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
440 } |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
441 } |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
442 Action::CopiedFromP2(path_dest, path_source) => { |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
443 match &mut p2_copies { |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
444 None => (), // This is not a vertex we should proceed. |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
445 Some(copies) => add_one_copy( |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
446 current_rev, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
447 path_map, |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
448 copies, |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
449 base_p2_copies.as_ref().unwrap(), |
46578
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
450 path_dest, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
451 path_source, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46577
diff
changeset
|
452 ), |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
453 } |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
454 } |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
455 Action::Removed(deleted_path) => { |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
456 // We must drop copy information for removed file. |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
457 // |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
458 // We need to explicitly record them as dropped to |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
459 // propagate this information when merging two |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
460 // InternalPathCopies object. |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
461 let deleted = path_map.tokenize(deleted_path); |
46580
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
462 |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
463 let p1_entry = match &mut p1_copies { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
464 None => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
465 Some(copies) => match copies.entry(deleted) { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
466 Entry::Occupied(e) => Some(e), |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
467 Entry::Vacant(_) => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
468 }, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
469 }; |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
470 let p2_entry = match &mut p2_copies { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
471 None => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
472 Some(copies) => match copies.entry(deleted) { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
473 Entry::Occupied(e) => Some(e), |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
474 Entry::Vacant(_) => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
475 }, |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
476 }; |
46580
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
477 |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
478 match (p1_entry, p2_entry) { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
479 (None, None) => (), |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
480 (Some(mut e), None) => { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
481 e.get_mut().mark_delete(current_rev) |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
482 } |
46580
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
483 (None, Some(mut e)) => { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
484 e.get_mut().mark_delete(current_rev) |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
485 } |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
486 (Some(mut e1), Some(mut e2)) => { |
46581
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
487 let cs1 = e1.get_mut(); |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
488 let cs2 = e2.get(); |
46584
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46583
diff
changeset
|
489 if cs1 == cs2 { |
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46583
diff
changeset
|
490 cs1.mark_delete(current_rev); |
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46583
diff
changeset
|
491 } else { |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49916
diff
changeset
|
492 cs1.mark_delete_with_pair(current_rev, cs2); |
46584
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46583
diff
changeset
|
493 } |
46581
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46580
diff
changeset
|
494 e2.insert(cs1.clone()); |
46580
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
495 } |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46579
diff
changeset
|
496 } |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
497 } |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
498 } |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
499 } |
46579
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46578
diff
changeset
|
500 (p1_copies, p2_copies) |
46059
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
501 } |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46058
diff
changeset
|
502 |
46577
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
503 // insert one new copy information in an InternalPathCopies |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
504 // |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
505 // This deal with chaining and overwrite. |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
506 fn add_one_copy( |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
507 current_rev: Revision, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
508 path_map: &mut TwoWayPathMap, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
509 copies: &mut InternalPathCopies, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
510 base_copies: &InternalPathCopies, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
511 path_dest: &HgPath, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
512 path_source: &HgPath, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
513 ) { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
514 let dest = path_map.tokenize(path_dest); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
515 let source = path_map.tokenize(path_source); |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49916
diff
changeset
|
516 let entry = if let Some(v) = base_copies.get(&source) { |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49916
diff
changeset
|
517 match &v.path { |
46577
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
518 Some(path) => Some((*(path)).to_owned()), |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
519 None => Some(source.to_owned()), |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
520 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
521 } else { |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49916
diff
changeset
|
522 Some(source.to_owned()) |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49916
diff
changeset
|
523 }; |
46577
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
524 // Each new entry is introduced by the children, we |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
525 // record this information as we will need it to take |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
526 // the right decision when merging conflicting copy |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
527 // information. See merge_copies_dict for details. |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
528 match copies.entry(dest) { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
529 Entry::Vacant(slot) => { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
530 let ttpc = CopySource::new(current_rev, entry); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
531 slot.insert(ttpc); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
532 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
533 Entry::Occupied(mut slot) => { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
534 let ttpc = slot.get_mut(); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
535 ttpc.overwrite(current_rev, entry); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
536 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
537 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
538 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46576
diff
changeset
|
539 |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
540 /// merge two copies-mapping together, minor and major |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
541 /// |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
542 /// In case of conflict, value from "major" will be picked, unless in some |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
543 /// cases. See inline documentation for details. |
46569
34827c95092c
copies-rust: remove the ancestor Oracle logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46568
diff
changeset
|
544 fn merge_copies_dict( |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
545 path_map: &TwoWayPathMap, |
46156
7d99614b7b77
copies-rust: make the comparison aware of the revision being current merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46155
diff
changeset
|
546 current_merge: Revision, |
46586
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
547 minor: InternalPathCopies, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
548 major: InternalPathCopies, |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
549 get_merge_case: impl Fn(&HgPath) -> MergeCase + Copy, |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
550 ) -> InternalPathCopies { |
46586
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
551 use crate::utils::{ordmap_union_with_merge, MergeResult}; |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
552 |
46611
1fce35fcb4db
copies-rust: pass `PathToken` around by value
Simon Sapin <simon.sapin@octobus.net>
parents:
46587
diff
changeset
|
553 ordmap_union_with_merge(minor, major, |&dest, src_minor, src_major| { |
46586
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
554 let (pick, overwrite) = compare_value( |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
555 current_merge, |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
556 || get_merge_case(path_map.untokenize(dest)), |
46586
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
557 src_minor, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
558 src_major, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
559 ); |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
560 if overwrite { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
561 let (winner, loser) = match pick { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
562 MergePick::Major | MergePick::Any => (src_major, src_minor), |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
563 MergePick::Minor => (src_minor, src_major), |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
564 }; |
49934
83437ad8fe3d
rust-clippy: remove redundant suffix from enum
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
565 MergeResult::New(CopySource::new_from_merge( |
46569
34827c95092c
copies-rust: remove the ancestor Oracle logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46568
diff
changeset
|
566 current_merge, |
46586
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
567 winner, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
568 loser, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
569 )) |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
570 } else { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
571 match pick { |
49934
83437ad8fe3d
rust-clippy: remove redundant suffix from enum
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
572 MergePick::Any | MergePick::Major => MergeResult::Right, |
83437ad8fe3d
rust-clippy: remove redundant suffix from enum
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
573 MergePick::Minor => MergeResult::Left, |
46126
94300498491e
copies-rust: move the mapping merging into a else clause
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46125
diff
changeset
|
574 } |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
575 } |
46586
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46585
diff
changeset
|
576 }) |
45944
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
577 } |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
578 |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
579 /// represent the side that should prevail when merging two |
46564
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46563
diff
changeset
|
580 /// InternalPathCopies |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
581 #[derive(Debug, PartialEq)] |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
582 enum MergePick { |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
583 /// The "major" (p1) side prevails |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
584 Major, |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
585 /// The "minor" (p2) side prevails |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
586 Minor, |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
587 /// Any side could be used (because they are the same) |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
588 Any, |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
589 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
590 |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
591 /// decide which side prevails in case of conflicting values |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
592 #[allow(clippy::if_same_then_else)] |
46569
34827c95092c
copies-rust: remove the ancestor Oracle logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46568
diff
changeset
|
593 fn compare_value( |
46156
7d99614b7b77
copies-rust: make the comparison aware of the revision being current merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46155
diff
changeset
|
594 current_merge: Revision, |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
595 merge_case_for_dest: impl Fn() -> MergeCase, |
46565
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46564
diff
changeset
|
596 src_minor: &CopySource, |
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46564
diff
changeset
|
597 src_major: &CopySource, |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
598 ) -> (MergePick, bool) { |
46583
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
599 if src_major == src_minor { |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
600 (MergePick::Any, false) |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
601 } else if src_major.rev == current_merge { |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
602 // minor is different according to per minor == major check earlier |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
603 debug_assert!(src_minor.rev != current_merge); |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
604 |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
605 // The last value comes the current merge, this value -will- win |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
606 // eventually. |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
607 (MergePick::Major, true) |
46156
7d99614b7b77
copies-rust: make the comparison aware of the revision being current merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46155
diff
changeset
|
608 } else if src_minor.rev == current_merge { |
7d99614b7b77
copies-rust: make the comparison aware of the revision being current merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46155
diff
changeset
|
609 // The last value comes the current merge, this value -will- win |
7d99614b7b77
copies-rust: make the comparison aware of the revision being current merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46155
diff
changeset
|
610 // eventually. |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
611 (MergePick::Minor, true) |
46156
7d99614b7b77
copies-rust: make the comparison aware of the revision being current merged
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46155
diff
changeset
|
612 } else if src_major.path == src_minor.path { |
49916
321e2b7bc95c
rust: fix broken debug assertions
Raphaël Gomès <rgomes@octobus.net>
parents:
46658
diff
changeset
|
613 debug_assert!(src_major.rev != src_minor.rev); |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
614 // we have the same value, but from other source; |
46583
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46582
diff
changeset
|
615 if src_major.is_overwritten_by(src_minor) { |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
616 (MergePick::Minor, false) |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
617 } else if src_minor.is_overwritten_by(src_major) { |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
618 (MergePick::Major, false) |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
619 } else { |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
620 (MergePick::Any, true) |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
621 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
622 } else { |
49916
321e2b7bc95c
rust: fix broken debug assertions
Raphaël Gomès <rgomes@octobus.net>
parents:
46658
diff
changeset
|
623 debug_assert!(src_major.rev != src_minor.rev); |
46612
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46611
diff
changeset
|
624 let action = merge_case_for_dest(); |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
625 if src_minor.path.is_some() |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
626 && src_major.path.is_none() |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
627 && action == MergeCase::Salvaged |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
628 { |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
629 // If the file is "deleted" in the major side but was |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
630 // salvaged by the merge, we keep the minor side alive |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
631 (MergePick::Minor, true) |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
632 } else if src_major.path.is_some() |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
633 && src_minor.path.is_none() |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
634 && action == MergeCase::Salvaged |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
635 { |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
636 // If the file is "deleted" in the minor side but was |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
637 // salvaged by the merge, unconditionnaly preserve the |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
638 // major side. |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
639 (MergePick::Major, true) |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
640 } else if src_minor.is_overwritten_by(src_major) { |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
641 // The information from the minor version are strictly older than |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
642 // the major version |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
643 if action == MergeCase::Merged { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
644 // If the file was actively merged, its means some non-copy |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
645 // activity happened on the other branch. It |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
646 // mean the older copy information are still relevant. |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
647 // |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
648 // The major side wins such conflict. |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
649 (MergePick::Major, true) |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
650 } else { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
651 // No activity on the minor branch, pick the newer one. |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
652 (MergePick::Major, false) |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
653 } |
46568
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46567
diff
changeset
|
654 } else if src_major.is_overwritten_by(src_minor) { |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
655 if action == MergeCase::Merged { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
656 // If the file was actively merged, its means some non-copy |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
657 // activity happened on the other branch. It |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
658 // mean the older copy information are still relevant. |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
659 // |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
660 // The major side wins such conflict. |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
661 (MergePick::Major, true) |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
662 } else { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
663 // No activity on the minor branch, pick the newer one. |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
664 (MergePick::Minor, false) |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
665 } |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
666 } else if src_minor.path.is_none() { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
667 // the minor side has no relevant information, pick the alive one |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
668 (MergePick::Major, true) |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
669 } else if src_major.path.is_none() { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
670 // the major side has no relevant information, pick the alive one |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
671 (MergePick::Minor, true) |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
672 } else { |
46562
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
673 // by default the major side wins |
46563
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46562
diff
changeset
|
674 (MergePick::Major, true) |
46125
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
675 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
676 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46059
diff
changeset
|
677 } |