diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -1359,6 +1359,7 @@ mexact = match.exact dirignore = self._dirignore checkexec = self._checkexec + checklink = self._checklink copymap = self._map.copymap lastnormaltime = self._lastnormaltime @@ -1391,7 +1392,17 @@ elif t.removed: radd(fn) elif t.tracked: - if ( + if not checklink and t.has_fallback_symlink: + # If the file system does not support symlink, the mode + # might not be correctly stored in the dirstate, so do not + # trust it. + ladd(fn) + elif not checkexec and t.has_fallback_exec: + # If the file system does not support exec bits, the mode + # might not be correctly stored in the dirstate, so do not + # trust it. + ladd(fn) + elif ( size >= 0 and ( (size != st.st_size and size != st.st_size & _rangemask) diff --git a/mercurial/helptext/internals/dirstate-v2.txt b/mercurial/helptext/internals/dirstate-v2.txt --- a/mercurial/helptext/internals/dirstate-v2.txt +++ b/mercurial/helptext/internals/dirstate-v2.txt @@ -523,12 +523,18 @@ this indicates whether the file’s own is expected to have execute permission. + Beware that on system without fs support for this information, the value + stored in the dirstate might be wrong and should not be relied on. + `MODE_IS_SYMLINK` Must be unset if `HAS_MODE_AND_SIZE` is unset. If `HAS_MODE_AND_SIZE` is set, this indicates whether the file is expected to be a symlink as opposed to a normal file. + Beware that on system without fs support for this information, the value + stored in the dirstate might be wrong and should not be relied on. + `EXPECTED_STATE_IS_MODIFIED` Must be unset for untracked nodes. For: