From: Ken Brown <kbrown@cornell.edu>
To: emacs-devel@gnu.org, Paul Eggert <eggert@cs.ucla.edu>
Cc: John Wiegley <jwiegley@gmail.com>, Eli Zaretskii <eliz@gnu.org>
Subject: Re: [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441)
Date: Mon, 14 Nov 2016 16:03:00 -0500 [thread overview]
Message-ID: <cffa80a5-16eb-fa10-ad15-6bdfadf0e7d0@cornell.edu> (raw)
In-Reply-To: <20161114170952.6729A220179@vcs.savannah.gnu.org>
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
> -@var{filename} is on a case-insensitive filesystem. It always returns
> -@code{t} 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.
> +@var{filename} 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
next parent reply other threads:[~2016-11-14 21:03 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20161114170952.20595.32286@vcs.savannah.gnu.org>
[not found] ` <20161114170952.6729A220179@vcs.savannah.gnu.org>
2016-11-14 21:03 ` Ken Brown [this message]
2016-11-14 21:53 ` [Emacs-diffs] master 2f5e0b1: Improve case-insensitive checks (Bug#24441) John Wiegley
2016-11-14 19:30 Eli Zaretskii
2016-11-14 20:22 ` Ken Brown
2016-11-14 20:43 ` Eli Zaretskii
2016-11-14 20:54 ` Paul Eggert
2016-11-14 21:07 ` Ken Brown
2016-11-14 22:33 ` Ken Brown
2016-11-15 16:07 ` Eli Zaretskii
2016-11-15 19:15 ` Ken Brown
2016-11-15 20:26 ` Eli Zaretskii
2016-11-19 19:29 ` Philipp Stephani
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cffa80a5-16eb-fa10-ad15-6bdfadf0e7d0@cornell.edu \
--to=kbrown@cornell.edu \
--cc=eggert@cs.ucla.edu \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=jwiegley@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).