module Publish where
import Control.Monad.Error (throwError)
import qualified Data.Maybe as Maybe
import qualified Bump
import qualified Catalog
import qualified CommandLine.Helpers as Cmd
import qualified Docs
import qualified Elm.Docs as Docs
import qualified Elm.Package.Description as Desc
import qualified Elm.Package.Name as N
import qualified Elm.Package.Paths as P
import qualified Elm.Package.Version as V
import qualified GitHub
import qualified Manager
publish :: Manager.Manager ()
publish =
do description <- Desc.read P.description
let name = Desc.name description
let version = Desc.version description
Cmd.out $ unwords [ "Verifying", N.toString name, V.toString version, "..." ]
verifyMetadata description
docs <- Docs.generate description
validity <- verifyVersion docs description
newVersion <-
case validity of
Bump.Valid -> return version
Bump.Invalid -> throwError "Cannot publish with an invalid version!"
Bump.Changed v -> return v
verifyTag name newVersion
Catalog.register name newVersion
Cmd.out "Success!"
verifyMetadata :: Desc.Description -> Manager.Manager ()
verifyMetadata deps =
case problems of
[] -> return ()
_ ->
throwError $
"Some of the fields in " ++ P.description ++
" have not been filled in yet:\n\n" ++ unlines problems ++
"\nFill these in and try to publish again!"
where
problems = Maybe.catMaybes
[ verify Desc.repo " repository - must refer to a valid repo on GitHub"
, verify Desc.summary " summary - a quick summary of your project, 80 characters or less"
, verify Desc.exposed " exposed-modules - list modules your project exposes to users"
]
verify getField msg =
if getField deps == getField Desc.defaultDescription
then Just msg
else Nothing
verifyVersion
:: [Docs.Documentation]
-> Desc.Description
-> Manager.Manager Bump.Validity
verifyVersion docs description =
let name = Desc.name description
version = Desc.version description
in
do maybeVersions <- Catalog.versions name
case maybeVersions of
Just publishedVersions ->
Bump.validateVersion docs name version publishedVersions
Nothing ->
Bump.validateInitialVersion description
verifyTag :: N.Name -> V.Version -> Manager.Manager ()
verifyTag name version =
do publicVersions <- GitHub.getVersionTags name
if version `elem` publicVersions
then return ()
else throwError (tagMessage version)
tagMessage :: V.Version -> String
tagMessage version =
let v = V.toString version in
unlines
[ "Libraries must be tagged in git, but tag " ++ v ++ " was not found."
, "These tags make it possible to find this specific version on github."
, "To tag the most recent commit and push it to github, run this:"
, ""
, " git tag -a " ++ v ++ " -m \"release version " ++ v ++ "\""
, " git push origin " ++ v
, ""
]