Mercurial > hg
changeset 47346:5e12b6bfdd3e
dirstate-tree: Fix status algorithm with unreadable directory
When reading a directory fails such as because of insufficient permissions,
it should be treated as empty by status instead of skipped entirely.
Differential Revision: https://phab.mercurial-scm.org/D10823
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 28 May 2021 12:16:14 +0200 |
parents | 710435a5c469 |
children | 73ddcedeaadf |
files | rust/hg-core/src/dirstate_tree/status.rs tests/test-status.t |
diffstat | 2 files changed, 21 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate_tree/status.rs Tue May 25 16:46:32 2021 -0700 +++ b/rust/hg-core/src/dirstate_tree/status.rs Fri May 28 12:16:14 2021 +0200 @@ -141,7 +141,10 @@ ) { entries } else { - return Ok(()); + // Treat an unreadable directory (typically because of insufficient + // permissions) like an empty directory. `self.read_dir` has + // already called `self.io_error` so a warning will be emitted. + Vec::new() }; // `merge_join_by` requires both its input iterators to be sorted:
--- a/tests/test-status.t Tue May 25 16:46:32 2021 -0700 +++ b/tests/test-status.t Fri May 28 12:16:14 2021 +0200 @@ -837,6 +837,23 @@ yet by the Rust implementation of status, but includematcher is supported. --include is used below for that reason +#if unix-permissions + +Not having permission to read a directory that contains tracked files makes +status emit a warning then behave as if the directory was empty or removed +entirely: + + $ chmod 0 subdir + $ hg status --include subdir + subdir: Permission denied + R subdir/removed + ! subdir/clean + ! subdir/deleted + ! subdir/modified + $ chmod 755 subdir + +#endif + Remove a directory that contains tracked files $ rm -r subdir