[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#2
From: |
Ken Brown |
Subject: |
Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441) |
Date: |
Mon, 14 Nov 2016 16:03:00 -0500 |
User-agent: |
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 |
On 11/14/2016 12:09 PM, Paul Eggert wrote:
--- a/doc/lispref/files.texi
+++ b/doc/lispref/files.texi
@@ -1144,17 +1144,9 @@ return value is unspecified.
Sometimes file names or their parts need to be compared as strings, in
which case it's important to know whether the underlying filesystem is
case-insensitive. This function returns @code{t} if file
address@hidden is on a case-insensitive filesystem. It always returns
address@hidden on MS-DOS and MS-Windows. On Cygwin and Mac OS X,
-filesystems may or may not be case-insensitive, and the function tries
-to determine case-sensitivity by a runtime test. If the test is
-inconclusive, the function returns @code{t} on Cygwin and @code{nil}
-on Mac OS X.
-
-Currently this function always returns @code{nil} on platforms other
-than MS-DOS, MS-Windows, Cygwin, and Mac OS X. It does not detect
-case-insensitivity of mounted filesystems, such as Samba shares or
-NFS-mounted Windows volumes.
address@hidden is on a case-insensitive filesystem. On platforms where
+this information is not available, this function guesses based on
+common practice.
I like my more verbose version better. Users who don't know what common
practice is might find the platform-specific information useful. For
example, I'll bet there are many Cygwin users who don't know that Cygwin
can be figured to be case-sensitive. And I wouldn't be surprised (based
on bugs 24441 and 22300) if there are OS X users who don't know that OS
X volumes can be configured to be case-insensitive.
-/* Filesystems are case-sensitive on all supported systems except
- MS-Windows, MS-DOS, Cygwin, and Mac OS X. They are always
- case-insensitive on the first two, but they may or may not be
- case-insensitive on Cygwin and OS X. The following function
- attempts to provide a runtime test on those two systems. If the
- test is not conclusive, we assume case-insensitivity on Cygwin and
- case-sensitivity on Mac OS X.
+/* Return true if FILENAME is on a case-insensitive file system.
+ Use a runtime test if available. Otherwise, assume the file system
+ is case-insensitive on Microsoft-based platforms and case-sensitive
+ elsewhere.
Once again, I would rather keep the platform-specific information.
-#elif defined CYGWIN
-/* As of Cygwin-2.6.1, pathconf supports _PC_CASE_INSENSITIVE. */
-# ifdef _PC_CASE_INSENSITIVE
+#ifdef _PC_CASE_INSENSITIVE
I have no problem with the removal of "#elif defined CYGWIN", but AFAIK
Cygwin (as of version 2.6.1) is the only platform that defines
_PC_CASE_INSENSITIVE. So I think the comment should be retained in some
form, for clarity.
int res = pathconf (filename, _PC_CASE_INSENSITIVE);
- if (res < 0)
- return 1;
- return res > 0;
-# else
- return 1;
+ if (0 < res)
+ return true;
+ if (res == 0 || errno != EINVAL)
+ return false;
What's the rationale for returning false on an error? The only relevant
platform here is Cygwin, so we should just fall through to the "#if
defined CYGWIN || defined DOS_NT" if there's an error.
+#elif defined _PC_CASE_SENSITIVE
Here AFAIK Darwin is the only platform that defines _PC_CASE_SENSITIVE,
so there should be a comment to that effect. Otherwise readers may not
even know that we're now treating the Darwin case.
+ int res = pathconf (filename, _PC_CASE_SENSITIVE);
+ if (res == 0)
+ return true;
+ if (0 < res || errno != EINVAL)
+ return false;
Again, what's the rationale for returning false on error? Why not just
fall through (which happens to have the same effect)?
+#ifdef DARWIN_OS
+ /* It is not clear whether this section is needed. For now, rely on
+ pathconf and skip this section. If pathconf does not work,
+ please recompile Emacs with -DDARWIN_OS_CASE_SENSITIVE_FIXME=1 or
+ -DDARWIN_OS_CASE_SENSITIVE_FIXME=2, and file a bug report saying
+ whether this fixed your problem. */
+# ifndef DARWIN_OS_CASE_SENSITIVE_FIXME
+ int DARWIN_OS_CASE_SENSITIVE_FIXME = 0;
# endif
-#elif defined DARWIN_OS
- /* The following is based on
- http://lists.apple.com/archives/darwin-dev/2007/Apr/msg00010.html. */
- struct attrlist alist;
- unsigned char buffer[sizeof (vol_capabilities_attr_t) + sizeof (size_t)];
-
- memset (&alist, 0, sizeof (alist));
- alist.volattr = ATTR_VOL_CAPABILITIES;
- if (getattrlist (filename, &alist, buffer, sizeof (buffer), 0)
- || !(alist.volattr & ATTR_VOL_CAPABILITIES))
- return 0;
- vol_capabilities_attr_t *vcaps = buffer;
- return !(vcaps->capabilities[0] & VOL_CAP_FMT_CASE_SENSITIVE);
+
+ if (DARWIN_OS_CASE_SENSITIVE_FIXME == 1)
+ {
+ /* This is based on developer.apple.com's getattrlist man page. */
+ struct attrlist alist = {.volattr = ATTR_VOL_CAPABILITIES};
+ struct vol_capabilities_attr_t vcaps;
+ if (getattrlist (filename, &alist, &vcaps, sizeof vcaps, 0) == 0)
+ {
+ if (vcaps.valid[VOL_CAPABILITIES_FORMAT] & VOL_CAP_FMT_CASE_SENSITIVE)
+ return ! (vcaps.capabilities[VOL_CAPABILITIES_FORMAT]
+ & VOL_CAP_FMT_CASE_SENSITIVE);
+ }
+ else if (errno != EINVAL)
+ return false;
+ }
+ else if (DARWIN_OS_CASE_SENSITIVE_FIXME == 2)
+ {
+ /* The following is based on
+ http://lists.apple.com/archives/darwin-dev/2007/Apr/msg00010.html. */
+ struct attrlist alist;
+ unsigned char buffer[sizeof (vol_capabilities_attr_t) + sizeof (size_t)];
+
+ memset (&alist, 0, sizeof (alist));
+ alist.volattr = ATTR_VOL_CAPABILITIES;
+ if (getattrlist (filename, &alist, buffer, sizeof (buffer), 0)
+ || !(alist.volattr & ATTR_VOL_CAPABILITIES))
+ return 0;
+ vol_capabilities_attr_t *vcaps = buffer;
+ return !(vcaps->capabilities[0] & VOL_CAP_FMT_CASE_SENSITIVE);
+ }
+#endif
I have no opinion on this hunk. I'd like to see some OS X experts chime
in. I've added John to the CC.
- if ((!(file_name_case_insensitive_p (SSDATA (encoded_file)))
+ if ((! file_name_case_insensitive_p (SSDATA (encoded_file))
I think you just wanted to add a space after !, but you also removed a
parenthesis at the end of the line. (But this doesn't matter any more,
since Eli already reverted the commit.)
Ken
- [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Eli Zaretskii, 2016/11/14
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Ken Brown, 2016/11/14
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Eli Zaretskii, 2016/11/14
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Paul Eggert, 2016/11/14
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Ken Brown, 2016/11/14
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Ken Brown, 2016/11/14
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Eli Zaretskii, 2016/11/15
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Ken Brown, 2016/11/15
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Eli Zaretskii, 2016/11/15
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441), Philipp Stephani, 2016/11/19
- Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441),
Ken Brown <=