dirstate.walk: skip unreadable directories (issue1213)
authorBenoit Boissinot <benoit.boissinot@ens-lyon.org>
Wed, 15 Oct 2008 14:52:27 +0200
changeset 7099 6f750e76fb46
parent 7098 8a5c88c7e97b
child 7100 baf12d52add4
dirstate.walk: skip unreadable directories (issue1213) Do not abort on permission denied error, just skip the directory.
mercurial/dirstate.py
tests/test-permissions
tests/test-permissions.out
--- a/mercurial/dirstate.py	Wed Oct 15 14:06:46 2008 +0200
+++ b/mercurial/dirstate.py	Wed Oct 15 14:52:27 2008 +0200
@@ -492,11 +492,18 @@
             nd = work.pop()
             if hasattr(match, 'dir'):
                 match.dir(nd)
+            skip = None
             if nd == '.':
                 nd = ''
-                entries = listdir(join(nd), stat=True)
             else:
-                entries = listdir(join(nd), stat=True, skip ='.hg')
+                skip = '.hg'
+            try:
+                entries = listdir(join(nd), stat=True, skip=skip)
+            except OSError, inst:
+                if inst.errno == errno.EACCES:
+                    fwarn(nd, inst.strerror)
+                    continue
+                raise
             for f, kind, st in entries:
                 nf = normalize(nd and (nd + "/" + f) or f, True)
                 if nf not in results:
--- a/tests/test-permissions	Wed Oct 15 14:06:46 2008 +0200
+++ b/tests/test-permissions	Wed Oct 15 14:52:27 2008 +0200
@@ -16,3 +16,10 @@
 chmod -w .
 hg diff --nodates
 chmod +w .
+
+chmod +w .hg/store/data/a.i
+mkdir dir
+touch dir/a
+hg status
+chmod -rx dir
+hg status
--- a/tests/test-permissions.out	Wed Oct 15 14:06:46 2008 +0200
+++ b/tests/test-permissions.out	Wed Oct 15 14:52:27 2008 +0200
@@ -20,3 +20,7 @@
 @@ -1,1 +1,1 @@
 -foo
 +barber
+M a
+? dir/a
+dir: Permission denied
+M a