(.module: [library [lux #* [abstract [codec (#+ Codec)] ["." monad (#+ do)]] [control ["." try (#+ Try)] [concurrency ["." async (#+ Async)]]] [data [binary (#+ Binary)] ["." product] [text ["%" format (#+ format)] [encoding ["." utf8]]] [collection ["." dictionary] ["." set (#+ Set)] ["." list ("#\." monoid)]]] [time ["." instant (#+ Instant)]]]] ["." /// #_ [repository (#+ Repository)] ["#." hash (#+ Hash)] ["#." package (#+ Package)] ["#." artifact (#+ Artifact) ["#/." time] ["#/." type] ["#/." extension (#+ Extension)] ["#/." versioning] ["#/." snapshot ["#/." version ["#/." value]]]] ["#." metadata #_ ["#/." artifact] ["#/." snapshot (#+ Metadata)]] ["#." dependency (#+ Dependency) [resolution (#+ Resolution)] ["#/." status (#+ Status)]]]) (def: (with_status repository version_template [artifact type] [data status]) (-> (Repository Async) ///artifact.Version Dependency [Binary Status] (Async (Try Any))) (let [artifact (format (///artifact.uri version_template artifact) (///artifact/extension.extension type)) deploy_hash (: (All [h] (-> (Codec Text (Hash h)) Extension (Hash h) (Async (Try Any)))) (function (_ codec extension hash) (|> hash (\ codec encoded) (\ utf8.codec encoded) (\ repository upload (format artifact extension)))))] (do {! (try.with async.monad)} [_ (\ repository upload artifact data)] (case status #///dependency/status.Unverified (in []) (#///dependency/status.Partial partial) (case partial (#.Left sha-1) (deploy_hash ///hash.sha-1_codec ///artifact/extension.sha-1 sha-1) (#.Right md5) (deploy_hash ///hash.md5_codec ///artifact/extension.md5 md5)) (#///dependency/status.Verified sha-1 md5) (do ! [_ (deploy_hash ///hash.sha-1_codec ///artifact/extension.sha-1 sha-1)] (deploy_hash ///hash.md5_codec ///artifact/extension.md5 md5)))))) (def: (artifacts type status) (-> ///artifact/type.Type Status (List ///artifact/type.Type)) (with_expansions [ (format type ///artifact/extension.sha-1) (format type ///artifact/extension.md5)] (list& type (case status #///dependency/status.Unverified (list) (#///dependency/status.Partial partial) (list (case partial (#.Left _) (#.Right _) )) (#///dependency/status.Verified _) (list ))))) (def: (update_snapshot [artifact type] now snapshot) (-> Dependency Instant Metadata (Try Metadata)) (do try.monad [now (: (Try ///artifact/time.Time) (///artifact/time.of_instant now)) .let [version_template (value@ #///artifact.version artifact) snapshot (|> snapshot (revised@ [#///metadata/snapshot.versioning #///artifact/versioning.snapshot] (function (_ snapshot) (case snapshot #///artifact/snapshot.Local #///artifact/snapshot.Local (#///artifact/snapshot.Remote [_ build]) (#///artifact/snapshot.Remote [now (++ build)])))) (with@ [#///metadata/snapshot.versioning #///artifact/versioning.last_updated] now)) versioning_snapshot (value@ [#///metadata/snapshot.versioning #///artifact/versioning.snapshot] snapshot)]] (in (|> snapshot (with@ [#///metadata/snapshot.versioning #///artifact/versioning.versions] (list {#///artifact/snapshot/version.extension type #///artifact/snapshot/version.value (///artifact/snapshot/version/value.format {#///artifact/snapshot/version/value.version version_template #///artifact/snapshot/version/value.snapshot versioning_snapshot}) #///artifact/snapshot/version.updated now})) ... (with@ [#///metadata/snapshot.versioning #///artifact/versioning.snapshot] ... (list\compose (..artifacts type (product.right (value@ #///package.library package))) ... (..artifacts ///artifact/type.pom (product.right (value@ #///package.pom package))))) )))) (def: .public (one repository [artifact type] package) (-> (Repository Async) Dependency Package (Async (Try Artifact))) (do {! async.monad} [now (async.future instant.now) .let [version_template (value@ #///artifact.version artifact)]] (do (try.with !) [_ (with_status repository version_template [artifact type] (value@ #///package.library package)) _ (let [[pom pom_data status] (value@ #///package.pom package)] (with_status repository version_template [artifact ///artifact/type.pom] [pom_data status])) snapshot (///metadata/snapshot.read repository artifact) snapshot (\ ! in (..update_snapshot [artifact type] now snapshot)) _ (///metadata/snapshot.write repository artifact snapshot) project (///metadata/artifact.read repository artifact) _ (|> project (with@ #///metadata/artifact.versions (list version_template)) (with@ #///metadata/artifact.last_updated now) (///metadata/artifact.write repository artifact))] (in artifact)))) (def: .public (all repository resolution) (-> (Repository Async) Resolution (Async (Try (Set Artifact)))) (let [! (try.with async.monad)] (|> (dictionary.entries resolution) (monad.map ! (function (_ [dependency package]) (..one repository dependency package))) (\ ! map (set.of_list ///artifact.hash)))))