[PATCH STABLE] largefiles: avoid exec-bit examination on the platform being unaware of it

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Mon Nov 24 14:21:30 UTC 2014


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1416838654 -32400
#      Mon Nov 24 23:17:34 2014 +0900
# Branch stable
# Node ID d47e371f9abe39460340b77738b672001841b054
# Parent  cc0ff93d0c0c29526465a1d07b9eddf5b2da51dd
largefiles: avoid exec-bit examination on the platform being unaware of it

Changeset 24600c9d7f4e introduced the examination of exec bit of
largefiles in "hg status --rev REV" case, but it doesn't avoid it on
the platform being unaware of exec-bit (e.g. on NTFS of Windows).

To avoid leak of internal implementation of "dirstate" class, this
patch uses "util.checkexec" instead of "dirstate._checkexec", even
though the former costs (a little) more than the latter when the
latter is already cached. This kind of information may have to be
cached at VFS layer in the future.

diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
--- a/hgext/largefiles/reposetup.py
+++ b/hgext/largefiles/reposetup.py
@@ -170,6 +170,7 @@ def reposetup(ui, repo):
                     else:
                         tocheck = unsure + modified + added + clean
                         modified, added, clean = [], [], []
+                        checkexec = util.checkexec(self.root)
 
                         for lfile in tocheck:
                             standin = lfutil.standin(lfile)
@@ -177,7 +178,8 @@ def reposetup(ui, repo):
                                 abslfile = self.wjoin(lfile)
                                 if ((ctx1[standin].data().strip() !=
                                      lfutil.hashfile(abslfile)) or
-                                    (('x' in ctx1.flags(standin)) !=
+                                    (checkexec and
+                                     ('x' in ctx1.flags(standin)) !=
                                      bool(lfutil.getexecutable(abslfile)))):
                                     modified.append(lfile)
                                 elif listclean:
diff --git a/tests/test-largefiles-update.t b/tests/test-largefiles-update.t
--- a/tests/test-largefiles-update.t
+++ b/tests/test-largefiles-update.t
@@ -577,6 +577,31 @@ the working context)
   $ hg status -A --rev '.^1' large2
   M large2
 
+#else
+
+Test that "hg status" against revisions other than parent ignores exec
+bit correctly on the platform being unaware of it.
+
+  $ hg update -q -C 4
+
+  $ cat > exec-bit.patch <<EOF
+  > # HG changeset patch
+  > # User test
+  > # Date 0 0
+  > #      Thu Jan 01 00:00:00 1970 +0000
+  > # Node ID be1b433a65b12b27b5519d92213e14f7e1769b90
+  > # Parent  07d6153b5c04313efb75deec9ba577de7faeb727
+  > chmod +x large2
+  > 
+  > diff --git a/.hglf/large2 b/.hglf/large2
+  > old mode 100644
+  > new mode 100755
+  > EOF
+  $ hg import --exact --bypass exec-bit.patch
+  applying exec-bit.patch
+  $ hg status -A --rev tip large2
+  C large2
+
 #endif
 
   $ cd ..


More information about the Mercurial-devel mailing list