comparison rust/hg-core/src/dirstate_tree/status.rs @ 50294:bae51b50a5cf stable

dirstate-v2: fix an incorrect handling of readdir errors Make sure not to cache the results of a failed readdir call.
author Arseniy Alekseyev <aalekseyev@janestreet.com>
date Mon, 13 Mar 2023 14:15:34 +0000
parents e98fd81bb151
children edcc35a4f1dc
comparison
equal deleted inserted replaced
50293:f1f3a8eb93a1 50294:bae51b50a5cf
431 let children_all_have_dirstate_node_or_are_ignored = false; 431 let children_all_have_dirstate_node_or_are_ignored = false;
432 432
433 return Ok(children_all_have_dirstate_node_or_are_ignored); 433 return Ok(children_all_have_dirstate_node_or_are_ignored);
434 } 434 }
435 435
436 let readdir_succeeded;
436 let mut fs_entries = if let Ok(entries) = self.read_dir( 437 let mut fs_entries = if let Ok(entries) = self.read_dir(
437 directory_hg_path, 438 directory_hg_path,
438 &directory_entry.fs_path, 439 &directory_entry.fs_path,
439 is_at_repo_root, 440 is_at_repo_root,
440 ) { 441 ) {
442 readdir_succeeded = true;
441 entries 443 entries
442 } else { 444 } else {
443 // Treat an unreadable directory (typically because of insufficient 445 // Treat an unreadable directory (typically because of insufficient
444 // permissions) like an empty directory. `self.read_dir` has 446 // permissions) like an empty directory. `self.read_dir` has
445 // already called `self.io_error` so a warning will be emitted. 447 // already called `self.io_error` so a warning will be emitted.
448 // We still need to remember that there was an error so that we
449 // know not to cache this result.
450 readdir_succeeded = false;
446 Vec::new() 451 Vec::new()
447 }; 452 };
448 453
449 // `merge_join_by` requires both its input iterators to be sorted: 454 // `merge_join_by` requires both its input iterators to be sorted:
450 455
493 ), 498 ),
494 }; 499 };
495 Ok(has_dirstate_node_or_is_ignored) 500 Ok(has_dirstate_node_or_is_ignored)
496 }) 501 })
497 .try_reduce(|| true, |a, b| Ok(a && b)) 502 .try_reduce(|| true, |a, b| Ok(a && b))
503 .map(|res| res && readdir_succeeded)
498 } 504 }
499 505
500 fn traverse_fs_and_dirstate<'ancestor>( 506 fn traverse_fs_and_dirstate<'ancestor>(
501 &self, 507 &self,
502 fs_entry: &DirEntry, 508 fs_entry: &DirEntry,