diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1003,8 +1003,15 @@ class localrepository(repo.repository): fixup = [] # do a full compare of any files that might have changed ctx = self.changectx() + mexec = lambda f: 'x' in ctx.fileflags(f) + mlink = lambda f: 'l' in ctx.fileflags(f) + is_exec = util.execfunc(self.root, mexec) + is_link = util.linkfunc(self.root, mlink) + def flags(f): + return is_link(f) and 'l' or is_exec(f) and 'x' or '' for f in lookup: - if f not in ctx or ctx[f].cmp(self.wread(f)): + if (f not in ctx or flags(f) != ctx.fileflags(f) + or ctx[f].cmp(self.wread(f))): modified.append(f) else: fixup.append(f) diff --git a/tests/test-execute-bit b/tests/test-execute-bit --- a/tests/test-execute-bit +++ b/tests/test-execute-bit @@ -4,12 +4,18 @@ hg init echo a > a -hg ci -d'0 0' -Am'not executable' +hg ci -Am'not executable' chmod +x a -hg ci -d'1 0' -m'executable' +hg ci -m'executable' hg id +echo '% make sure we notice the change of mode if the cached size == -1' +hg rm a +hg revert -r 0 a +hg debugstate +hg st + hg up 0 hg id test -x a && echo executable -- eek || echo not executable -- whew diff --git a/tests/test-execute-bit.out b/tests/test-execute-bit.out --- a/tests/test-execute-bit.out +++ b/tests/test-execute-bit.out @@ -1,5 +1,8 @@ adding a -1549299e88d1 tip +79abf14474dc tip +% make sure we notice the change of mode if the cached size == -1 +n 0 -1 unset a +M a 0 files updated, 0 files merged, 0 files removed, 0 files unresolved d69afc33ff8a not executable -- whew