4 use crate::NULL_REVISION; |
4 use crate::NULL_REVISION; |
5 |
5 |
6 use im_rc::ordmap::DiffItem; |
6 use im_rc::ordmap::DiffItem; |
7 use im_rc::ordmap::Entry; |
7 use im_rc::ordmap::Entry; |
8 use im_rc::ordmap::OrdMap; |
8 use im_rc::ordmap::OrdMap; |
|
9 use im_rc::OrdSet; |
9 |
10 |
10 use std::cmp::Ordering; |
11 use std::cmp::Ordering; |
11 use std::collections::HashMap; |
12 use std::collections::HashMap; |
12 use std::collections::HashSet; |
|
13 use std::convert::TryInto; |
13 use std::convert::TryInto; |
14 |
14 |
15 pub type PathCopies = HashMap<HgPathBuf, HgPathBuf>; |
15 pub type PathCopies = HashMap<HgPathBuf, HgPathBuf>; |
16 |
16 |
17 type PathToken = usize; |
17 type PathToken = usize; |
23 /// the copy source, (Set to None in case of deletion of the associated |
23 /// the copy source, (Set to None in case of deletion of the associated |
24 /// key) |
24 /// key) |
25 path: Option<PathToken>, |
25 path: Option<PathToken>, |
26 /// a set of previous `CopySource.rev` value directly or indirectly |
26 /// a set of previous `CopySource.rev` value directly or indirectly |
27 /// overwritten by this one. |
27 /// overwritten by this one. |
28 overwritten: HashSet<Revision>, |
28 overwritten: OrdSet<Revision>, |
29 } |
29 } |
30 |
30 |
31 impl CopySource { |
31 impl CopySource { |
32 /// create a new CopySource |
32 /// create a new CopySource |
33 /// |
33 /// |
34 /// Use this when no previous copy source existed. |
34 /// Use this when no previous copy source existed. |
35 fn new(rev: Revision, path: Option<PathToken>) -> Self { |
35 fn new(rev: Revision, path: Option<PathToken>) -> Self { |
36 Self { |
36 Self { |
37 rev, |
37 rev, |
38 path, |
38 path, |
39 overwritten: HashSet::new(), |
39 overwritten: OrdSet::new(), |
40 } |
40 } |
41 } |
41 } |
42 |
42 |
43 /// create a new CopySource from merging two others |
43 /// create a new CopySource from merging two others |
44 /// |
44 /// |
45 /// Use this when merging two InternalPathCopies requires active merging of |
45 /// Use this when merging two InternalPathCopies requires active merging of |
46 /// some entries. |
46 /// some entries. |
47 fn new_from_merge(rev: Revision, winner: &Self, loser: &Self) -> Self { |
47 fn new_from_merge(rev: Revision, winner: &Self, loser: &Self) -> Self { |
48 let mut overwritten = HashSet::new(); |
48 let mut overwritten = OrdSet::new(); |
49 overwritten.extend(winner.overwritten.iter().copied()); |
49 overwritten.extend(winner.overwritten.iter().copied()); |
50 overwritten.extend(loser.overwritten.iter().copied()); |
50 overwritten.extend(loser.overwritten.iter().copied()); |
51 overwritten.insert(winner.rev); |
51 overwritten.insert(winner.rev); |
52 overwritten.insert(loser.rev); |
52 overwritten.insert(loser.rev); |
53 Self { |
53 Self { |