##// END OF EJS Templates
rust-status: refactor dispatch case for normal files...
Raphaël Gomès -
r44002:51cd8673 default
parent child Browse files
Show More
@@ -28,6 +28,17 b' enum Dispatch {'
28 28 Unknown,
29 29 }
30 30
31 /// Dates and times that are outside the 31-bit signed range are compared
32 /// modulo 2^31. This should prevent hg from behaving badly with very large
33 /// files or corrupt dates while still having a high probability of detecting
34 /// changes. (issue2608)
35 /// TODO I haven't found a way of having `b` be `Into<i32>`, since `From<u64>`
36 /// is not defined for `i32`, and there is no `As` trait. This forces the
37 /// caller to cast `b` as `i32`.
38 fn mod_compare(a: i32, b: i32) -> bool {
39 a & i32::max_value() != b & i32::max_value()
40 }
41
31 42 /// The file corresponding to the dirstate entry was found on the filesystem.
32 43 fn dispatch_found(
33 44 filename: impl AsRef<HgPath>,
@@ -54,26 +65,17 b' fn dispatch_found('
54 65
55 66 match state {
56 67 EntryState::Normal => {
57 // Dates and times that are outside the 31-bit signed
58 // range are compared modulo 2^31. This should prevent
59 // it from behaving badly with very large files or
60 // corrupt dates while still having a high probability
61 // of detecting changes. (issue2608)
62 let range_mask = 0x7fffffff;
63
64 let size_changed = (size != st_size as i32)
65 && size != (st_size as i32 & range_mask);
68 let size_changed = mod_compare(size, st_size as i32);
66 69 let mode_changed =
67 70 (mode ^ st_mode as i32) & 0o100 != 0o000 && check_exec;
68 if size >= 0
69 && (size_changed || mode_changed)
70 || size == -2 // other parent
71 || copy_map.contains_key(filename.as_ref())
71 let metadata_changed = size >= 0 && (size_changed || mode_changed);
72 let other_parent = size == -2;
73 if metadata_changed
74 || other_parent
75 || copy_map.contains_key(filename.as_ref())
72 76 {
73 77 Dispatch::Modified
74 } else if mtime != st_mtime as i32
75 && mtime != (st_mtime as i32 & range_mask)
76 {
78 } else if mod_compare(mtime, st_mtime as i32) {
77 79 Dispatch::Unsure
78 80 } else if st_mtime == last_normal_time {
79 81 // the file may have just been marked as normal and
General Comments 0
You need to be logged in to leave comments. Login now