summaryrefslogtreecommitdiff
path: root/src/Job
diff options
context:
space:
mode:
authorRoman Smrž <roman.smrz@seznam.cz>2026-09-11 21:20:46 +0200
committerRoman Smrž <roman.smrz@seznam.cz>2026-09-13 15:05:42 +0200
commita589e61c2b807196696632eb17e8ad573daa9c08 (patch)
tree254b6eb0c5a31de0cc94380ebdc00489ba54d010 /src/Job
parent73a141316db78b942160b11bdb3c92208f3eddd6 (diff)
Use colon as preferred job ID separator
Changelog: Colon `:` is now accepted and preferred as job ID separator.
Diffstat (limited to 'src/Job')
-rw-r--r--src/Job/Types.hs34
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