WIP
This commit is contained in:
		
							parent
							
								
									e0222b4007
								
							
						
					
					
						commit
						ff60744cc6
					
				| @ -9,7 +9,7 @@ constraints: http-io-streams -brotli, | ||||
|              any.aeson >= 2.0.1.0 | ||||
| 
 | ||||
| package libarchive | ||||
|   flags: -system-libarchive | ||||
|   flags: +system-libarchive | ||||
| 
 | ||||
| package aeson-pretty | ||||
|   flags: +lib-only | ||||
|  | ||||
| @ -177,7 +177,7 @@ installCabalBin :: ( MonadMask m | ||||
|                    , MonadUnliftIO m | ||||
|                    , MonadFail m | ||||
|                    ) | ||||
|                 => Version | ||||
|                 => VersionRev | ||||
|                 -> InstallDir | ||||
|                 -> Bool           -- force install | ||||
|                 -> Excepts | ||||
| @ -198,7 +198,7 @@ installCabalBin :: ( MonadMask m | ||||
|                      () | ||||
| installCabalBin ver installDir forceInstall = do | ||||
|   dlinfo <- liftE $ getDownloadInfo Cabal ver | ||||
|   installCabalBindist dlinfo ver installDir forceInstall | ||||
|   installCabalBindist dlinfo (vVersion ver) installDir forceInstall | ||||
| 
 | ||||
| 
 | ||||
|     ----------------- | ||||
|  | ||||
| @ -277,20 +277,19 @@ getDownloadInfo :: ( MonadReader env m | ||||
|                    , HasGHCupInfo env | ||||
|                    ) | ||||
|                 => Tool | ||||
|                 -> Version | ||||
|                 -> VersionRev | ||||
|                 -- ^ tool version | ||||
|                 -> Excepts | ||||
|                      '[NoDownload] | ||||
|                      m | ||||
|                      DownloadInfo | ||||
| getDownloadInfo t v = do | ||||
| getDownloadInfo t (VersionRev v vr) = do | ||||
|   (PlatformRequest a p mv) <- lift getPlatformReq | ||||
|   GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo | ||||
| 
 | ||||
|   let distro_preview f g = | ||||
|         let platformVersionSpec = | ||||
|               -- TODO | ||||
|               preview (ix t % ix v % viDownload % ix 0 % viArch % ix a % ix (f p)) dls | ||||
|               preview (ix t % ix v % viDownload % ix vr % viArch % ix a % ix (f p)) dls | ||||
|             mv' = g mv | ||||
|         in  fmap snd | ||||
|               .   find | ||||
|  | ||||
| @ -78,6 +78,7 @@ import qualified Data.Text                     as T | ||||
| import qualified Data.Text.IO                  as T | ||||
| import qualified Data.Text.Encoding            as E | ||||
| import qualified Text.Megaparsec               as MP | ||||
| import qualified Data.Map.Strict               as M | ||||
| 
 | ||||
| 
 | ||||
| data GHCVer v = SourceDist v | ||||
| @ -105,7 +106,7 @@ testGHCVer :: ( MonadFail m | ||||
|               , MonadIO m | ||||
|               , MonadUnliftIO m | ||||
|               ) | ||||
|            => Version | ||||
|            => VersionRev | ||||
|            -> [T.Text] | ||||
|            -> Excepts | ||||
|                 '[ DigestError | ||||
| @ -120,12 +121,11 @@ testGHCVer :: ( MonadFail m | ||||
|                  ] | ||||
|                 m | ||||
|                 () | ||||
| testGHCVer ver addMakeArgs = do | ||||
| testGHCVer (VersionRev ver vr) addMakeArgs = do | ||||
|   GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo | ||||
| 
 | ||||
|   dlInfo <- | ||||
|     -- TODO | ||||
|     preview (ix GHC % ix ver % viDownload % ix 0 % viTestDL % _Just) dls | ||||
|     preview (ix GHC % ix ver % viDownload % to M.toAscList % maybe _last ix vr % to snd % viTestDL % _Just) dls | ||||
|       ?? NoDownload | ||||
| 
 | ||||
|   liftE $ testGHCBindist dlInfo ver addMakeArgs | ||||
| @ -244,7 +244,7 @@ fetchGHCSrc :: ( MonadFail m | ||||
|                , MonadIO m | ||||
|                , MonadUnliftIO m | ||||
|                ) | ||||
|             => Version | ||||
|             => VersionRev | ||||
|             -> Maybe FilePath | ||||
|             -> Excepts | ||||
|                  '[ DigestError | ||||
| @ -255,11 +255,10 @@ fetchGHCSrc :: ( MonadFail m | ||||
|                   ] | ||||
|                  m | ||||
|                  FilePath | ||||
| fetchGHCSrc v mfp = do | ||||
| fetchGHCSrc (VersionRev v vr) mfp = do | ||||
|   GHCupInfo { _ghcupDownloads = dls } <- lift getGHCupInfo | ||||
|   dlInfo <- | ||||
|     -- TODO | ||||
|     preview (ix GHC % ix v % viDownload % ix 0 % viSourceDL % _Just) dls | ||||
|     preview (ix GHC % ix v % viDownload % to M.toAscList % maybe _last ix vr % to snd % viSourceDL % _Just) dls | ||||
|       ?? NoDownload | ||||
|   liftE $ downloadCached' dlInfo Nothing mfp | ||||
| 
 | ||||
| @ -806,8 +805,7 @@ compileGHC targetGhc ov bstrap jobs mbuildConfig patches aargs buildFlavour hadr | ||||
| 
 | ||||
|         -- download source tarball | ||||
|         dlInfo <- | ||||
|           -- TODO | ||||
|           preview (ix GHC % ix (tver ^. tvVersion) % viDownload % ix 0 % viSourceDL % _Just) dls | ||||
|           preview (ix GHC % ix (tver ^. tvVersion) % viDownload % _last % viSourceDL % _Just) dls | ||||
|             ?? NoDownload | ||||
|         dl <- liftE $ downloadCached dlInfo Nothing | ||||
| 
 | ||||
|  | ||||
| @ -368,8 +368,7 @@ compileHLS targetHLS ghcs jobs ov installDir cabalProject cabalProjectLocal upda | ||||
| 
 | ||||
|       -- download source tarball | ||||
|       dlInfo <- | ||||
|         -- TODO | ||||
|         preview (ix HLS % ix tver % viDownload % ix 0 % viSourceDL % _Just) dls | ||||
|         preview (ix HLS % ix tver % viDownload % _last % viSourceDL % _Just) dls | ||||
|           ?? NoDownload | ||||
|       dl <- liftE $ downloadCached dlInfo Nothing | ||||
| 
 | ||||
|  | ||||
| @ -28,6 +28,8 @@ import           System.FilePath | ||||
| import qualified Data.List.NonEmpty            as NE | ||||
| import qualified Data.Text                     as T | ||||
| import qualified Text.Megaparsec               as MP | ||||
| import Data.Char (digitToInt) | ||||
| import Data.Data (Proxy(..)) | ||||
| 
 | ||||
| 
 | ||||
| choice' :: (MonadFail f, MP.MonadParsec e s f) => [f a] -> f a | ||||
| @ -86,7 +88,33 @@ ghcTargetVerP = | ||||
|     <$> (MP.try (Just <$> parseUntil1 (MP.chunk "-" *> verP') <* MP.chunk "-") | ||||
|         <|> ((\ _ x -> x) Nothing <$> mempty) | ||||
|         ) | ||||
|     <*> (version' <* MP.eof) | ||||
|     <*> version' | ||||
|  where | ||||
|   verP' :: MP.Parsec Void Text Text | ||||
|   verP' = do | ||||
|     v <- version' | ||||
|     let startsWithDigists = | ||||
|           and | ||||
|             . take 3 | ||||
|             . concatMap | ||||
|               (map | ||||
|                 (\case | ||||
|                   (Digits _) -> True | ||||
|                   (Str    _) -> False | ||||
|                 ) . NE.toList) | ||||
|             . NE.toList | ||||
|             $ _vChunks v | ||||
|     if startsWithDigists && isNothing (_vEpoch v) | ||||
|       then pure $ prettyVer v | ||||
|       else fail "Oh" | ||||
| 
 | ||||
| ghcTargetVerRevP :: MP.Parsec Void Text GHCTargetVersionRev | ||||
| ghcTargetVerRevP = | ||||
|   (\x y -> GHCTargetVersionRev x y) | ||||
|     <$> (MP.try (Just <$> parseUntil1 (MP.chunk "-" *> verP') <* MP.chunk "-") | ||||
|         <|> ((\ _ x -> x) Nothing <$> mempty) | ||||
|         ) | ||||
|     <*> versionRevP | ||||
|  where | ||||
|   verP' :: MP.Parsec Void Text Text | ||||
|   verP' = do | ||||
| @ -122,3 +150,44 @@ verP suffix = do | ||||
| 
 | ||||
| pathSep :: MP.Parsec Void Text Char | ||||
| pathSep = MP.oneOf pathSeparators | ||||
| 
 | ||||
| versionRevP :: MP.Parsec Void Text VersionRev | ||||
| versionRevP = MP.label "versionRev" $ | ||||
|   MP.try (parseUntil (MP.try (MP.chunk "-r")) >>= versionWithRev) <|> ((`VersionRev` 0) <$> version') | ||||
|  where | ||||
|   versionWithRev ver = do | ||||
|     rest <- MP.getInput | ||||
|     MP.setInput ver | ||||
|     v <- version' | ||||
|     MP.setInput rest | ||||
|     _ <- MP.chunk "-r" | ||||
|     rev <- parseInt | ||||
|     pure $ VersionRev v rev | ||||
| 
 | ||||
|   digit = MP.oneOf ['0'..'9'] MP.<?> "digit" | ||||
|   parseInt :: MP.Parsec Void Text Int | ||||
|   parseInt = MP.label "parseInt" $ do | ||||
|     i <- MP.tokensToChunk (Proxy :: Proxy Text) <$> some digit | ||||
|     pure $ numberValue 10 $ T.unpack i | ||||
| 
 | ||||
|   numberValue :: Int -> String -> Int | ||||
|   numberValue base = foldl (\ x -> ((fromIntegral base * x) +) . fromIntegral . digitToInt) 0 | ||||
| 
 | ||||
| userVersionRevP :: MP.Parsec Void Text UserVersionRev | ||||
| userVersionRevP = MP.label "userVersionRev" $ | ||||
|   ((\(VersionRev v r) -> UserVersionRev v (Just r)) <$> MP.try versionRevP) <|> ((`UserVersionRev` Nothing) <$> version') | ||||
| 
 | ||||
| 
 | ||||
| -- | Read a @VersionRev@ from a String. | ||||
| -- | ||||
| -- - 3.3.2    -> VersionRev { vVersion = 3.3.3, vRev = 0 } | ||||
| -- - 2.3.4-r3 -> VersionRev { vVersion = 2.3.4, vRev = 3 } | ||||
| versionRev :: Text -> Either (MP.ParseErrorBundle Text Void) VersionRev | ||||
| versionRev = MP.parse versionRevP "" | ||||
| 
 | ||||
| -- | Read a @UserVersionRev@ from a String. | ||||
| -- | ||||
| -- - 3.3.2    -> UserVersionRev { vVersion = 3.3.3, vRev = Nothing } | ||||
| -- - 2.3.4-r3 -> UserVersionRev { vVersion = 2.3.4, vRev = Just 3 } | ||||
| userVersionRev :: Text -> Either (MP.ParseErrorBundle Text Void) UserVersionRev | ||||
| userVersionRev = MP.parse userVersionRevP "" | ||||
|  | ||||
| @ -181,6 +181,30 @@ fromVersionInfoLegacy VersionInfoLegacy{..} = | ||||
|               , ..} | ||||
| 
 | ||||
| 
 | ||||
| -- | A version with a revision, denoting bindist 'versions' that are purely distribution specific. | ||||
| -- | ||||
| -- The revision starts at 0. | ||||
| data VersionRev = VersionRev { vVersion :: Version, vRev :: Int } | ||||
|   deriving (Ord, Eq, GHC.Generic, Show) | ||||
| 
 | ||||
| showVersionRev :: VersionRev -> Text | ||||
| showVersionRev (VersionRev v 0) = prettyVer v | ||||
| showVersionRev (VersionRev v r) = prettyVer v <> "-r" <> T.pack (show r) | ||||
| 
 | ||||
| -- | Similar to @VersionRev@, except that revision is optional. The absence of a revision has | ||||
| -- a particular meaning: | ||||
| -- | ||||
| -- * for install/prefetch: we want the latest available revision | ||||
| -- * for compile: it depends | ||||
| -- * for rm/set/unset/whereis/changelog: we want the revision that is installed (there can be only one) | ||||
| -- | ||||
| -- Translating @UserVersionRev@ to @VersionRev@ requires context of the GHCup metadata, | ||||
| -- installed versions and the to be executed command. | ||||
| data UserVersionRev = UserVersionRev { uvVersion :: Version, uvRev :: Maybe Int } | ||||
|   deriving (Ord, Eq, GHC.Generic, Show) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| -- | A tag. These are currently attached to a version of a tool. | ||||
| data Tag = Latest | ||||
|          | Recommended | ||||
| @ -617,12 +641,6 @@ data GHCTargetVersion = GHCTargetVersion | ||||
|   } | ||||
|   deriving (Ord, Eq, Show) | ||||
| 
 | ||||
| data GitBranch = GitBranch | ||||
|   { ref  :: String | ||||
|   , repo :: Maybe String | ||||
|   } | ||||
|   deriving (Ord, Eq, Show) | ||||
| 
 | ||||
| mkTVer :: Version -> GHCTargetVersion | ||||
| mkTVer = GHCTargetVersion Nothing | ||||
| 
 | ||||
| @ -630,10 +648,30 @@ tVerToText :: GHCTargetVersion -> Text | ||||
| tVerToText (GHCTargetVersion (Just t) v') = t <> "-" <> prettyVer v' | ||||
| tVerToText (GHCTargetVersion Nothing  v') = prettyVer v' | ||||
| 
 | ||||
| -- | A GHC identified by the target platform triple | ||||
| -- and the version. | ||||
| data GHCTargetVersionRev = GHCTargetVersionRev | ||||
|   { _tvTargetRev  :: Maybe Text | ||||
|   , _tvVersionRev :: VersionRev | ||||
|   } | ||||
|   deriving (Ord, Eq, Show) | ||||
| 
 | ||||
| mkTVerRev :: VersionRev -> GHCTargetVersionRev | ||||
| mkTVerRev = GHCTargetVersionRev Nothing | ||||
| 
 | ||||
| tVerRevToText :: GHCTargetVersionRev -> Text | ||||
| tVerRevToText (GHCTargetVersionRev (Just t) v') = t <> "-" <> showVersionRev v' | ||||
| tVerRevToText (GHCTargetVersionRev Nothing  v') = showVersionRev v' | ||||
| 
 | ||||
| -- | Assembles a path of the form: <target-triple>-<version> | ||||
| instance Pretty GHCTargetVersion where | ||||
|   pPrint = text . T.unpack . tVerToText | ||||
| 
 | ||||
| data GitBranch = GitBranch | ||||
|   { ref  :: String | ||||
|   , repo :: Maybe String | ||||
|   } | ||||
|   deriving (Ord, Eq, Show) | ||||
| 
 | ||||
| -- | A comparator and a version. | ||||
| data VersionCmp = VR_gt Versioning | ||||
|  | ||||
| @ -160,7 +160,7 @@ rmMinorGHCSymlinks :: ( MonadReader env m | ||||
| rmMinorGHCSymlinks tv@GHCTargetVersion{..} = do | ||||
|   Dirs {..}  <- lift getDirs | ||||
| 
 | ||||
|   files                         <- liftE $ ghcToolFiles tv | ||||
|   files <- liftE $ ghcToolFiles tv | ||||
|   forM_ files $ \f -> do | ||||
|     let f_xyz = f <> "-" <> T.unpack (prettyVer _tvVersion) <> exeExt | ||||
|     let fullF = binDir </> f_xyz | ||||
| @ -181,7 +181,7 @@ rmPlainGHC :: ( MonadReader env m | ||||
|            -> Excepts '[NotInstalled] m () | ||||
| rmPlainGHC target = do | ||||
|   Dirs {..}  <- lift getDirs | ||||
|   mtv                           <- lift $ ghcSet target | ||||
|   mtv <- lift $ ghcSet target | ||||
|   forM_ mtv $ \tv -> do | ||||
|     files <- liftE $ ghcToolFiles tv | ||||
|     forM_ files $ \f -> do | ||||
| @ -228,7 +228,7 @@ rmMinorHLSSymlinks :: ( MonadReader env m | ||||
|                       , MonadFail m | ||||
|                       , MonadMask m | ||||
|                       ) | ||||
|                    => Version | ||||
|                    => VersionRev | ||||
|                    -> Excepts '[NotInstalled] m () | ||||
| rmMinorHLSSymlinks ver = do | ||||
|   Dirs {..}  <- lift getDirs | ||||
| @ -281,7 +281,7 @@ rmPlainHLS = do | ||||
|     ----------------------------------- | ||||
| 
 | ||||
| 
 | ||||
| -- | Whether the given GHC versin is installed. | ||||
| -- | Whether the given GHC version is installed. | ||||
| ghcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool | ||||
| ghcInstalled ver = do | ||||
|   ghcdir <- ghcupGHCDir ver | ||||
| @ -299,7 +299,7 @@ ghcSrcInstalled ver = do | ||||
| ghcSet :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m) | ||||
|        => Maybe Text   -- ^ the target of the GHC version, if any | ||||
|                        --  (e.g. armv7-unknown-linux-gnueabihf) | ||||
|        -> m (Maybe GHCTargetVersion) | ||||
|        -> m (Maybe GHCTargetVersionRev) | ||||
| ghcSet mtarget = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   let ghc = maybe "ghc" (\t -> T.unpack t <> "-ghc") mtarget | ||||
| @ -311,7 +311,7 @@ ghcSet mtarget = do | ||||
|     link <- liftIO $ getLinkTarget ghcBin | ||||
|     Just <$> ghcLinkVersion link | ||||
|  where | ||||
|   ghcLinkVersion :: MonadThrow m => FilePath -> m GHCTargetVersion | ||||
|   ghcLinkVersion :: MonadThrow m => FilePath -> m GHCTargetVersionRev | ||||
|   ghcLinkVersion (T.pack . dropSuffix exeExt -> t) = throwEither $ MP.parse parser "ghcLinkVersion" t | ||||
|    where | ||||
|     parser = | ||||
| @ -321,7 +321,7 @@ ghcSet mtarget = do | ||||
|            r    <- parseUntil1 pathSep | ||||
|            rest <- MP.getInput | ||||
|            MP.setInput r | ||||
|            x <- ghcTargetVerP | ||||
|            x <- ghcTargetVerRevP | ||||
|            MP.setInput rest | ||||
|            pure x | ||||
|          ) | ||||
| @ -347,13 +347,13 @@ getInstalledCabals :: ( MonadReader env m | ||||
|                       , MonadIO m | ||||
|                       , MonadCatch m | ||||
|                       ) | ||||
|                    => m [Either FilePath Version] | ||||
|                    => m [Either FilePath VersionRev] | ||||
| getInstalledCabals = do | ||||
|   Dirs {..} <- getDirs | ||||
|   bins   <- liftIO $ handleIO (\_ -> pure []) $ findFiles | ||||
|     binDir | ||||
|     (makeRegexOpts compExtended execBlank ([s|^cabal-.*$|] :: ByteString)) | ||||
|   vs <- forM bins $ \f -> case version . T.pack <$> (stripSuffix exeExt =<< stripPrefix "cabal-" f) of | ||||
|   vs <- forM bins $ \f -> case versionRev . T.pack <$> (stripSuffix exeExt =<< stripPrefix "cabal-" f) of | ||||
|     Just (Right r) -> pure $ Right r | ||||
|     Just (Left  _) -> pure $ Left f | ||||
|     Nothing        -> pure $ Left f | ||||
| @ -361,14 +361,14 @@ getInstalledCabals = do | ||||
| 
 | ||||
| 
 | ||||
| -- | Whether the given cabal version is installed. | ||||
| cabalInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool | ||||
| cabalInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => VersionRev -> m Bool | ||||
| cabalInstalled ver = do | ||||
|   vers <- fmap rights getInstalledCabals | ||||
|   pure $ elem ver vers | ||||
| 
 | ||||
| 
 | ||||
| -- Return the currently set cabal version, if any. | ||||
| cabalSet :: (HasLog env, MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version) | ||||
| cabalSet :: (HasLog env, MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe VersionRev) | ||||
| cabalSet = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   let cabalbin = binDir </> "cabal" <> exeExt | ||||
| @ -395,7 +395,7 @@ cabalSet = do | ||||
|   -- We try to be extra permissive with link destination parsing, | ||||
|   -- because of: | ||||
|   --   https://gitlab.haskell.org/haskell/ghcup-hs/-/issues/119 | ||||
|   linkVersion :: MonadThrow m => FilePath -> m Version | ||||
|   linkVersion :: MonadThrow m => FilePath -> m VersionRev | ||||
|   linkVersion = throwEither . MP.parse parser "linkVersion" . T.pack . dropSuffix exeExt | ||||
| 
 | ||||
|   parser | ||||
| @ -403,7 +403,7 @@ cabalSet = do | ||||
|     <|> MP.try (stripRelativePath *> cabalParse) | ||||
|     <|> cabalParse | ||||
|   -- parses the version of "cabal-3.2.0.0" -> "3.2.0.0" | ||||
|   cabalParse = MP.chunk "cabal-" *> version' | ||||
|   cabalParse = MP.chunk "cabal-" *> versionRevP | ||||
|   -- parses any path component ending with path separator, | ||||
|   -- e.g. "foo/" | ||||
|   stripPathComponet = parseUntil1 pathSep *> MP.some pathSep | ||||
| @ -420,7 +420,7 @@ cabalSet = do | ||||
| -- @~\/.ghcup\/bin/haskell-language-server-wrapper-<\hlsver\>@, | ||||
| -- as well as @~\/.ghcup\/hls\/<\hlsver\>@ | ||||
| getInstalledHLSs :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) | ||||
|                  => m [Either FilePath Version] | ||||
|                  => m [Either FilePath VersionRev] | ||||
| getInstalledHLSs = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   bins                          <- liftIO $ handleIO (\_ -> pure []) $ findFiles | ||||
| @ -431,7 +431,7 @@ getInstalledHLSs = do | ||||
|     ) | ||||
|   legacy <- forM bins $ \f -> | ||||
|     case | ||||
|           version . T.pack <$> (stripSuffix exeExt =<< stripPrefix "haskell-language-server-wrapper-" f) | ||||
|           versionRev . T.pack <$> (stripSuffix exeExt =<< stripPrefix "haskell-language-server-wrapper-" f) | ||||
|       of | ||||
|         Just (Right r) -> pure $ Right r | ||||
|         Just (Left  _) -> pure $ Left f | ||||
| @ -448,7 +448,7 @@ getInstalledHLSs = do | ||||
| -- | Get all installed stacks, by matching on | ||||
| -- @~\/.ghcup\/bin/stack-<\stackver\>@. | ||||
| getInstalledStacks :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) | ||||
|                    => m [Either FilePath Version] | ||||
|                    => m [Either FilePath VersionRev] | ||||
| getInstalledStacks = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   bins                          <- liftIO $ handleIO (\_ -> pure []) $ findFiles | ||||
| @ -458,7 +458,7 @@ getInstalledStacks = do | ||||
|                    ([s|^stack-.*$|] :: ByteString) | ||||
|     ) | ||||
|   forM bins $ \f -> | ||||
|     case version . T.pack <$> (stripSuffix exeExt =<< stripPrefix "stack-" f) of | ||||
|     case versionRev . T.pack <$> (stripSuffix exeExt =<< stripPrefix "stack-" f) of | ||||
|         Just (Right r) -> pure $ Right r | ||||
|         Just (Left  _) -> pure $ Left f | ||||
|         Nothing        -> pure $ Left f | ||||
| @ -509,13 +509,13 @@ stackSet = do | ||||
|     stripRelativePath = MP.many (MP.try stripPathComponet) | ||||
| 
 | ||||
| -- | Whether the given Stack version is installed. | ||||
| stackInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool | ||||
| stackInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => VersionRev -> m Bool | ||||
| stackInstalled ver = do | ||||
|   vers <- fmap rights getInstalledStacks | ||||
|   pure $ elem ver vers | ||||
| 
 | ||||
| -- | Whether the given HLS version is installed. | ||||
| hlsInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool | ||||
| hlsInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => VersionRev -> m Bool | ||||
| hlsInstalled ver = do | ||||
|   vers <- fmap rights getInstalledHLSs | ||||
|   pure $ elem ver vers | ||||
| @ -527,7 +527,7 @@ isLegacyHLS ver = do | ||||
| 
 | ||||
| 
 | ||||
| -- Return the currently set hls version, if any. | ||||
| hlsSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version) | ||||
| hlsSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe VersionRev) | ||||
| hlsSet = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   let hlsBin = binDir </> "haskell-language-server-wrapper" <> exeExt | ||||
| @ -540,7 +540,7 @@ hlsSet = do | ||||
|         link <- liftIO $ getLinkTarget hlsBin | ||||
|         Just <$> linkVersion link | ||||
|  where | ||||
|   linkVersion :: MonadThrow m => FilePath -> m Version | ||||
|   linkVersion :: MonadThrow m => FilePath -> m VersionRev | ||||
|   linkVersion = throwEither . MP.parse parser "" . T.pack . dropSuffix exeExt | ||||
|    where | ||||
|     parser | ||||
| @ -548,7 +548,7 @@ hlsSet = do | ||||
|       <|> MP.try (stripRelativePath *> cabalParse) | ||||
|       <|> cabalParse | ||||
|     -- parses the version of "haskell-language-server-wrapper-1.1.0" -> "1.1.0" | ||||
|     cabalParse = MP.chunk "haskell-language-server-wrapper-" *> version' | ||||
|     cabalParse = MP.chunk "haskell-language-server-wrapper-" *> versionRevP | ||||
|     -- parses any path component ending with path separator, | ||||
|     -- e.g. "foo/" | ||||
|     stripPathComponet = parseUntil1 pathSep *> MP.some pathSep | ||||
| @ -567,7 +567,7 @@ hlsGHCVersions :: ( MonadReader env m | ||||
|                   , MonadThrow m | ||||
|                   , MonadCatch m | ||||
|                   ) | ||||
|                => m [Version] | ||||
|                => m [VersionRev] | ||||
| hlsGHCVersions = do | ||||
|   h <- hlsSet | ||||
|   fromMaybe [] <$> forM h hlsGHCVersions' | ||||
| @ -579,12 +579,12 @@ hlsGHCVersions' :: ( MonadReader env m | ||||
|                    , MonadThrow m | ||||
|                    , MonadCatch m | ||||
|                    ) | ||||
|                 => Version | ||||
|                 -> m [Version] | ||||
|                 => VersionRev | ||||
|                 -> m [VersionRev] | ||||
| hlsGHCVersions' v' = do | ||||
|   bins <- hlsServerBinaries v' Nothing | ||||
|   let vers = fmap | ||||
|         (version | ||||
|         (versionRev | ||||
|           . T.pack | ||||
|           . fromJust | ||||
|           . stripPrefix "haskell-language-server-" | ||||
| @ -597,10 +597,10 @@ hlsGHCVersions' v' = do | ||||
| 
 | ||||
| -- | Get all server binaries for an hls version from the ~/.ghcup/bin directory, if any. | ||||
| hlsServerBinaries :: (MonadReader env m, HasDirs env, MonadIO m) | ||||
|                   => Version | ||||
|                   => VersionRev | ||||
|                   -> Maybe Version   -- ^ optional GHC version | ||||
|                   -> m [FilePath] | ||||
| hlsServerBinaries ver mghcVer = do | ||||
| hlsServerBinaries (VersionRev ver rv) mghcVer = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   liftIO $ handleIO (\_ -> pure []) $ findFiles | ||||
|     binDir | ||||
| @ -611,6 +611,7 @@ hlsServerBinaries ver mghcVer = do | ||||
|         <> maybe [s|.*|] escapeVerRex mghcVer | ||||
|         <> [s|~|] | ||||
|         <> escapeVerRex ver | ||||
|         <> E.encodeUtf8 (T.pack ("-r" <> show rv)) | ||||
|         <> E.encodeUtf8 (T.pack exeExt) | ||||
|         <> [s|$|] :: ByteString | ||||
|       ) | ||||
| @ -657,16 +658,20 @@ hlsInternalServerLibs ver ghcVer = do | ||||
| 
 | ||||
| -- | Get the wrapper binary for an hls version, if any. | ||||
| hlsWrapperBinary :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m) | ||||
|                  => Version | ||||
|                  => VersionRev | ||||
|                  -> m (Maybe FilePath) | ||||
| hlsWrapperBinary ver = do | ||||
| hlsWrapperBinary (VersionRev ver rv) = do | ||||
|   Dirs {..}  <- getDirs | ||||
|   wrapper <- liftIO $ handleIO (\_ -> pure []) $ findFiles | ||||
|     binDir | ||||
|     (makeRegexOpts | ||||
|       compExtended | ||||
|       execBlank | ||||
|       ([s|^haskell-language-server-wrapper-|] <> escapeVerRex ver <> E.encodeUtf8 (T.pack exeExt) <> [s|$|] :: ByteString | ||||
|       ([s|^haskell-language-server-wrapper-|] | ||||
|       <> escapeVerRex ver | ||||
|       <> E.encodeUtf8 (T.pack ("-r" <> show rv)) | ||||
|       <> E.encodeUtf8 (T.pack exeExt) | ||||
|       <> [s|$|] :: ByteString | ||||
|       ) | ||||
|     ) | ||||
|   case wrapper of | ||||
| @ -677,7 +682,7 @@ hlsWrapperBinary ver = do | ||||
| 
 | ||||
| 
 | ||||
| -- | Get all binaries for an hls version, if any. | ||||
| hlsAllBinaries :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) => Version -> m [FilePath] | ||||
| hlsAllBinaries :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) => VersionRev -> m [FilePath] | ||||
| hlsAllBinaries ver = do | ||||
|   hls     <- hlsServerBinaries ver Nothing | ||||
|   wrapper <- hlsWrapperBinary ver | ||||
| @ -930,7 +935,7 @@ ghcInternalBinDir ver = do | ||||
| -- | ||||
| --   - @["hsc2hs","haddock","hpc","runhaskell","ghc","ghc-pkg","ghci","runghc","hp2ps"]@ | ||||
| ghcToolFiles :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m) | ||||
|              => GHCTargetVersion | ||||
|              => GHCTargetVersionRev | ||||
|              -> Excepts '[NotInstalled] m [FilePath] | ||||
| ghcToolFiles ver = do | ||||
|   bindir <- ghcInternalBinDir ver | ||||
| @ -1288,7 +1293,7 @@ warnAboutHlsCompatibility :: ( MonadReader env m | ||||
|                           => m () | ||||
| warnAboutHlsCompatibility = do | ||||
|   supportedGHC <- hlsGHCVersions | ||||
|   currentGHC   <- fmap _tvVersion <$> ghcSet Nothing | ||||
|   currentGHC   <- fmap _tvVersionRev <$> ghcSet Nothing | ||||
|   currentHLS   <- hlsSet | ||||
| 
 | ||||
|   case (currentGHC, currentHLS) of | ||||
|  | ||||
| @ -417,9 +417,9 @@ parseGHCupGHCDir :: MonadThrow m => FilePath -> m GHCTargetVersion | ||||
| parseGHCupGHCDir (T.pack -> fp) = | ||||
|   throwEither $ MP.parse ghcTargetVerP "" fp | ||||
| 
 | ||||
| parseGHCupHLSDir :: MonadThrow m => FilePath -> m Version | ||||
| parseGHCupHLSDir :: MonadThrow m => FilePath -> m VersionRev | ||||
| parseGHCupHLSDir (T.pack -> fp) = | ||||
|   throwEither $ MP.parse version' "" fp | ||||
|   throwEither $ versionRev fp | ||||
| 
 | ||||
| -- TODO: inlined from GHCup.Prelude | ||||
| throwEither :: (Exception a, MonadThrow m) => Either a b -> m b | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user