diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -492,11 +492,18 @@ class dirstate(object): 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: diff --git a/tests/test-permissions b/tests/test-permissions --- a/tests/test-permissions +++ b/tests/test-permissions @@ -16,3 +16,10 @@ hg commit -m "2" -d "1000000 0" 2>/dev/n 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 diff --git a/tests/test-permissions.out b/tests/test-permissions.out --- a/tests/test-permissions.out +++ b/tests/test-permissions.out @@ -20,3 +20,7 @@ diff -r c1fab96507ef a @@ -1,1 +1,1 @@ -foo +barber +M a +? dir/a +dir: Permission denied +M a