diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-09-11 21:20:46 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-09-13 15:05:42 +0200 |
| commit | a589e61c2b807196696632eb17e8ad573daa9c08 (patch) | |
| tree | 254b6eb0c5a31de0cc94380ebdc00489ba54d010 /src/Job/Types.hs | |
| parent | 73a141316db78b942160b11bdb3c92208f3eddd6 (diff) | |
Use colon as preferred job ID separator
Changelog: Colon `:` is now accepted and preferred as job ID separator.
Diffstat (limited to 'src/Job/Types.hs')
| -rw-r--r-- | src/Job/Types.hs | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/Job/Types.hs b/src/Job/Types.hs index 50f550d..c7a859d 100644 --- a/src/Job/Types.hs +++ b/src/Job/Types.hs @@ -135,21 +135,37 @@ textJobIdPart = \case JobIdRepo _ (JobIdTag cid tid) -> textCommitId cid <> "^" <> textTagId tid textJobId :: JobId -> Text -textJobId (JobId ids) = T.intercalate "." $ map textJobIdPart ids +textJobId (JobId ids) = T.intercalate ":" $ map textJobIdPart ids parseJobRef :: Text -> JobRef -parseJobRef = JobRef . go 0 "" +parseJobRef = JobRef . parseJobRefParts + +parseJobRefParts :: Text -> [ Text ] +parseJobRefParts = go [ ':', '.' ] 0 False "" where - go :: Int -> Text -> Text -> [ Text ] - go plevel cur s = do + go :: [ Char ] -> Int -> Bool -> Text -> Text -> [ Text ] + go seps plevel pdrop cur s = do let bchars | plevel > 0 = [ '(', ')' ] - | otherwise = [ '.', '(', ')' ] + | otherwise = seps ++ [ '(', ')' ] let ( part, rest ) = T.break (`elem` bchars) s case T.uncons rest of - Just ( '.', rest' ) -> (cur <> part) : go plevel "" rest' - Just ( '(', rest' ) -> go (plevel + 1) (cur <> part) rest' - Just ( ')', rest' ) -> go (plevel - 1) (cur <> part) rest' - _ -> [ cur <> part ] + Just ( '.', rest' ) + | Just ( '.', rest'' ) <- T.uncons rest' + -> go seps plevel pdrop (cur <> part <> "..") rest'' + Just ( sep, rest' ) + | sep `elem` seps + -> (cur <> part) : go [ sep ] plevel pdrop "" rest' + Just ( '(', rest' ) + | T.null cur && T.null part + -> go seps (plevel + 1) True (cur <> part) rest' + | otherwise + -> go seps (plevel + 1) pdrop (cur <> part <> "(") rest' + Just ( ')', rest' ) + | T.null rest' && pdrop + -> go seps (plevel - 1) False (cur <> part) rest' + | otherwise + -> go seps (plevel - 1) pdrop (cur <> part <> ")") rest' + _ -> [ cur <> part ] lastJobNameId :: JobId -> Maybe JobName lastJobNameId (JobId ids) = go Nothing ids |