Mercurial > public > mercurial-scm > hg
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, |