added preferred-content log, and allow editing it with vicfg
This includes a full parser for the boolean expressions in the log, that compiles them into Matchers. Those matchers are not used yet. A complication is that matching against an expression should never crash git-annex with an error. Instead, vicfg checks that the expressions parse. If a bad expression (or an expression understood by some future git-annex version) gets into the log, it'll be ignored. Most of the code in Limit couldn't fail anyway, but I did have to make limitCopies check its parameter first, and return an error if it's bad, rather than erroring at runtime.
This commit is contained in:
parent
c809f3d486
commit
bc649a35ba
9 changed files with 193 additions and 33 deletions
|
@ -19,6 +19,7 @@ module Utility.Matcher (
|
|||
Token(..),
|
||||
Matcher,
|
||||
token,
|
||||
tokens,
|
||||
generate,
|
||||
match,
|
||||
matchM,
|
||||
|
@ -48,6 +49,9 @@ token "(" = Open
|
|||
token ")" = Close
|
||||
token t = error $ "unknown token " ++ t
|
||||
|
||||
tokens :: [String]
|
||||
tokens = words "and or not ( )"
|
||||
|
||||
{- Converts a list of Tokens into a Matcher. -}
|
||||
generate :: [Token op] -> Matcher op
|
||||
generate = go MAny
|
||||
|
|
|
@ -42,11 +42,15 @@ firstLine = takeWhile (/= '\n')
|
|||
{- Splits a list into segments that are delimited by items matching
|
||||
- a predicate. (The delimiters are not included in the segments.) -}
|
||||
segment :: (a -> Bool) -> [a] -> [[a]]
|
||||
segment p l = map reverse $ go [] [] l
|
||||
segment p = filter (not . all p) . segmentDelim p
|
||||
|
||||
{- Includes the delimiters as segments of their own. -}
|
||||
segmentDelim :: (a -> Bool) -> [a] -> [[a]]
|
||||
segmentDelim p l = map reverse $ go [] [] l
|
||||
where
|
||||
go c r [] = reverse $ c:r
|
||||
go c r (i:is)
|
||||
| p i = go [] (c:r) is
|
||||
| p i = go [] ([i]:c:r) is
|
||||
| otherwise = go (i:c) r is
|
||||
|
||||
{- Given two orderings, returns the second if the first is EQ and returns
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue