On Wed, 19 Apr 2017 05:14:34 +0200 Michał Górny <[email protected]> wrote:
> >> > @@ -243,4 +240,27 @@ _cdrom_locate_file_on_cd() {
> >> > done
> >> > }
> >> >
> >> > +# @FUNCTION: _cdrom_glob_match
> >> > +# @USAGE: <root directory> <path>
> >> > +# @INTERNAL
> >> > +# @DESCRIPTION:
> >> > +# Locates the given path ($2) within the given root directory ($1)
> >> > +# case-insensitively and returns the first actual matching path.
> >This
> >> > +# eclass previously used "find -iname" but it only checked the
> >file
> >> > +# case-insensitively and not the directories. There is "find
> >-ipath" but
> >> > +# this does not intelligently skip non-matching paths, making it
> >> > +# slow. Case-insensitive matching can only be applied to patterns
> >so
> >> > +# extended globbing is used to turn regular strings into patterns.
> >All
> >> > +# special characters are escaped so don't worry about breaking
> >this. The
> >> > +# first person to make this work without an eval wins a cookie.
> >> > +_cdrom_glob_match() {
> >> > + local p=\?\($(sed -e 's:[^A-Za-z0-9/]:\\\0:g' -e 's:/:)/?(:g'
> >> > <<<
> >"$2" || die)\)
> >>
> >> Explanatory comment needed, i.e. what gets converted into what, and
> >why.
> >
> >I'll add this:
> >
> ># The following line turns this:
> ># foo*foo/bar bar/baz/file.zip
> >#
> ># Into this:
> ># ?(foo\*foo)/?(bar\ bar)/?(baz)/?(file\.zip)
> >#
> ># This turns every path component into an escaped extended glob
> ># pattern to allow case-insensitive matching. Globs cannot span
> ># directories so each component becomes an individual pattern.
>
> Why do you escape pattern chars? Wasn't the variable supposed to be a
> pattern in the first place?
If you mean in the eclass before I changed it then no. In the non
CD_ROOT case, the basename was passed to "find -iname" but this was not
documented. In the CD_ROOT case, the whole thing was passed to
[[ -e ]] so patterns wouldn't have worked here.
You wouldn't want to use a pattern anyway as you're trying to uniquely
identify the disc using a very specific filename. Conversely, I relaxed
case-sensitivity because this can vary depending on whether we're
dealing with the original disc, a copy of some kind, or an existing
installation that may come from Windows.
The Curse of Monkey Island turned out to be a great example. Both discs
have some files in common like COMI.LA0, however, when mounted with the
default options, it appears upper-cased on the first disc but
lower-cased on the second. Why? The second disc doesn't use Joliet as
all the filenames have the old 8.3 format. Linux normalises these to
lower-case. The first disc does use Joliet because of a single file,
"Curse of Monkey Island - Manual.pdf" so all the other 8.3 filename are
left as upper-case by Linux.
--
James Le Cuirot (chewi)
Gentoo Linux Developer
pgpeNIjKYyVV0.pgp
Description: OpenPGP digital signature
