dirstate.walk: skip unreadable directories (issue1213)
Do not abort on permission denied error, just skip the directory.
--- 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