--metadata lexicographical comparisons

Change --metadata comparisons < > <= and >= to fall back to lexicographical
comparisons when one or both values being compared are not numbers.

Sponsored-by: Erik Bjäreholt on Patreon
This commit is contained in:
Joey Hess 2022-12-12 13:33:24 -04:00
parent 69499b4452
commit aa6919737c
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 27 additions and 11 deletions

View file

@ -104,15 +104,17 @@ parseMetaDataMatcher p = (,)
(f, op_v) = break (`elem` "=<>") p
matcher = case op_v of
('=':v) -> checkglob v
('<':'=':v) -> checkcmp (<=) v
('<':v) -> checkcmp (<) v
('>':'=':v) -> checkcmp (>=) v
('>':v) -> checkcmp (>) v
('<':'=':v) -> checkcmp (<=) (<=) v
('<':v) -> checkcmp (<) (<) v
('>':'=':v) -> checkcmp (>=) (>=) v
('>':v) -> checkcmp (>) (>) v
_ -> checkglob ""
checkglob v =
let cglob = compileGlob v CaseInsensative (GlobFilePath False)
in matchGlob cglob . decodeBS . fromMetaValue
checkcmp cmp v v' = case (doubleval v, doubleval (decodeBS (fromMetaValue v'))) of
(Just d, Just d') -> d' `cmp` d
_ -> False
checkcmp cmp cmp' v mv' =
let v' = decodeBS (fromMetaValue mv')
in case (doubleval v, doubleval v') of
(Just d, Just d') -> d' `cmp` d
_ -> v' `cmp'` v
doubleval v = readish v :: Maybe Double