(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
+git-annex (10.20221213) UNRELEASED; urgency=medium
+
+ * Change --metadata comparisons < > <= and >= to fall back to
+ lexicographical comparisons when one or both values being compared
+ are not numbers.
+
+ -- Joey Hess <id@joeyh.name> Mon, 12 Dec 2022 13:04:54 -0400
+
git-annex (10.20221212) upstream; urgency=medium
* Fix a hang that occasionally occurred during commands such as move,
matches the glob. The values of metadata fields are matched case
insensitively.
-* `--metadata field<number` / `--metadata field>number`
-* `--metadata field<=number` / `--metadata field>=number`
+* `--metadata field<value` / `--metadata field>value`
+* `--metadata field<=value` / `--metadata field>=value`
- Matches only when there is a metadata field attached with a value that
- is a number and is less than or greater than the specified number.
+ Matches only when there is a metadata field attached with a value
+ that is less then or greater than the specified value, respectively.
+
+ When both values are numbers, the comparison is done numerically.
+ When one value is not a number, the values are instead compared
+ lexicographically.
(Note that you will need to quote the second parameter to avoid
the shell doing redirection.)
```
Yann / @nobodyinperson
+
+> [[fixed|done]] --[[Joey]]