On Wed, 19 Apr 2017 05:14:34 +0200 Michał Górny wrote: > >> > @@ -243,4 +240,27 @@ _cdrom_locate_file_on_cd() { > >> > done > >> > } > >> > > >> > +# @FUNCTION: _cdrom_glob_match > >> > +# @USAGE: > >> > +# @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