252 }; |
252 }; |
253 } |
253 } |
254 |
254 |
255 let mut dmap = repo.dirstate_map_mut()?; |
255 let mut dmap = repo.dirstate_map_mut()?; |
256 |
256 |
|
257 let check_exec = hg::checkexec::check_exec(repo.working_directory_path()); |
|
258 |
257 let options = StatusOptions { |
259 let options = StatusOptions { |
258 // we're currently supporting file systems with exec flags only |
260 check_exec, |
259 // anyway |
|
260 check_exec: true, |
|
261 list_clean: display_states.clean, |
261 list_clean: display_states.clean, |
262 list_unknown: display_states.unknown, |
262 list_unknown: display_states.unknown, |
263 list_ignored: display_states.ignored, |
263 list_ignored: display_states.ignored, |
264 list_copies, |
264 list_copies, |
265 collect_traversed_dirs: false, |
265 collect_traversed_dirs: false, |
552 /// This meant to be used for those that the dirstate cannot resolve, due |
553 /// This meant to be used for those that the dirstate cannot resolve, due |
553 /// to time resolution limits. |
554 /// to time resolution limits. |
554 fn unsure_is_modified( |
555 fn unsure_is_modified( |
555 working_directory_vfs: hg::vfs::Vfs, |
556 working_directory_vfs: hg::vfs::Vfs, |
556 store_vfs: hg::vfs::Vfs, |
557 store_vfs: hg::vfs::Vfs, |
|
558 check_exec: bool, |
557 manifest: &Manifest, |
559 manifest: &Manifest, |
558 hg_path: &HgPath, |
560 hg_path: &HgPath, |
559 ) -> Result<bool, HgError> { |
561 ) -> Result<bool, HgError> { |
560 let vfs = working_directory_vfs; |
562 let vfs = working_directory_vfs; |
561 let fs_path = hg_path_to_path_buf(hg_path).expect("HgPath conversion"); |
563 let fs_path = hg_path_to_path_buf(hg_path).expect("HgPath conversion"); |
562 let fs_metadata = vfs.symlink_metadata(&fs_path)?; |
564 let fs_metadata = vfs.symlink_metadata(&fs_path)?; |
563 let is_symlink = fs_metadata.file_type().is_symlink(); |
565 let is_symlink = fs_metadata.file_type().is_symlink(); |
|
566 |
|
567 let entry = manifest |
|
568 .find_by_path(hg_path)? |
|
569 .expect("ambgious file not in p1"); |
|
570 |
564 // TODO: Also account for `FALLBACK_SYMLINK` and `FALLBACK_EXEC` from the |
571 // TODO: Also account for `FALLBACK_SYMLINK` and `FALLBACK_EXEC` from the |
565 // dirstate |
572 // dirstate |
566 let fs_flags = if is_symlink { |
573 let fs_flags = if is_symlink { |
567 Some(b'l') |
574 Some(b'l') |
568 } else if has_exec_bit(&fs_metadata) { |
575 } else if check_exec && has_exec_bit(&fs_metadata) { |
569 Some(b'x') |
576 Some(b'x') |
570 } else { |
577 } else { |
571 None |
578 None |
572 }; |
579 }; |
573 |
580 |
574 let entry = manifest |
581 let entry_flags = if check_exec { |
575 .find_by_path(hg_path)? |
582 entry.flags |
576 .expect("ambgious file not in p1"); |
583 } else { |
577 if entry.flags != fs_flags { |
584 if entry.flags == Some(b'x') { |
|
585 None |
|
586 } else { |
|
587 entry.flags |
|
588 } |
|
589 }; |
|
590 |
|
591 if entry_flags != fs_flags { |
578 return Ok(true); |
592 return Ok(true); |
579 } |
593 } |
580 let filelog = hg::filelog::Filelog::open_vfs(&store_vfs, hg_path)?; |
594 let filelog = hg::filelog::Filelog::open_vfs(&store_vfs, hg_path)?; |
581 let fs_len = fs_metadata.len(); |
595 let fs_len = fs_metadata.len(); |
582 let file_node = entry.node_id()?; |
596 let file_node = entry.node_id()?; |