packages feed

ghcup 0.2.6.1 → 0.2.6.2

raw patch · 16 files changed

+341/−42 lines, 16 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

+ GHCup.Command.Fixup: fixupSymlinks :: (HasLog env, MonadReader env m, HasDirs env, HasPlatformReq env, HasGHCupInfo env, MonadIOish m) => Excepts '[MalformedInstallInfo, ParseError] m ()
+ GHCup.Command.Install.LowLevel: fixMajorMinorSymlink :: (HasLog env, MonadReader env m, HasDirs env, HasPlatformReq env, MonadIOish m) => Tool -> Maybe Text -> (Int, Int) -> Excepts '[MalformedInstallInfo, ParseError] m ()
+ GHCup.Command.Install.LowLevel: symlinkMajorMinor :: (HasLog env, MonadReader env m, HasDirs env, MonadIOish m) => InstallDirResolved -> [SymlinkSpec [Either Char Version]] -> InstallDirResolved -> Tool -> TargetVersion -> Excepts '[MalformedInstallInfo] m ()
+ GHCup.Command.List: ListTag :: Bool -> Tag -> ListCriteria
+ GHCup.Command.List: ListTarget :: Bool -> Maybe Text -> ListCriteria
+ GHCup.Query.DB: getSymlinkSpecPortable' :: (MonadReader env m, HasDirs env, HasPlatformReq env, HasLog env, MonadIOish m) => Tool -> TargetVersion -> Excepts '[ParseError] m [SymlinkSpec [Either Char Version]]
- GHCup.Types.Optics: isConfigure :: forall a_i1YYW. Lens' (InstallationSpecGen a_i1YYW) (Maybe ConfigSpec)
+ GHCup.Types.Optics: isConfigure :: forall a_i1YZh. Lens' (InstallationSpecGen a_i1YZh) (Maybe ConfigSpec)
- GHCup.Types.Optics: isDataRules :: forall a_i1YYW. Lens' (InstallationSpecGen a_i1YYW) [InstallFileRule]
+ GHCup.Types.Optics: isDataRules :: forall a_i1YZh. Lens' (InstallationSpecGen a_i1YZh) [InstallFileRule]
- GHCup.Types.Optics: isExeRules :: forall a_i1YYW. Lens' (InstallationSpecGen a_i1YYW) [InstallFileRule]
+ GHCup.Types.Optics: isExeRules :: forall a_i1YZh. Lens' (InstallationSpecGen a_i1YZh) [InstallFileRule]
- GHCup.Types.Optics: isExeSymLinked :: forall a_a1YYY a_i1YYW. Lens (InstallationSpecGen a_i1YYW) (InstallationSpecGen a_a1YYY) [a_i1YYW] [a_a1YYY]
+ GHCup.Types.Optics: isExeSymLinked :: forall a_a1YZj a_i1YZh. Lens (InstallationSpecGen a_i1YZh) (InstallationSpecGen a_a1YZj) [a_i1YZh] [a_a1YZj]
- GHCup.Types.Optics: isMake :: forall a_i1YYW. Lens' (InstallationSpecGen a_i1YYW) (Maybe MakeSpec)
+ GHCup.Types.Optics: isMake :: forall a_i1YZh. Lens' (InstallationSpecGen a_i1YZh) (Maybe MakeSpec)
- GHCup.Types.Optics: isPreserveMtimes :: forall a_i1YYW. Lens' (InstallationSpecGen a_i1YYW) Bool
+ GHCup.Types.Optics: isPreserveMtimes :: forall a_i1YZh. Lens' (InstallationSpecGen a_i1YZh) Bool

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Version history for ghcup +## 0.2.6.2 -- 2026-06-16++* Fix X.Y symlinks wrt [#1365](https://github.com/haskell/ghcup-hs/issues/1365)+* Provide a way to filter by target when invoking `ghcup list` [#1362](https://github.com/haskell/ghcup-hs/issues/1362)+* Introduce `ghcup fixup` [#1369](https://github.com/haskell/ghcup-hs/issues/1369)+ ## 0.2.6.1 -- 2026-06-13  ### Bugfixes affecting VSCode
app/ghcup/Main.hs view
@@ -332,6 +332,7 @@             Run runCommand             -> run runCommand settings (getAppState_and_updateCheckAction, leanAppstate)             PrintAppErrors             -> putStrLn allHFError >> pure ExitSuccess             HealthCheck hcCommands     -> hc hcCommands (getAppState_and_updateCheckAction, leanAppstate)+            Fixup fixupCommand         -> fixup fixupCommand (getAppState_and_updateCheckAction, leanAppstate) #if defined(DHALL)             Generate gen -> generate gen (getAppState_and_updateCheckAction, leanAppstate) #endif
ghcup.cabal view
@@ -1,9 +1,9 @@ cabal-version:      2.4 name:               ghcup-version:            0.2.6.1+version:            0.2.6.2 license:            LGPL-3.0-only license-file:       LICENSE-copyright:          Julian Ospald 2024+copyright:          Julian Ospald 2026 maintainer:         hasufell@posteo.de author:             Julian Ospald homepage:           https://github.com/haskell/ghcup-hs@@ -212,6 +212,7 @@     GHCup.Command.Whereis     GHCup.Command.GC     GHCup.Command.HealthCheck+    GHCup.Command.Fixup     GHCup.Command.Prefetch     GHCup.Command.Rm     GHCup.Command.Set@@ -355,6 +356,7 @@     GHCup.OptParse.GC     GHCup.OptParse.Generate     GHCup.OptParse.HealthCheck+    GHCup.OptParse.Fixup     GHCup.OptParse.Install     GHCup.OptParse.List     GHCup.OptParse.Nuke
lib-opt/GHCup/OptParse.hs view
@@ -27,6 +27,7 @@   , module GHCup.OptParse.Generate #endif   , module GHCup.OptParse.HealthCheck+  , module GHCup.OptParse.Fixup   , module GHCup.OptParse.DebugInfo   , module GHCup.OptParse.Nuke   , module GHCup.OptParse.ToolRequirements@@ -57,6 +58,7 @@ import           GHCup.OptParse.Generate #endif import           GHCup.OptParse.HealthCheck+import           GHCup.OptParse.Fixup import           GHCup.OptParse.DebugInfo import           GHCup.OptParse.ToolRequirements import           GHCup.OptParse.Nuke@@ -128,6 +130,7 @@   | GC GCOptions   | Run RunOptions   | HealthCheck HealthCheckCommand+  | Fixup FixupCommand   | PrintAppErrors  @@ -326,6 +329,12 @@               ( HealthCheck <$>                info (hcP <**> helper)                     (progDesc "Health check ghcup")+              )+      <> command+              "fixup"+              ( Fixup <$>+               info (fixupP <**> helper)+                    (progDesc "Fix up issues with installations")               )       <> commandGroup "Main commands:"       )
+ lib-opt/GHCup/OptParse/Fixup.hs view
@@ -0,0 +1,127 @@+{-# LANGUAGE CPP               #-}+{-# LANGUAGE DataKinds         #-}+{-# LANGUAGE TypeApplications  #-}+{-# LANGUAGE FlexibleContexts  #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes       #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE RankNTypes #-}++module GHCup.OptParse.Fixup where+++import GHCup.Command.Fixup+import GHCup.Errors+import GHCup.Prelude.Logger+import GHCup.Prelude.String.QQ+import GHCup.Types++#if !MIN_VERSION_base(4,13,0)+import           Control.Monad.Fail             ( MonadFail )+#endif+import           Control.Monad.Reader+import           Control.Monad.Trans.Resource+import           Data.Functor+import           Data.Variant.Excepts+import           Options.Applicative     hiding ( style, ParseError )+import           Prelude                 hiding ( appendFile )+import           System.Exit+import Options.Applicative.Pretty.Shim ( text )+import Control.Exception.Safe (MonadMask)++import qualified Data.Text                     as T++++++    ----------------+    --[ Commands ]--+    ----------------+++data FixupCommand+  = FixupSymlinks+  deriving (Eq, Show)+++++    ---------------+    --[ Parsers ]--+    ---------------+++fixupP :: Parser FixupCommand+fixupP =+  subparser+      (  command+          "symlinks"+          (   FixupSymlinks+          <$ info+                helper+                (  progDesc "Fix up symlinks in bin/"+                <> footerDoc (Just $ text toolFooter)+                )+          )+      )+ where+  toolFooter :: String+  toolFooter = [s|Discussion:+  Fix up common issues.++Examples:+  ghcup fixup symlinks|]++++++++    ---------------------------+    --[ Effect interpreters ]--+    ---------------------------+++type FixupEffects = '[MalformedInstallInfo, ParseError]+++++    ------------------+    --[ Entrypoint ]--+    ------------------++++fixup :: ( Monad m+         , MonadMask m+         , MonadUnliftIO m+         , MonadFail m+         )+      => FixupCommand+      -> (IO (AppState, IO ()), LeanAppState)+      -> m ExitCode+fixup command' (getAppState', leanAppstate) = run (do+     case command' of+       FixupSymlinks ->+         liftE fixupSymlinks+   ) >>= \case+            (VRight _, up) -> do+              liftIO up+              pure ExitSuccess+            (VLeft e, _) -> do+              runLogger $ logError $ T.pack $ prettyHFError e+              pure $ ExitFailure 27+ where+  runLogger = flip runReaderT leanAppstate+  run action' = do+    (appstate', up) <- liftIO getAppState'+    r <- flip runReaderT appstate'+                  . runResourceT+                  . runE+                    @FixupEffects+                  $ action'+    pure (r, up)+
lib-opt/GHCup/OptParse/List.hs view
@@ -95,10 +95,10 @@             (eitherReader criteriaParser)             (  short 'c'             <> long "show-criteria"-            <> metavar "<installed|set|available>"+            <> metavar "<installed|set|available|cross|target=...|tag=...>"             <> help "Apply filtering criteria, prefix with + or -"               <> completer (listCompleter-                [ "+installed", "+set", "+available", "-installed", "-set", "-available"])+                [ "+installed", "+set", "+available", "+cross", "-installed", "-set", "-available", "-cross"])             )           )     <*> optional
lib-opt/GHCup/OptParse/TUI.hs view
@@ -54,10 +54,10 @@             (eitherReader criteriaParser)             (  short 'c'             <> long "show-criteria"-            <> metavar "<installed|set|available>"+            <> metavar "<installed|set|available|cross|target=...|tag=...>"             <> help "Apply filtering criteria, prefix with + or -"               <> completer (listCompleter-                [ "+installed", "+set", "+available", "-installed", "-set", "-available"])+                [ "+installed", "+set", "+available", "+cross", "-installed", "-set", "-available", "-cross"])             )           )     <*> optional
+ lib/GHCup/Command/Fixup.hs view
@@ -0,0 +1,46 @@+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedStrings #-}++module GHCup.Command.Fixup where++import GHCup.Command.Install.LowLevel+import GHCup.Command.List+import GHCup.Errors+import GHCup.Prelude+import GHCup.Query.DB+import GHCup.Query.GHCupDirs+import GHCup.Types+import GHCup.Types.Optics++import Control.Monad                  ( forM_, when )+import Control.Monad.Reader           ( MonadReader )+import Data.Variant.Excepts+import Text.PrettyPrint.HughesPJClass ( prettyShow )++import qualified Data.Map.Strict as M+import qualified Data.Text       as T+++fixupSymlinks ::+  ( HasLog env+  , MonadReader env m+  , HasDirs env+  , HasPlatformReq env+  , HasGHCupInfo env+  , MonadIOish m+  )+  => Excepts '[MalformedInstallInfo, ParseError] m ()+fixupSymlinks = do+  Dirs{..} <- getDirs+  tlr <- liftE $ listVersions Nothing [ListInstalled True] ShowNone False NShowAll (Nothing, Nothing)++  forM_ (M.toList $ M.filterWithKey (\t _ -> t /= ghcup) tlr) $ \(tool, (_mtd, lrs)) ->+    forM_ lrs $ \ListResult{..} -> do+      let tver = TargetVersion lCross lVer+      logInfo $ "Fixing symlinks for " <> T.pack (prettyShow tool) <> " version " <> T.pack (prettyShow tver)+      idr <- toolInstallDestination tool tver+      rawSpec <- liftE $ getSymlinkSpecPortable' tool tver+      when (null rawSpec) $ logWarn $ "Could not find symlink specification in the DB. Consider reinstalling " <> T.pack (prettyShow tool) <> "-" <> T.pack (prettyShow tver)+      liftE $ symlinkBinaries (GHCupDir idr) rawSpec (GHCupBinDir binDir) tool tver+
lib/GHCup/Command/Install/LowLevel.hs view
@@ -41,6 +41,7 @@ import qualified Data.Text             as T import qualified System.FilePath.Posix as Posix import qualified Text.Megaparsec       as MP+import Safe (maximumMay)   @@ -271,15 +272,12 @@   -> TargetVersion   -> Excepts '[MalformedInstallInfo] m () symlinkBinaries (IsolateDirResolved _) _ _ _ _ = pure ()-symlinkBinaries (fromInstallDir -> toolDir) rawSpec bindir tool tver = do+symlinkBinaries idr@(fromInstallDir -> toolDir) rawSpec bindir tool tver = do   let spec = substituteSpec <$> rawSpec   forM_ spec safeSpec   pvpSyms <- lift $ getPVPSymlinks' (fromInstallDir bindir) spec toolDir   forM_ pvpSyms $ lift . uncurry createLink-  case bindir of-    IsolateDirResolved d -> linkMajor d-    GHCupDir d           -> linkMajor (fromGHCupPath d)-    GHCupBinDir d        -> whenM (lift isLatest) $ linkMajor d+  symlinkMajorMinor idr rawSpec bindir tool tver  where   safeSpec SymlinkSpec{..} = do     checkSafePath _slTarget@@ -290,12 +288,71 @@    checkSafeFilename fp = unless (safeFilename fp) $ throwE (MalformedInstallInfo "'..' or '.' are not allowed and filepath must have no path separators") ++-- | For the given X.Y version, we+-- find the latest X.Y.Z and create symlinks.+fixMajorMinorSymlink ::+  ( HasLog env+  , MonadReader env m+  , HasDirs env   -- createLink needs it on windows+  , HasPlatformReq env+  , MonadIOish m+  )+  => Tool+  -> Maybe T.Text+  -> (Int, Int)+  -> Excepts '[MalformedInstallInfo, ParseError] m ()+fixMajorMinorSymlink tool mtarget majorMinor = do+  Dirs {..}  <- getDirs+  vers <- lift $ getInstalledVersions tool mtarget+  let filterMajor = filter (\(getMajorMinorV  . _vrVersion -> mj) -> mj == Just majorMinor)+  let mLatestMajorVer = fmap _vrVersion $ maximumMay $ filterMajor vers+  case mLatestMajorVer of+    Nothing -> pure ()+    Just latestMajorVer -> do+      let tver = TargetVersion mtarget latestMajorVer+      idr <- toolInstallDestination tool tver+      rawSpec <- liftE $ getSymlinkSpecPortable' tool tver+      liftE $ symlinkMajorMinor (GHCupDir idr) rawSpec (GHCupBinDir binDir) tool tver+++-- | Create X.Y major symlinks for the given GHC version, but only+-- if it is the 'latest' version.+--+-- E.g. if we have+--   * ghc-9.8.3+--   * ghc-9.8.4+-- then we want the following symlink:+--   * ghc-9.8 -> ghc-9.8.4+symlinkMajorMinor ::+  ( HasLog env+  , MonadReader env m+  , HasDirs env   -- createLink needs it on windows+  , MonadIOish m+  )+  => InstallDirResolved                    -- ^ base dir of the tool+  -> [SymlinkSpec [Either Char Version]]   -- ^ symlink spec+  -> InstallDirResolved                    -- ^ binary dir+  -> Tool+  -> TargetVersion+  -> Excepts '[MalformedInstallInfo] m ()+symlinkMajorMinor (IsolateDirResolved _) _ _ _ _ = pure ()+symlinkMajorMinor (fromInstallDir -> toolDir) rawSpec bindir tool tver = do+  case bindir of+    IsolateDirResolved d -> linkMajor d+    GHCupDir d           -> linkMajor (fromGHCupPath d)+    GHCupBinDir d        -> whenM (lift isLatest) $ linkMajor d+ where   linkMajor d = do     let ver = _tvVersion tver     pvpMajorSyms <- liftE $ getPVPMajorSymlinks' d rawSpec ver toolDir     forM_ pvpMajorSyms $ lift . uncurry createLink-  isLatest = do-    vers <- getInstalledVersions tool (_tvTarget tver)-    let latestVer = _vrVersion $ maximum vers-    pure $ latestVer == _tvVersion tver +  isLatest = do+    case getMajorMinorV (_tvVersion tver) of+      Just cMJ -> do+        vers <- getInstalledVersions tool (_tvTarget tver)+        let filterMajor = filter (\(getMajorMinorV  . _vrVersion -> mj) -> mj == Just cMJ)+        let latestMajorVer = fmap _vrVersion $ maximumMay $ filterMajor vers+        pure $ latestMajorVer == Just (_tvVersion tver)+      Nothing -> pure False
lib/GHCup/Command/List.hs view
@@ -66,6 +66,8 @@   = ListInstalled Bool   | ListSet Bool   | ListAvailable Bool+  | ListTarget Bool (Maybe Text)+  | ListTag Bool Tag   deriving (Eq, Show)  @@ -356,6 +358,8 @@     ListInstalled  b -> f b lInstalled     ListSet        b -> f b lSet     ListAvailable  b -> f b $ not lNoBindist+    ListTarget     b t -> f b (lCross == t)+    ListTag        b t -> f b (t `elem` lTag)    where     f b       | b         = id
lib/GHCup/Command/Rm.hs view
@@ -40,6 +40,7 @@ import System.IO.Temp  import qualified Data.Text as T+import GHCup.Command.Install.LowLevel   -- | Remove a tool completely.@@ -143,6 +144,10 @@       | tool == stack -> liftE $ rmStackVer ver'       | tool == ghcup -> lift rmGhcup       | otherwise -> fail "Could not find installed files... your DB seems corrupted"++  -- now restore the X.Y symlink+  majorMinor <- getMajorMinorV (_tvVersion tver)+  liftE $ fixMajorMinorSymlink tool (_tvTarget tver) majorMinor  where   rmGHCShareDir = do     Dirs {..}  <- getDirs
lib/GHCup/Input/Parsers.hs view
@@ -212,6 +212,7 @@ tagEither :: String -> Either String Tag tagEither s' = case ls of   "recommended"       -> Right Recommended+  "prerelease"        -> Right Prerelease   "latest"            -> Right Latest   "latest-prerelease" -> Right LatestPrerelease   "latest-nightly"    -> Right LatestNightly@@ -279,16 +280,40 @@   where t = T.toLower (T.pack s')  criteriaParser :: String -> Either String ListCriteria-criteriaParser s' | t == T.pack "installed"   = Right $ ListInstalled True-                  | t == T.pack "set"         = Right $ ListSet True-                  | t == T.pack "available"   = Right $ ListAvailable True-                  | t == T.pack "+installed"  = Right $ ListInstalled True-                  | t == T.pack "+set"        = Right $ ListSet True-                  | t == T.pack "+available"  = Right $ ListAvailable True-                  | t == T.pack "-installed"  = Right $ ListInstalled False-                  | t == T.pack "-set"        = Right $ ListSet False-                  | t == T.pack "-available"  = Right $ ListAvailable False-                  | otherwise                 = Left ("Unknown criteria: " <> s')+criteriaParser s' | t == T.pack "installed"  = Right $ ListInstalled True+                  | t == T.pack "set"        = Right $ ListSet True+                  | t == T.pack "available"  = Right $ ListAvailable True+                  | t == T.pack "+installed" = Right $ ListInstalled True+                  | t == T.pack "+set"       = Right $ ListSet True+                  | t == T.pack "+available" = Right $ ListAvailable True+                  | t == T.pack "-installed" = Right $ ListInstalled False+                  | t == T.pack "-set"       = Right $ ListSet False+                  | t == T.pack "-available" = Right $ ListAvailable False+                  | t == T.pack "cross"      = Right $ ListTarget False Nothing+                  | t == T.pack "-cross"     = Right $ ListTarget True Nothing+                  | t == T.pack "+cross"     = Right $ ListTarget False Nothing+                  | Just target <- T.stripPrefix "-target=" t = Right $ ListTarget False (Just target)+                  | Just target <- T.stripPrefix "+target=" t = Right $ ListTarget True (Just target)+                  | Just target <- T.stripPrefix "target=" t  = Right $ ListTarget True (Just target)+                  | Just target <- T.stripPrefix "-target" t  = Right $ ListTarget False (Just target)+                  | Just target <- T.stripPrefix "+target" t  = Right $ ListTarget True (Just target)+                  | Just target <- T.stripPrefix "target" t   = Right $ ListTarget True (Just target)++                  | Just tagText <- T.stripPrefix "tag=" t+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag+                  | Just tagText <- T.stripPrefix "+tag=" t+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag+                  | Just tagText <- T.stripPrefix "-tag=" t+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag False tag++                  | Just tagText <- T.stripPrefix "tag" t+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag+                  | Just tagText <- T.stripPrefix "+tag" t+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag True tag+                  | Just tagText <- T.stripPrefix "-tag" t+                  , Right tag <- tagEither (T.unpack tagText) = Right $ ListTag False tag++                  | otherwise = Left ("Unknown criteria: " <> s')   where t = T.toLower (T.pack s')  
lib/GHCup/Query/DB.hs view
@@ -156,6 +156,30 @@          | tool == ghcup -> pure [] -- Hm          | otherwise     -> pure [] +-- TODO: not neat the random combination of different SymlinkSpec types+getSymlinkSpecPortable' ::+  ( MonadReader env m+  , HasDirs env+  , HasPlatformReq env+  , HasLog env+  , MonadIOish m+  )+  => Tool+  -> TargetVersion+  -> Excepts '[ParseError] m [SymlinkSpec [Either Char Version]]+getSymlinkSpecPortable' tool tver = do+  runE (getSymlinkSpec' tool tver) >>= \case+    VRight r -> pure r+    VLeft (V pe@(ParseError _)) -> fail $ prettyHFError pe+    VLeft _ -> do -- legacy+      if | tool == ghc   -> do+             pfreq <- getPlatformReq+             liftE $ forM (defaultGHCExeSymLinked pfreq tver (ghcBinaries pfreq tver)) $ parseSymlinkSpec (_tvVersion tver)+         | tool == cabal -> pure []+         | tool == stack -> pure []+         | tool == hls   -> pure []+         | tool == ghcup -> pure [] -- Hm+         | otherwise     -> pure []   
scripts/bootstrap/bootstrap-haskell view
@@ -41,7 +41,7 @@  plat="$(uname -s)" arch=$(uname -m)-ghver="0.2.6.1"+ghver="0.2.6.2" : "${GHCUP_BASE_URL:=https://downloads.haskell.org/~ghcup}"  export GHCUP_SKIP_UPDATE_CHECK=yes
test/optparse-test/InstallTest.hs view
@@ -8,8 +8,8 @@  import Test.Tasty import GHCup.OptParse hiding (HLSCompileOptions(isolateDir))-import Utils import GHCup.Types+import Utils import Data.Versions import Data.List.NonEmpty (NonEmpty ((:|))) @@ -58,10 +58,7 @@             $(versionQ "nightly")       )     , ("install ghc recommended", ToolTag Recommended)-    , ("install ghc prerelease", GHCVersion-          $ toTargetVersionReq''-            $(versionQ "prerelease")-      )+    , ("install ghc prerelease", ToolTag Prerelease)     , ("install ghc latest-prerelease", ToolTag LatestPrerelease)     , ("install ghc latest-nightly", ToolTag LatestNightly)     , ("install ghc javascript-unknown-ghcjs-9.6", GHCVersion@@ -81,7 +78,7 @@     , ("install cabal latest", ToolTag Latest)     , ("install cabal nightly", ToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))     , ("install cabal recommended", ToolTag Recommended)-    , ("install cabal prerelease", ToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))+    , ("install cabal prerelease", ToolTag Prerelease)     , ("install cabal latest-prerelease", ToolTag LatestPrerelease)     , ("install cabal latest-nightly", ToolTag LatestNightly)     , ("install cabal base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))@@ -96,7 +93,7 @@     , ("install hls latest", ToolTag Latest)     , ("install hls nightly", ToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))     , ("install hls recommended", ToolTag Recommended)-    , ("install hls prerelease", ToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))+    , ("install hls prerelease", ToolTag Prerelease)     , ("install hls latest-prerelease", ToolTag LatestPrerelease)     , ("install hls latest-nightly", ToolTag LatestNightly)     , ("install hls base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))@@ -111,7 +108,7 @@     , ("install stack latest", ToolTag Latest)     , ("install stack nightly", ToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))     , ("install stack recommended", ToolTag Recommended)-    , ("install stack prerelease", ToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))+    , ("install stack prerelease", ToolTag Prerelease)     , ("install stack latest-prerelease", ToolTag LatestPrerelease)     , ("install stack latest-nightly", ToolTag LatestNightly)     , ("install stack base-4.18", ToolTag (Base (PVP {_pComponents = 4 :| [18]})))
test/optparse-test/SetTest.hs view
@@ -38,11 +38,7 @@           $(versionQ "nightly")     )   , ("set ghc recommended", SetToolTag Recommended)-  , ("set ghc prerelease", SetGHCVersion-        $ (`TargetVersionReq` Nothing) $ TargetVersion-          Nothing-          $(versionQ "prerelease")-    )+  , ("set ghc prerelease", SetToolTag Prerelease)   , ("set ghc latest-prerelease", SetToolTag LatestPrerelease)   , ("set ghc latest-nightly", SetToolTag LatestNightly)   , ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion@@ -61,7 +57,7 @@   , ("set cabal latest", SetToolTag Latest)   , ("set cabal nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))   , ("set cabal recommended", SetToolTag Recommended)-  , ("set cabal prerelease", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))+  , ("set cabal prerelease", SetToolTag Prerelease)   , ("set cabal latest-prerelease", SetToolTag LatestPrerelease)   , ("set cabal latest-nightly", SetToolTag LatestNightly)   , ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))@@ -76,7 +72,7 @@   , ("set hls latest", SetToolTag Latest)   , ("set hls nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))   , ("set hls recommended", SetToolTag Recommended)-  , ("set hls prerelease", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))+  , ("set hls prerelease", SetToolTag Prerelease)   , ("set hls latest-prerelease", SetToolTag LatestPrerelease)   , ("set hls latest-nightly", SetToolTag LatestNightly)   , ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))@@ -91,7 +87,7 @@   , ("set stack latest", SetToolTag Latest)   , ("set stack nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))   , ("set stack recommended", SetToolTag Recommended)-  , ("set stack prerelease", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "prerelease"))+  , ("set stack prerelease", SetToolTag Prerelease)   , ("set stack latest-prerelease", SetToolTag LatestPrerelease)   , ("set stack latest-nightly", SetToolTag LatestNightly)   , ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))