summaryrefslogtreecommitdiff
path: root/src/Job
diff options
context:
space:
mode:
Diffstat (limited to 'src/Job')
-rw-r--r--src/Job/Types.hs57
1 files changed, 44 insertions, 13 deletions
diff --git a/src/Job/Types.hs b/src/Job/Types.hs
index 0447615..ad575a1 100644
--- a/src/Job/Types.hs
+++ b/src/Job/Types.hs
@@ -1,5 +1,6 @@
module Job.Types where
+import Data.Kind
import Data.Text (Text)
import Data.Text qualified as T
@@ -13,9 +14,9 @@ data Declared
data Evaluated
data Job' d = Job
- { jobName :: JobName
- , jobContainingCheckout :: [ JobCheckout ]
- , jobOtherCheckout :: [ ( JobRepo d, Maybe Text, JobCheckout ) ]
+ { jobId :: JobId' d
+ , jobName :: JobName
+ , jobCheckout :: [ JobCheckout d ]
, jobRecipe :: [ CreateProcess ]
, jobArtifacts :: [ ( ArtifactName, Pattern ) ]
, jobUses :: [ ( JobName, ArtifactName ) ]
@@ -24,6 +25,10 @@ data Job' d = Job
type Job = Job' Evaluated
type DeclaredJob = Job' Declared
+type family JobId' d :: Type where
+ JobId' Declared = JobName
+ JobId' Evaluated = JobId
+
data JobName = JobName Text
deriving (Eq, Ord, Show)
@@ -34,12 +39,13 @@ textJobName :: JobName -> Text
textJobName (JobName name) = name
-data JobRepo d where
- DeclaredJobRepo :: RepoName -> JobRepo Declared
- EvaluatedJobRepo :: Repo -> JobRepo Evaluated
+type family JobRepo d :: Type where
+ JobRepo Declared = Maybe ( RepoName, Maybe Text )
+ JobRepo Evaluated = Tree
-data JobCheckout = JobCheckout
- { jcSubtree :: Maybe FilePath
+data JobCheckout d = JobCheckout
+ { jcRepo :: JobRepo d
+ , jcSubtree :: Maybe FilePath
, jcDestination :: Maybe FilePath
}
@@ -49,13 +55,18 @@ data ArtifactName = ArtifactName Text
data JobSet' d = JobSet
- { jobsetCommit :: Maybe Commit
+ { jobsetId :: JobSetId' d
+ , jobsetCommit :: Maybe Commit
, jobsetJobsEither :: Either String [ Job' d ]
}
type JobSet = JobSet' Evaluated
type DeclaredJobSet = JobSet' Declared
+type family JobSetId' d :: Type where
+ JobSetId' Declared = ()
+ JobSetId' Evaluated = JobSetId
+
jobsetJobs :: JobSet -> [ Job ]
jobsetJobs = either (const []) id . jobsetJobsEither
@@ -63,10 +74,13 @@ jobsetJobs = either (const []) id . jobsetJobsEither
newtype JobId = JobId [ JobIdPart ]
deriving (Eq, Ord)
+newtype JobSetId = JobSetId [ JobIdPart ]
+ deriving (Eq, Ord)
+
data JobIdPart
= JobIdName JobName
- | JobIdCommit CommitId
- | JobIdTree TreeId
+ | JobIdCommit (Maybe RepoName) CommitId
+ | JobIdTree (Maybe RepoName) FilePath TreeId
deriving (Eq, Ord)
newtype JobRef = JobRef [ Text ]
@@ -75,5 +89,22 @@ newtype JobRef = JobRef [ Text ]
textJobIdPart :: JobIdPart -> Text
textJobIdPart = \case
JobIdName name -> textJobName name
- JobIdCommit cid -> textCommitId cid
- JobIdTree tid -> textTreeId tid
+ JobIdCommit _ cid -> textCommitId cid
+ JobIdTree _ _ tid -> textTreeId tid
+
+textJobId :: JobId -> Text
+textJobId (JobId ids) = T.intercalate "." $ map textJobIdPart ids
+
+parseJobRef :: Text -> JobRef
+parseJobRef = JobRef . go 0 ""
+ where
+ go :: Int -> Text -> Text -> [ Text ]
+ go plevel cur s = do
+ let bchars | plevel > 0 = [ '(', ')' ]
+ | otherwise = [ '.', '(', ')' ]
+ 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 ]