module Diff where
import Control.Monad.Error (throwError)
import qualified Catalog
import qualified CommandLine.Helpers as Cmd
import qualified Diff.Compare as Compare
import qualified Diff.Display as Display
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 Path
import qualified Elm.Package.Version as V
import qualified Manager
data Range
= LatestVsActual
| Since V.Version
| Between N.Name V.Version V.Version
diff :: Range -> Manager.Manager ()
diff range =
case range of
LatestVsActual ->
do desc <- Desc.read Path.description
let name = Desc.name desc
newDocs <- Docs.generate desc
maybeVersions <- Catalog.versions name
latestVersion <-
maybe (throwError noVersions) (return . last) maybeVersions
computeDiff name latestVersion newDocs Nothing
Since version ->
do desc <- Desc.read Path.description
newDocs <- Docs.generate desc
computeDiff (Desc.name desc) version newDocs Nothing
Between name old new ->
do newDocs <- Catalog.documentation name new
computeDiff name old newDocs (Just new)
noVersions :: String
noVersions =
"This package has not been published, there is nothing to diff against!"
computeDiff
:: N.Name
-> V.Version
-> [Docs.Documentation]
-> Maybe V.Version
-> Manager.Manager ()
computeDiff name oldVersion newDocs maybeNewVersion =
do Cmd.out msg
changes <- Compare.computeChanges newDocs name oldVersion
Cmd.out (Display.packageChanges changes)
where
msg =
"Comparing " ++ N.toString name ++ " " ++ V.toString oldVersion ++ " to " ++ newStuff ++ "..."
newStuff =
case maybeNewVersion of
Nothing -> "local changes"
Just version -> V.toString version