Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-core/src/copy_tracing.rs @ 46696:f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
by using the new from-bytes-safe crate and a custom struct
that encodes the expected data structure.
Differential Revision: https://phab.mercurial-scm.org/D10068
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Wed, 06 Jan 2021 23:11:59 +0100 |
parents | f2fc34e88238 |
children | fa21633af201 |
rev | line source |
---|---|
45988
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
1 use crate::utils::hg_path::HgPath; |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 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
|
3 use crate::Revision; |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
4 use crate::NULL_REVISION; |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
6 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
|
7 use im_rc::ordmap::Entry; |
45978
0d99778af68a
copies-rust: use immutable "OrdMap" to store copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45959
diff
changeset
|
8 use im_rc::ordmap::OrdMap; |
46624
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46623
diff
changeset
|
9 use im_rc::OrdSet; |
45978
0d99778af68a
copies-rust: use immutable "OrdMap" to store copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45959
diff
changeset
|
10 |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
11 use std::cmp::Ordering; |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 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
|
13 |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 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
|
15 |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
16 type PathToken = usize; |
46130
818502d2f5e3
copies-rust: pre-introduce a PathToken type and use it where applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
17 |
46621
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
18 #[derive(Clone, Debug)] |
46609
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46608
diff
changeset
|
19 struct CopySource { |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
20 /// 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
|
21 rev: Revision, |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 /// 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
|
23 /// key) |
46130
818502d2f5e3
copies-rust: pre-introduce a PathToken type and use it where applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46129
diff
changeset
|
24 path: Option<PathToken>, |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
25 /// 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:
46611
diff
changeset
|
26 /// overwritten by this one. |
46624
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46623
diff
changeset
|
27 overwritten: OrdSet<Revision>, |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
28 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
29 |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
30 impl CopySource { |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
31 /// create a new CopySource |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
32 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
33 /// 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:
46610
diff
changeset
|
34 fn new(rev: Revision, path: Option<PathToken>) -> Self { |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
35 Self { |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
36 rev, |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
37 path, |
46624
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46623
diff
changeset
|
38 overwritten: OrdSet::new(), |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
39 } |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
40 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
41 |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
42 /// 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:
46610
diff
changeset
|
43 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
44 /// 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:
46610
diff
changeset
|
45 /// some entries. |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
46 fn new_from_merge(rev: Revision, winner: &Self, loser: &Self) -> Self { |
46624
60b2b7ecf9cb
copies-rust: use imrs::OrdSet instead of imrs::HashSet
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46623
diff
changeset
|
47 let mut overwritten = OrdSet::new(); |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
48 overwritten.extend(winner.overwritten.iter().copied()); |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
49 overwritten.extend(loser.overwritten.iter().copied()); |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
50 overwritten.insert(winner.rev); |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
51 overwritten.insert(loser.rev); |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
52 Self { |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
53 rev, |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
54 path: winner.path, |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
55 overwritten: overwritten, |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
56 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
57 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
58 |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
59 /// 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:
46610
diff
changeset
|
60 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
61 /// 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:
46610
diff
changeset
|
62 fn overwrite(&mut self, rev: Revision, path: Option<PathToken>) { |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
63 self.overwritten.insert(self.rev); |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
64 self.rev = rev; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
65 self.path = path; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
66 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
67 |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
68 /// 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:
46610
diff
changeset
|
69 /// |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
70 /// 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:
46610
diff
changeset
|
71 fn mark_delete(&mut self, rev: Revision) { |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
72 self.overwritten.insert(self.rev); |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
73 self.rev = rev; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
74 self.path = None; |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
75 } |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
76 |
46620
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
77 /// 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:
46619
diff
changeset
|
78 /// |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
79 /// 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:
46619
diff
changeset
|
80 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:
46619
diff
changeset
|
81 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:
46619
diff
changeset
|
82 if other.rev != rev { |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
83 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:
46619
diff
changeset
|
84 } |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
85 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:
46619
diff
changeset
|
86 self.rev = rev; |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
87 self.path = None; |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
88 } |
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
89 |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
90 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:
46611
diff
changeset
|
91 other.overwritten.contains(&self.rev) |
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
92 } |
46611
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
93 } |
b6f65d90e8af
copies-rust: add methods to build and update CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46610
diff
changeset
|
94 |
46621
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
95 // 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:
46620
diff
changeset
|
96 // the same. |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
97 impl PartialEq for CopySource { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
98 fn eq(&self, other: &Self) -> bool { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
99 #[cfg(debug_assertions)] |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
100 { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
101 if self.rev == other.rev { |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
102 debug_assert!(self.path == other.path); |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
103 debug_assert!(self.overwritten == other.overwritten); |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
104 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
105 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
106 self.rev == other.rev |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
107 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
108 } |
b0a3ca02d17a
copies-rust: implement PartialEqual manually
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46620
diff
changeset
|
109 |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
110 /// maps CopyDestination to Copy Source (+ a "timestamp" for the operation) |
46609
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46608
diff
changeset
|
111 type InternalPathCopies = OrdMap<PathToken, CopySource>; |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
112 |
45988
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
113 /// 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:
45987
diff
changeset
|
114 enum Action<'a> { |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
115 /// 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:
45987
diff
changeset
|
116 /// |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
117 /// (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:
45987
diff
changeset
|
118 /// not matters) |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
119 Removed(&'a HgPath), |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
120 /// 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:
45987
diff
changeset
|
121 /// source) |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
122 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:
46616
diff
changeset
|
123 CopiedFromP2(&'a HgPath, &'a HgPath), |
45988
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
124 } |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
125 |
45990
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
126 /// 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:
45989
diff
changeset
|
127 /// |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
128 /// 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:
45989
diff
changeset
|
129 #[derive(PartialEq)] |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
130 enum MergeCase { |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
131 /// 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:
45989
diff
changeset
|
132 Merged, |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
133 /// 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:
45989
diff
changeset
|
134 Salvaged, |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
135 /// 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:
45989
diff
changeset
|
136 Normal, |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
137 } |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
138 |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
139 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:
45990
diff
changeset
|
140 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:
45990
diff
changeset
|
141 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:
45990
diff
changeset
|
142 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:
45990
diff
changeset
|
143 const REMOVED: u8 = 12; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
144 const MERGED: u8 = 8; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
145 const SALVAGED: u8 = 16; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
146 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
147 #[derive(BytesCast)] |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
148 #[repr(C)] |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
149 struct ChangedFilesIndexEntry { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
150 flags: u8, |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
151 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
152 /// 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:
46658
diff
changeset
|
153 /// previous entry. |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
154 destination_path_end_position: unaligned::U32Be, |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
155 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
156 source_index_entry_position: unaligned::U32Be, |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
157 } |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
158 |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
159 fn _static_assert_size_of() { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
160 let _ = std::mem::transmute::<ChangedFilesIndexEntry, [u8; 9]>; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
161 } |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
162 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
163 /// Represents the files affected by a changeset. |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
164 /// |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
165 /// 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:
46658
diff
changeset
|
166 /// all the data categories tracked by it. |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
167 pub struct ChangedFiles<'a> { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
168 index: &'a [ChangedFilesIndexEntry], |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
169 paths: &'a [u8], |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
170 } |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
171 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
172 impl<'a> ChangedFiles<'a> { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
173 pub fn new(data: &'a [u8]) -> Self { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
174 let (header, rest) = unaligned::U32Be::from_bytes(data).unwrap(); |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
175 let nb_index_entries = header.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
176 let (index, paths) = |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
177 ChangedFilesIndexEntry::slice_from_bytes(rest, nb_index_entries) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
178 .unwrap(); |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
179 Self { index, paths } |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
180 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
181 |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
182 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
|
183 ChangedFiles { |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
184 index: &[], |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
185 paths: &[], |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
186 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
187 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
188 |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
189 /// 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:
46658
diff
changeset
|
190 fn path(&self, idx: usize) -> &HgPath { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
191 let start = if idx == 0 { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
192 0 |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
193 } else { |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
194 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:
46658
diff
changeset
|
195 }; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
196 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:
46658
diff
changeset
|
197 HgPath::new(&self.paths[start..end]) |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
198 } |
45988
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
199 |
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
200 /// Return an iterator over all the `Action` in this instance. |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
201 fn iter_actions(&self) -> impl Iterator<Item = Action> { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
202 self.index.iter().enumerate().flat_map(move |(idx, entry)| { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
203 let path = self.path(idx); |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
204 if (entry.flags & ACTION_MASK) == REMOVED { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
205 Some(Action::Removed(path)) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
206 } else if (entry.flags & COPY_MASK) == P1_COPY { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
207 let source_idx = |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
208 entry.source_index_entry_position.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
209 Some(Action::CopiedFromP1(path, self.path(source_idx))) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
210 } else if (entry.flags & COPY_MASK) == P2_COPY { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
211 let source_idx = |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
212 entry.source_index_entry_position.get() as usize; |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
213 Some(Action::CopiedFromP2(path, self.path(source_idx))) |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
214 } else { |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
215 None |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
216 } |
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
217 }) |
45988
ed0e1339e4a8
copies-rust: combine the iteration over remove and copies into one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45987
diff
changeset
|
218 } |
45990
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
219 |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
220 /// 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:
45989
diff
changeset
|
221 fn get_merge_case(&self, path: &HgPath) -> MergeCase { |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
222 if self.index.is_empty() { |
45990
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
223 return MergeCase::Normal; |
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
224 } |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
225 let mut low_part = 0; |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
226 let mut high_part = self.index.len(); |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
227 |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
228 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:
45990
diff
changeset
|
229 let cursor = (low_part + high_part - 1) / 2; |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
230 match path.cmp(self.path(cursor)) { |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
231 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:
45990
diff
changeset
|
232 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:
45990
diff
changeset
|
233 Ordering::Equal => { |
46696
f977a065c7c2
copies-rust: rewrite ChangedFiles binary parsing
Simon Sapin <simon.sapin@octobus.net>
parents:
46658
diff
changeset
|
234 return match self.index[cursor].flags & ACTION_MASK { |
46061
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
235 MERGED => MergeCase::Merged, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
236 SALVAGED => MergeCase::Salvaged, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
237 _ => MergeCase::Normal, |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
238 }; |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
239 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
240 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
241 } |
e0313b0a6f7e
copies-rust: parse the changed-file sidedata directly in rust
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45990
diff
changeset
|
242 MergeCase::Normal |
45990
2367937982ba
copies-rust: encapsulate internal sets on `changes`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45989
diff
changeset
|
243 } |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
244 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
245 |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
246 /// 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
|
247 /// PathToken |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
248 /// |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
249 /// 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
|
250 /// 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
|
251 #[derive(Clone, Debug, Default)] |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
252 struct TwoWayPathMap { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
253 token: HashMap<HgPathBuf, PathToken>, |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
254 path: Vec<HgPathBuf>, |
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 |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
257 impl TwoWayPathMap { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
258 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
|
259 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
|
260 Some(a) => *a, |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
261 None => { |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
262 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
|
263 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
|
264 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
|
265 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
|
266 a |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
267 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
268 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
269 } |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
270 |
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
271 fn untokenize(&self, token: PathToken) -> &HgPathBuf { |
46658
f2fc34e88238
copies-rust: remove an unnecessary format!() inside assert!()
Martin von Zweigbergk <martinvonz@google.com>
parents:
46651
diff
changeset
|
272 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
|
273 &self.path[token] |
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 |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
277 /// Same as mercurial.copies._combine_changeset_copies, but in Rust. |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
278 pub struct CombineChangesetCopies { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
279 all_copies: HashMap<Revision, InternalPathCopies>, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
280 path_map: TwoWayPathMap, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
281 children_count: HashMap<Revision, usize>, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
282 } |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
283 |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
284 impl CombineChangesetCopies { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
285 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:
46625
diff
changeset
|
286 Self { |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
287 all_copies: HashMap::new(), |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
288 path_map: TwoWayPathMap::default(), |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
289 children_count, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
290 } |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
291 } |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
292 |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
293 /// 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:
46625
diff
changeset
|
294 /// 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:
46625
diff
changeset
|
295 pub fn add_revision( |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
296 &mut self, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
297 rev: Revision, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
298 p1: Revision, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
299 p2: Revision, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
300 changes: ChangedFiles<'_>, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
301 ) { |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
302 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:
46650
diff
changeset
|
303 changes.get_merge_case(path) |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
304 }) |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
305 } |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
306 |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
307 /// 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:
46650
diff
changeset
|
308 /// without synthetizing a `ChangedFiles` in binary format. |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
309 fn add_revision_inner<'a>( |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
310 &mut self, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
311 rev: Revision, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
312 p1: Revision, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
313 p2: Revision, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
314 copy_actions: impl Iterator<Item = Action<'a>>, |
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
315 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:
46650
diff
changeset
|
316 ) { |
46614
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
317 // Retrieve data computed in a previous iteration |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
318 let p1_copies = match p1 { |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
319 NULL_REVISION => None, |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
320 _ => get_and_clean_parent_copies( |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
321 &mut self.all_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
322 &mut self.children_count, |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
323 p1, |
46614
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
324 ), // 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:
46613
diff
changeset
|
325 }; |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
326 let p2_copies = match p2 { |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
327 NULL_REVISION => None, |
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
328 _ => get_and_clean_parent_copies( |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
329 &mut self.all_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
330 &mut self.children_count, |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
331 p2, |
46614
389b0328b789
copies-rust: get the parents' copies earlier
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46613
diff
changeset
|
332 ), // 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:
46613
diff
changeset
|
333 }; |
46615
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
334 // combine it with data for that revision |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
335 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:
46625
diff
changeset
|
336 &mut self.path_map, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
337 p1_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
338 p2_copies, |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
339 copy_actions, |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
340 rev, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
341 ); |
46615
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
342 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:
46614
diff
changeset
|
343 (None, None) => None, |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
344 (c, None) => c, |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
345 (None, c) => c, |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
346 (Some(p1_copies), Some(p2_copies)) => Some(merge_copies_dict( |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
347 &self.path_map, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
348 rev, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
349 p2_copies, |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
350 p1_copies, |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
351 get_merge_case, |
46615
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
352 )), |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
353 }; |
f8bdc8329d77
copies-rust: use matching to select the final copies information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46614
diff
changeset
|
354 if let Some(c) = copies { |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
355 self.all_copies.insert(rev, c); |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
356 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
357 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
358 |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
359 /// 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:
46625
diff
changeset
|
360 /// return the final mapping. |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
361 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:
46625
diff
changeset
|
362 let tt_result = self |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
363 .all_copies |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
364 .remove(&target_rev) |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
365 .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:
46625
diff
changeset
|
366 let mut result = PathCopies::default(); |
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
367 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:
46625
diff
changeset
|
368 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:
46625
diff
changeset
|
369 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:
46625
diff
changeset
|
370 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:
46625
diff
changeset
|
371 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:
46625
diff
changeset
|
372 } |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
373 } |
46626
cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
Simon Sapin <simon.sapin@octobus.net>
parents:
46625
diff
changeset
|
374 result |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
375 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
376 } |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
377 |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
378 /// fetch previous computed information |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
379 /// |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
380 /// 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:
46130
diff
changeset
|
381 /// the cache. |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
382 /// |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
383 /// 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:
46130
diff
changeset
|
384 fn get_and_clean_parent_copies( |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
385 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:
46130
diff
changeset
|
386 children_count: &mut HashMap<Revision, usize>, |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
387 parent_rev: Revision, |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
388 ) -> Option<InternalPathCopies> { |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
389 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:
46130
diff
changeset
|
390 *count -= 1; |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
391 if *count == 0 { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
392 match all_copies.remove(&parent_rev) { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
393 Some(c) => Some(c), |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
394 None => Some(InternalPathCopies::default()), |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
395 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
396 } else { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
397 match all_copies.get(&parent_rev) { |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
398 Some(c) => Some(c.clone()), |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
399 None => Some(InternalPathCopies::default()), |
46149
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
400 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
401 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
402 } |
294d5aca4ff5
copies: iterate over children directly (instead of parents)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46130
diff
changeset
|
403 |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
404 /// 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:
46062
diff
changeset
|
405 /// the result |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
406 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
|
407 path_map: &mut TwoWayPathMap, |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
408 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:
46617
diff
changeset
|
409 base_p2_copies: Option<InternalPathCopies>, |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
410 copy_actions: impl Iterator<Item = Action<'a>>, |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
411 current_rev: Revision, |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
412 ) -> (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:
46617
diff
changeset
|
413 // 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:
46617
diff
changeset
|
414 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:
46617
diff
changeset
|
415 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:
46617
diff
changeset
|
416 } |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
417 |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
418 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:
46617
diff
changeset
|
419 let mut p2_copies = base_p2_copies.clone(); |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
420 for action in copy_actions { |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
421 match action { |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
422 Action::CopiedFromP1(path_dest, path_source) => { |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
423 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:
46617
diff
changeset
|
424 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:
46617
diff
changeset
|
425 Some(copies) => add_one_copy( |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
426 current_rev, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
427 path_map, |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
428 copies, |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
429 base_p1_copies.as_ref().unwrap(), |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
430 path_dest, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
431 path_source, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
432 ), |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
433 } |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
434 } |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
435 Action::CopiedFromP2(path_dest, path_source) => { |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
436 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:
46617
diff
changeset
|
437 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:
46617
diff
changeset
|
438 Some(copies) => add_one_copy( |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
439 current_rev, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
440 path_map, |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
441 copies, |
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
442 base_p2_copies.as_ref().unwrap(), |
46617
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
443 path_dest, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
444 path_source, |
a34cd9aa3323
copies-rust: yield both p1 and p2 copies in `ChangedFiles.actions()`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46616
diff
changeset
|
445 ), |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
446 } |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
447 } |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
448 Action::Removed(deleted_path) => { |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
449 // 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:
46062
diff
changeset
|
450 // |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
451 // 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:
46062
diff
changeset
|
452 // propagate this information when merging two |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
453 // InternalPathCopies object. |
46151
c6bc77f7e593
copies-rust: tokenize all paths into integer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46149
diff
changeset
|
454 let deleted = path_map.tokenize(deleted_path); |
46619
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
455 |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
456 let p1_entry = match &mut p1_copies { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
457 None => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
458 Some(copies) => match copies.entry(deleted) { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
459 Entry::Occupied(e) => Some(e), |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
460 Entry::Vacant(_) => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
461 }, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
462 }; |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
463 let p2_entry = match &mut p2_copies { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
464 None => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
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:
46618
diff
changeset
|
466 Entry::Occupied(e) => Some(e), |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
467 Entry::Vacant(_) => None, |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
468 }, |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
469 }; |
46619
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
470 |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
471 match (p1_entry, p2_entry) { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
472 (None, None) => (), |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
473 (Some(mut e), None) => { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
474 e.get_mut().mark_delete(current_rev) |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
475 } |
46619
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
476 (None, Some(mut e)) => { |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
477 e.get_mut().mark_delete(current_rev) |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
478 } |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
479 (Some(mut e1), Some(mut e2)) => { |
46620
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
480 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:
46619
diff
changeset
|
481 let cs2 = e2.get(); |
46623
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46622
diff
changeset
|
482 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:
46622
diff
changeset
|
483 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:
46622
diff
changeset
|
484 } else { |
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46622
diff
changeset
|
485 cs1.mark_delete_with_pair(current_rev, &cs2); |
aa19d60ac974
copies-rust: use simpler overwrite when value on both side are identical
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46622
diff
changeset
|
486 } |
46620
d6d57bfc1a1b
copies-rust: record "overwritten" information from both side on delete
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46619
diff
changeset
|
487 e2.insert(cs1.clone()); |
46619
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
488 } |
2076df13d00f
copies-rust: refactor the "deletion" case
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46618
diff
changeset
|
489 } |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
490 } |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
491 } |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
492 } |
46618
600f8d510ab6
copies-rust: process copy information of both parent at the same time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46617
diff
changeset
|
493 (p1_copies, p2_copies) |
46063
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
494 } |
dacb771f6dd2
copies-rust: extract the processing of a ChangedFiles in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46062
diff
changeset
|
495 |
46616
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
496 // 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:
46615
diff
changeset
|
497 // |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
498 // 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:
46615
diff
changeset
|
499 fn add_one_copy( |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
500 current_rev: Revision, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
501 path_map: &mut TwoWayPathMap, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
502 copies: &mut InternalPathCopies, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
503 base_copies: &InternalPathCopies, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
504 path_dest: &HgPath, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
505 path_source: &HgPath, |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
506 ) { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
507 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:
46615
diff
changeset
|
508 let source = path_map.tokenize(path_source); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
509 let entry; |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
510 if let Some(v) = base_copies.get(&source) { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
511 entry = match &v.path { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
512 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:
46615
diff
changeset
|
513 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:
46615
diff
changeset
|
514 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
515 } else { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
516 entry = Some(source.to_owned()); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
517 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
518 // 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:
46615
diff
changeset
|
519 // 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:
46615
diff
changeset
|
520 // 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:
46615
diff
changeset
|
521 // 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:
46615
diff
changeset
|
522 match copies.entry(dest) { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
523 Entry::Vacant(slot) => { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
524 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:
46615
diff
changeset
|
525 slot.insert(ttpc); |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
526 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
527 Entry::Occupied(mut slot) => { |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
528 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:
46615
diff
changeset
|
529 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:
46615
diff
changeset
|
530 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
531 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
532 } |
d2ad44b8ef6a
copies-rust: extract the processing of a single copy information
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46615
diff
changeset
|
533 |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
534 /// 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
|
535 /// |
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
536 /// 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
|
537 /// cases. See inline documentation for details. |
46613
34827c95092c
copies-rust: remove the ancestor Oracle logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46612
diff
changeset
|
538 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
|
539 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
|
540 current_merge: Revision, |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
541 minor: InternalPathCopies, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
542 major: InternalPathCopies, |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
543 get_merge_case: impl Fn(&HgPath) -> MergeCase + Copy, |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
544 ) -> InternalPathCopies { |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
545 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:
46624
diff
changeset
|
546 |
46650
1fce35fcb4db
copies-rust: pass `PathToken` around by value
Simon Sapin <simon.sapin@octobus.net>
parents:
46626
diff
changeset
|
547 ordmap_union_with_merge(minor, major, |&dest, src_minor, src_major| { |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
548 let (pick, overwrite) = compare_value( |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
549 current_merge, |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
550 || get_merge_case(path_map.untokenize(dest)), |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
551 src_minor, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
552 src_major, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
553 ); |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
554 if overwrite { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
555 let (winner, loser) = match pick { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
556 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:
46624
diff
changeset
|
557 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:
46624
diff
changeset
|
558 }; |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
559 MergeResult::UseNewValue(CopySource::new_from_merge( |
46613
34827c95092c
copies-rust: remove the ancestor Oracle logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46612
diff
changeset
|
560 current_merge, |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
561 winner, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
562 loser, |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
563 )) |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
564 } else { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
565 match pick { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
566 MergePick::Any | MergePick::Major => { |
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
567 MergeResult::UseRightValue |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
568 } |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
569 MergePick::Minor => MergeResult::UseLeftValue, |
46127
94300498491e
copies-rust: move the mapping merging into a else clause
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46126
diff
changeset
|
570 } |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
571 } |
46625
435d9fc72646
copies-rust: extract generic map merge logic from merge_copies_dict
Simon Sapin <simon.sapin@octobus.net>
parents:
46624
diff
changeset
|
572 }) |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
573 } |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
574 |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
575 /// represent the side that should prevail when merging two |
46608
313610be4147
copies-rust: rename TimeStampedPathCopies to InternalPathCopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46607
diff
changeset
|
576 /// InternalPathCopies |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
577 #[derive(Debug, PartialEq)] |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
578 enum MergePick { |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
579 /// 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:
46063
diff
changeset
|
580 Major, |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
581 /// 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:
46063
diff
changeset
|
582 Minor, |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
583 /// 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:
46063
diff
changeset
|
584 Any, |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
585 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
586 |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
587 /// 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:
46063
diff
changeset
|
588 #[allow(clippy::if_same_then_else)] |
46613
34827c95092c
copies-rust: remove the ancestor Oracle logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46612
diff
changeset
|
589 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
|
590 current_merge: Revision, |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
591 merge_case_for_dest: impl Fn() -> MergeCase, |
46609
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46608
diff
changeset
|
592 src_minor: &CopySource, |
2bd069788367
copies-rust: rename TimeStampedPathCopy to CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46608
diff
changeset
|
593 src_major: &CopySource, |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
594 ) -> (MergePick, bool) { |
46622
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
595 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:
46621
diff
changeset
|
596 (MergePick::Any, false) |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
597 } 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:
46621
diff
changeset
|
598 // 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:
46621
diff
changeset
|
599 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:
46621
diff
changeset
|
600 |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
601 // 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:
46621
diff
changeset
|
602 // eventually. |
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
603 (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
|
604 } 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
|
605 // 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
|
606 // eventually. |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
607 (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
|
608 } else if src_major.path == src_minor.path { |
46622
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
609 debug_assert!(src_major.rev != src_major.rev); |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
610 // we have the same value, but from other source; |
46622
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
611 if src_major.is_overwritten_by(src_minor) { |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
612 (MergePick::Minor, false) |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
613 } else if src_minor.is_overwritten_by(src_major) { |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
614 (MergePick::Major, false) |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
615 } else { |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
616 (MergePick::Any, true) |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
617 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
618 } else { |
46622
8fcf07e6bbb4
copies-rust: make more use of the new comparison property
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46621
diff
changeset
|
619 debug_assert!(src_major.rev != src_major.rev); |
46651
80f7567ac9bb
copies-rust: pass closures and iterators instead of `&ChangedFiles`
Simon Sapin <simon.sapin@octobus.net>
parents:
46650
diff
changeset
|
620 let action = merge_case_for_dest(); |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
621 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
|
622 && src_major.path.is_none() |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
623 && action == MergeCase::Salvaged |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
624 { |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
625 // 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:
46063
diff
changeset
|
626 // salvaged by the merge, we keep the minor side alive |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
627 (MergePick::Minor, true) |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
628 } 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
|
629 && src_minor.path.is_none() |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
630 && action == MergeCase::Salvaged |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
631 { |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
632 // 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:
46063
diff
changeset
|
633 // 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:
46063
diff
changeset
|
634 // major side. |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
635 (MergePick::Major, true) |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
636 } else if src_minor.is_overwritten_by(src_major) { |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
637 // 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
|
638 // the major version |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
639 if action == MergeCase::Merged { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
640 // 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
|
641 // 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
|
642 // 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
|
643 // |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
644 // The major side wins such conflict. |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
645 (MergePick::Major, true) |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
646 } else { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
647 // No activity on the minor branch, pick the newer one. |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
648 (MergePick::Major, false) |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
649 } |
46612
0d840b9d200d
copies-rust: track "overwrites" directly within CopySource
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46611
diff
changeset
|
650 } else if src_major.is_overwritten_by(src_minor) { |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
651 if action == MergeCase::Merged { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
652 // 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
|
653 // 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
|
654 // 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
|
655 // |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
656 // The major side wins such conflict. |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
657 (MergePick::Major, true) |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
658 } else { |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
659 // No activity on the minor branch, pick the newer one. |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
660 (MergePick::Minor, false) |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
661 } |
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
662 } 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
|
663 // the minor side has no relevant information, pick the alive one |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
664 (MergePick::Major, true) |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
665 } 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
|
666 // the major side has no relevant information, pick the alive one |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
667 (MergePick::Minor, true) |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
668 } else { |
46606
c692384bb559
copies: rearrange all value comparison conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46157
diff
changeset
|
669 // by default the major side wins |
46607
c19c662097e1
copies: detect case when a merge decision overwrite previous data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46606
diff
changeset
|
670 (MergePick::Major, true) |
46126
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
671 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
672 } |
61afe6215aef
copies-rust: extract conflicting value comparison in its own function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
46063
diff
changeset
|
673 } |