diff --git a/mercurial/posix.py b/mercurial/posix.py --- a/mercurial/posix.py +++ b/mercurial/posix.py @@ -181,7 +181,22 @@ def checkexec(path): try: EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH - cachedir = os.path.join(path, '.hg', 'cache') + basedir = os.path.join(path, '.hg') + cachedir = os.path.join(basedir, 'cache') + storedir = os.path.join(basedir, 'store') + if not os.path.exists(cachedir): + try: + # we want to create the 'cache' directory, not the '.hg' one. + # Automatically creating '.hg' directory could silently spawn + # invalid Mercurial repositories. That seems like a bad idea. + os.mkdir(cachedir) + if os.path.exists(storedir): + copymode(storedir, cachedir) + else: + copymode(basedir, cachedir) + except (IOError, OSError): + # we other fallback logic triggers + pass if os.path.isdir(cachedir): checkisexec = os.path.join(cachedir, 'checkisexec') checknoexec = os.path.join(cachedir, 'checknoexec') diff --git a/tests/test-fncache.t b/tests/test-fncache.t --- a/tests/test-fncache.t +++ b/tests/test-fncache.t @@ -88,6 +88,9 @@ Non store repo: .hg/00manifest.i .hg/cache .hg/cache/branch2-served + .hg/cache/checkisexec + .hg/cache/checklink + .hg/cache/checklink-target .hg/cache/manifestfulltextcache (reporevlogstore !) .hg/cache/rbc-names-v1 .hg/cache/rbc-revs-v1 @@ -122,6 +125,9 @@ Non fncache repo: .hg/00changelog.i .hg/cache .hg/cache/branch2-served + .hg/cache/checkisexec + .hg/cache/checklink + .hg/cache/checklink-target .hg/cache/manifestfulltextcache (reporevlogstore !) .hg/cache/rbc-names-v1 .hg/cache/rbc-revs-v1 diff --git a/tests/test-inherit-mode.t b/tests/test-inherit-mode.t --- a/tests/test-inherit-mode.t +++ b/tests/test-inherit-mode.t @@ -69,6 +69,9 @@ new directories are setgid 00600 ./.hg/00changelog.i 00770 ./.hg/cache/ 00660 ./.hg/cache/branch2-served + 00711 ./.hg/cache/checkisexec + 00777 ./.hg/cache/checklink + 00600 ./.hg/cache/checklink-target 00660 ./.hg/cache/manifestfulltextcache (reporevlogstore !) 00660 ./.hg/cache/rbc-names-v1 00660 ./.hg/cache/rbc-revs-v1 diff --git a/tests/test-share.t b/tests/test-share.t --- a/tests/test-share.t +++ b/tests/test-share.t @@ -22,16 +22,21 @@ share shouldn't have a store dir $ test -d .hg/store [1] -share shouldn't have a cache dir, original repo should +share shouldn't have a full cache dir, original repo should $ hg branches default 0:d3873e73d99e $ hg tags tip 0:d3873e73d99e - $ test -d .hg/cache - [1] + $ ls -1 .hg/cache + checkisexec + checklink + checklink-target $ ls -1 ../repo1/.hg/cache branch2-served + checkisexec + checklink + checklink-target manifestfulltextcache (reporevlogstore !) rbc-names-v1 rbc-revs-v1