From cc9a4c34e2fdf7555c03e98f3d038b43ba12ddc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sat, 24 Oct 2026 14:38:16 +0200 Subject: =?UTF-8?q?Accept=20range=20as=20=E2=80=98watch=E2=80=99=20argumen?= =?UTF-8?q?t=20within=20range=20expressions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Expression.hs | 44 ++++++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 14 deletions(-) (limited to 'src/Expression.hs') diff --git a/src/Expression.hs b/src/Expression.hs index 2bd33de..4ff7ddd 100644 --- a/src/Expression.hs +++ b/src/Expression.hs @@ -59,6 +59,12 @@ data RevisionExpression' d type RevisionExpression = RevisionExpression' Evaluated type DeclaredRevisionExpression = RevisionExpression' Declared +watchedRevision :: DeclaredRevisionExpression -> DeclaredRevisionExpression +watchedRevision = \case + StaticRef r -> WatchedRef r + WatchedRef r -> WatchedRef r + ModifiedRevision m r -> ModifiedRevision m (watchedRevision r) + data RangeExpression' d = SingleRevisionExpression (RevisionExpression' d) @@ -67,6 +73,11 @@ data RangeExpression' d type RangeExpression = RangeExpression' Evaluated type DeclaredRangeExpression = RangeExpression' Declared +watchedRange :: DeclaredRangeExpression -> DeclaredRangeExpression +watchedRange = \case + SingleRevisionExpression rev -> SingleRevisionExpression (watchedRevision rev) + RangeExpression r1 r2 -> RangeExpression (watchedRevision r1) (watchedRevision r2) + data CommitRef = CommitRef Text {- suffix -} CommitId deriving (Eq) @@ -168,43 +179,48 @@ parseRangeExpression = bimap errorBundlePretty id . runParser parser "" where parser :: ExprParser DeclaredRangeExpression parser = do - rev1 <- parseRevision - expr <- choice + range <- parseRange + eof + return range + + parseRange :: ExprParser DeclaredRangeExpression + parseRange = do + range <- parseRevision + choice [ do + SingleRevisionExpression rev1 <- return range _ <- string ".." - rev2 <- parseRevision + SingleRevisionExpression rev2 <- parseRevision return $ RangeExpression rev2 rev1 , do - return $ SingleRevisionExpression rev1 + return range ] - eof - return expr - - parseRevision :: ExprParser DeclaredRevisionExpression + parseRevision :: ExprParser DeclaredRangeExpression parseRevision = do tok <- fmap T.concat $ some $ choice [ takeWhile1P Nothing (\x -> isAlphaNum x || x `elem` [ '_', '-', '/' ]) , try $ string "." <* notFollowedBy (char '.') ] - rev <- choice + range <- choice [ do _ <- char '(' - arg <- takeWhileP Nothing (\x -> isAlphaNum x || x `elem` [ '_', '-', '/', '.' ]) + arg <- parseRange _ <- char ')' case tok of - "watch" -> return $ WatchedRef arg + "watch" -> return $ watchedRange arg _ -> unexpected $ Tokens $ NE.fromList $ chunkToTokens @Text Proxy tok , do - return $ StaticRef tok + return $ SingleRevisionExpression $ StaticRef tok ] choice [ do + SingleRevisionExpression rev <- return range suffix <- takeWhile1P Nothing (\x -> isNumber x || x `elem` [ '~', '^', '@', '{', '}' ]) - return $ ModifiedRevision suffix rev + return $ SingleRevisionExpression $ ModifiedRevision suffix rev , do - return rev + return range ] -- cgit v1.2.3