From 36e8c8fccde5708bfbea4bbb91220b8d8759eb3e Mon Sep 17 00:00:00 2001 From: associahedron <231829+associahedron@users.noreply.github.com> Date: Fri, 3 Apr 2020 11:56:17 +0100 Subject: [PATCH] Add snapshot version support in daml-assistant. (#5410) * Add snapshot version support in daml-assistant. changelog_begin - [DAML SDK] ``daml version`` can now list the available snapshot versions by passing the flag ``--snapshots=yes``. - [DAML SDK] ``daml install latest`` can now include the latest snapshot version by passing the flag ``--snapshots=yes``. changelog_end * Keep backward-compatible --all behavior * Fix comment * Delete spurious punctuation --- daml-assistant/exe/DA/Daml/Assistant.hs | 8 ++++- .../src/DA/Daml/Assistant/Command.hs | 2 ++ .../src/DA/Daml/Assistant/Install.hs | 11 +++++-- daml-assistant/src/DA/Daml/Assistant/Types.hs | 4 ++- .../src/DA/Daml/Assistant/Version.hs | 33 ++++++++++++++++++- .../test/DA/Daml/Assistant/Tests.hs | 4 +++ 6 files changed, 56 insertions(+), 6 deletions(-) diff --git a/daml-assistant/exe/DA/Daml/Assistant.hs b/daml-assistant/exe/DA/Daml/Assistant.hs index da2be2c28f..66f12b30d2 100644 --- a/daml-assistant/exe/DA/Daml/Assistant.hs +++ b/daml-assistant/exe/DA/Daml/Assistant.hs @@ -131,6 +131,7 @@ autoInstall env@Env{..} = do let sdkVersion = fromJust envSdkVersion options = InstallOptions { iTargetM = Nothing + , iSnapshots = False , iQuiet = QuietInstall False , iAssistant = InstallAssistant Auto , iActivate = ActivateInstall False @@ -174,12 +175,16 @@ handleCommand env@Env{..} logger command = do ] runCommand :: Env -> Command -> IO () -runCommand env@Env{..} = \case +runCommand env@Env{..} = \case Builtin (Version VersionOptions{..}) -> do installedVersionsE <- tryAssistant $ getInstalledSdkVersions envDamlPath availableVersionsE <- tryAssistant $ refreshAvailableSdkVersions envDamlPath defaultVersionM <- tryAssistantM $ getDefaultSdkVersion envDamlPath projectVersionM <- mapM getSdkVersionFromProjectPath envProjectPath + snapshotVersionsE <- tryAssistant $ + if vSnapshots + then getAvailableSdkSnapshotVersions + else pure [] let asstVersion = unwrapDamlAssistantSdkVersion <$> envDamlAssistantSdkVersion envVersions = catMaybes @@ -223,6 +228,7 @@ runCommand env@Env{..} = \case [ envVersions , fromRight [] installedVersionsE , if vAll then fromRight [] availableVersionsE else [] + , fromRight [] snapshotVersionsE ] versionTable = [ (versionToText v, versionAttrs v) | v <- versions ] versionWidth = maximum (1 : map (T.length . fst) versionTable) diff --git a/daml-assistant/src/DA/Daml/Assistant/Command.hs b/daml-assistant/src/DA/Daml/Assistant/Command.hs index 39b14934de..1e6978b12c 100644 --- a/daml-assistant/src/DA/Daml/Assistant/Command.hs +++ b/daml-assistant/src/DA/Daml/Assistant/Command.hs @@ -104,11 +104,13 @@ commandParser cmds | (hidden, visible) <- partition isHidden cmds = asum versionParser :: Parser VersionOptions versionParser = VersionOptions <$> flagYesNoAuto "all" False "Display all available versions." idm + <*> flagYesNoAuto "snapshots" False "Display all available snapshot versions." idm <*> flagYesNoAuto "assistant" False "Display DAML assistant version." idm installParser :: Parser InstallOptions installParser = InstallOptions <$> optional (RawInstallTarget <$> argument str (metavar "TARGET" <> completeWith ["latest"] <> help "The SDK version to install. Use 'latest' to download and install the latest stable SDK version available. Run 'daml install' to see the full set of options.")) + <*> flagYesNoAuto "snapshots" False "Pick up snapshot versions with daml install latest." idm <*> (InstallAssistant <$> flagYesNoAuto' "install-assistant" "Install associated DAML assistant version. Can be set to \"yes\" (always installs), \"no\" (never installs), or \"auto\" (installs if newer). Default is \"auto\"." idm) <*> iflag ActivateInstall "activate" hidden "Activate installed version of daml" <*> iflag ForceInstall "force" (short 'f') "Overwrite existing installation" diff --git a/daml-assistant/src/DA/Daml/Assistant/Install.hs b/daml-assistant/src/DA/Daml/Assistant/Install.hs index 609733a3aa..8af600b99b 100644 --- a/daml-assistant/src/DA/Daml/Assistant/Install.hs +++ b/daml-assistant/src/DA/Daml/Assistant/Install.hs @@ -17,6 +17,7 @@ import DA.Daml.Assistant.Util import qualified DA.Daml.Assistant.Install.Github as Github import DA.Daml.Assistant.Install.Path import DA.Daml.Assistant.Install.Completion +import DA.Daml.Assistant.Version (getLatestSdkSnapshotVersion) import DA.Daml.Project.Consts import DA.Daml.Project.Config import Safe @@ -355,10 +356,14 @@ versionInstall env@InstallEnv{..} version = do "Activating assistant version " <> versionToString version activateDaml env (SdkPath path) --- | Install the latest stable version of the SDK. +-- | Install the latest version of the SDK. latestInstall :: InstallEnv -> IO () -latestInstall env = do - version <- getLatestVersion +latestInstall env@InstallEnv{..} = do + version1 <- getLatestVersion + version2M <- if iSnapshots options + then getLatestSdkSnapshotVersion + else pure Nothing + let version = maybe version1 (max version1) version2M versionInstall env version -- | Get the latest stable version. diff --git a/daml-assistant/src/DA/Daml/Assistant/Types.hs b/daml-assistant/src/DA/Daml/Assistant/Types.hs index a309aa22a3..9ce4ad3483 100644 --- a/daml-assistant/src/DA/Daml/Assistant/Types.hs +++ b/daml-assistant/src/DA/Daml/Assistant/Types.hs @@ -76,13 +76,15 @@ newtype UserCommandArgs = UserCommandArgs -- | Command-line options for daml version command. data VersionOptions = VersionOptions - { vAll :: Bool -- ^ list all available versions + { vAll :: Bool -- ^ show all versions (stable + snapshot) + , vSnapshots :: Bool -- ^ show all snapshot versions , vAssistant :: Bool -- ^ show assistant version } deriving (Eq, Show) -- | Command-line options for daml install command. data InstallOptions = InstallOptions { iTargetM :: Maybe RawInstallTarget -- ^ version to install + , iSnapshots :: Bool -- ^ include snapshots for latest target , iAssistant :: InstallAssistant -- ^ install the assistant , iActivate :: ActivateInstall -- ^ install the assistant if true (deprecated, delete with 0.14.x) , iForce :: ForceInstall -- ^ force reinstall if already installed diff --git a/daml-assistant/src/DA/Daml/Assistant/Version.hs b/daml-assistant/src/DA/Daml/Assistant/Version.hs index b81fbc05e5..7e44b2087e 100644 --- a/daml-assistant/src/DA/Daml/Assistant/Version.hs +++ b/daml-assistant/src/DA/Daml/Assistant/Version.hs @@ -12,6 +12,8 @@ module DA.Daml.Assistant.Version , getAvailableSdkVersionsCached , refreshAvailableSdkVersions , getLatestSdkVersionCached + , getAvailableSdkSnapshotVersions + , getLatestSdkSnapshotVersion ) where import DA.Daml.Assistant.Types @@ -109,7 +111,7 @@ getDefaultSdkVersion damlPath = do required "There are no installed SDK versions." $ maximumMay installedVersions --- | Get the list of available versions afresh. This will fetch. +-- | Get the list of available versions afresh. This will fetch -- https://docs.daml.com/versions.json and parse the obtained list -- of versions. getAvailableSdkVersions :: IO [SdkVersion] @@ -130,6 +132,27 @@ getAvailableSdkVersions = wrapErr "Fetching list of available SDK versions" $ do pure . sort $ mapMaybe (eitherToMaybe . parseVersion) (M.keys versionsMap) +-- | Get the list of available snapshot versions. This will fetch +-- https://docs.daml.com/snapshots.json and parse the obtained list +-- of versions. +getAvailableSdkSnapshotVersions :: IO [SdkVersion] +getAvailableSdkSnapshotVersions = wrapErr "Fetching list of available SDK snapshot versions" $ do + response <- requiredAny "HTTP connection to docs.daml.com failed" $ do + request <- parseRequest "GET http://docs.daml.com/snapshots.json" + httpBS request { responseTimeout = responseTimeoutMicro 2000000 } + + when (getResponseStatusCode response /= 200) $ do + throwIO $ assistantErrorBecause + "Fetching list of available SDK snapshot versions from docs.daml.com failed" + (pack . show $ getResponseStatus response) + + versionsMap :: M.HashMap Text Text <- + fromRightM + (throwIO . assistantErrorBecause "Snapshot versions list from docs.daml.com does not contain valid JSON" . pack) + (eitherDecodeStrict' (getResponseBody response)) + + pure . sort $ mapMaybe (eitherToMaybe . parseVersion) (M.keys versionsMap) + -- | Same as getAvailableSdkVersions, but writes result to cache. refreshAvailableSdkVersions :: DamlPath -> IO [SdkVersion] refreshAvailableSdkVersions damlPath = do @@ -150,3 +173,11 @@ getLatestSdkVersionCached damlPath = do pure $ do versions <- eitherToMaybe versionsE maximumMay versions + +-- | Get the latest snapshot SDK version. +getLatestSdkSnapshotVersion :: IO (Maybe SdkVersion) +getLatestSdkSnapshotVersion = do + versionsE <- tryAssistant getAvailableSdkSnapshotVersions + pure $ do + versions <- eitherToMaybe versionsE + maximumMay versions diff --git a/daml-assistant/test/DA/Daml/Assistant/Tests.hs b/daml-assistant/test/DA/Daml/Assistant/Tests.hs index e2d3716e5f..ba9305a370 100644 --- a/daml-assistant/test/DA/Daml/Assistant/Tests.hs +++ b/daml-assistant/test/DA/Daml/Assistant/Tests.hs @@ -350,6 +350,7 @@ testInstall = Tasty.testGroup "DA.Daml.Assistant.Install" let damlPath = DamlPath (base "daml") options = InstallOptions { iTargetM = Just (RawInstallTarget "source.tar.gz") + , iSnapshots = False , iAssistant = InstallAssistant Yes , iActivate = ActivateInstall True , iQuiet = QuietInstall True @@ -385,6 +386,7 @@ testInstallUnix = Tasty.testGroup "unix-specific tests" let damlPath = DamlPath (base "daml") options = InstallOptions { iTargetM = Just (RawInstallTarget "source.tar.gz") + , iSnapshots = False , iAssistant = InstallAssistant Yes , iActivate = ActivateInstall True , iQuiet = QuietInstall True @@ -415,6 +417,7 @@ testInstallUnix = Tasty.testGroup "unix-specific tests" let damlPath = DamlPath (base "daml") options = InstallOptions { iTargetM = Just (RawInstallTarget "source.tar.gz") + , iSnapshots = False , iAssistant = InstallAssistant No , iActivate = ActivateInstall False , iQuiet = QuietInstall True @@ -445,6 +448,7 @@ testInstallUnix = Tasty.testGroup "unix-specific tests" let damlPath = DamlPath (base "daml") options = InstallOptions { iTargetM = Just (RawInstallTarget "source.tar.gz") + , iSnapshots = False , iAssistant = InstallAssistant No , iActivate = ActivateInstall False , iQuiet = QuietInstall True