(.module: [lux #* [abstract [monad (#+ do)]] [control [pipe (#+ do>)] ["." try (#+ Try)] [concurrency ["." promise (#+ Promise) ("#\." monad)]] ["<>" parser ["<.>" xml]]] [data [binary (#+ Binary)] [text ["%" format (#+ format)] ["." encoding]] [collection ["." set]] [format ["." binary] ["." tar] ["." xml]]] [time ["." instant (#+ Instant)]] [world ["." file] ["." console (#+ Console)]]] [program [compositor ["." export]]] ["." // #_ ["#." clean] ["/#" // #_ [command (#+ Command)] ["/" profile] ["#." action (#+ Action)] ["#." pom] ["#." hash] ["#." repository (#+ Repository) [identity (#+ Identity)]] ["#." metadata ["#/." artifact] ["#/." snapshot]] ["#." artifact (#+ Artifact) ["#/." extension (#+ Extension)] ["#/." type]]]]) (def: epoch Instant (instant.from_millis +0)) (template [ ] [(def: ( repository artifact) (-> (Repository Promise) Artifact (Promise (Try ))) (do promise.monad [project (\ repository download ( artifact))] (case project (#try.Success project) (wrap (|> project (do> try.monad [(\ encoding.utf8 decode)] [(\ xml.codec decode)] [(.run )]))) (#try.Failure error) (wrap (#try.Success )))))] [read_project_metadata ///metadata/artifact.Metadata ///metadata.project ///metadata/artifact.parser (let [(^slots [#///artifact.group #///artifact.name #///artifact.version]) artifact] {#///metadata/artifact.group group #///metadata/artifact.name name #///metadata/artifact.versions (list) #///metadata/artifact.last_updated ..epoch})] [read_version_metadata ///metadata/snapshot.Metadata ///metadata.version ///metadata/snapshot.parser (let [(^slots [#///artifact.group #///artifact.name #///artifact.version]) artifact] {#///metadata/snapshot.group group #///metadata/snapshot.name name #///metadata/snapshot.version version #///metadata/snapshot.versioning {#///metadata/snapshot.time_stamp ..epoch #///metadata/snapshot.build 0 #///metadata/snapshot.snapshot (list)}})] ) (def: snapshot_artifacts (List ///artifact/type.Type) (list ///artifact/type.pom (format ///artifact/type.pom ///artifact/extension.sha-1) (format ///artifact/type.pom ///artifact/extension.md5) ///artifact/type.lux_library (format ///artifact/type.lux_library ///artifact/extension.sha-1) (format ///artifact/type.lux_library ///artifact/extension.md5))) (def: #export (do! console repository fs artifact profile) (-> (Console Promise) (Repository Promise) (file.System Promise) Artifact (Command Any)) (let [deploy! (: (-> Extension Binary (Action Any)) (|>> (///repository.uri artifact) (\ repository upload))) fully_deploy! (: (-> Extension Binary (Action Any)) (function (_ extension payload) (do ///action.monad [_ (deploy! extension payload) _ (deploy! (format extension ///artifact/extension.sha-1) (///hash.data (///hash.sha-1 payload))) _ (deploy! (format extension ///artifact/extension.md5) (///hash.data (///hash.md5 payload)))] (wrap [])))) (^slots [#///artifact.group #///artifact.name #///artifact.version]) artifact] (do promise.monad [now (promise.future instant.now)] (do {! ///action.monad} [project (..read_project_metadata repository artifact) snapshot (..read_version_metadata repository artifact) pom (\ ! map (|>> (\ xml.codec encode) (\ encoding.utf8 encode)) (promise\wrap (///pom.write profile))) library (|> profile (get@ #/.sources) set.to_list (export.library fs) (\ ! map (binary.run tar.writer))) _ (fully_deploy! ///artifact/extension.pom pom) _ (fully_deploy! ///artifact/extension.lux_library library) _ (|> snapshot (set@ [#///metadata/snapshot.versioning #///metadata/snapshot.time_stamp] now) (update@ [#///metadata/snapshot.versioning #///metadata/snapshot.build] inc) (set@ [#///metadata/snapshot.versioning #///metadata/snapshot.snapshot] ..snapshot_artifacts) ///metadata/snapshot.write (\ xml.codec encode) (\ encoding.utf8 encode) (\ repository upload (///metadata.version artifact))) _ (|> project (set@ #///metadata/artifact.versions (list version)) (set@ #///metadata/artifact.last_updated now) ///metadata/artifact.write (\ xml.codec encode) (\ encoding.utf8 encode) (\ repository upload (///metadata.project artifact)))] (console.write_line //clean.success console)))))