changeset 47352: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