Copyright | (c) Julian Ospald 2020 |
---|---|
License | LGPL-3.0 |
Maintainer | hasufell@hasufell.de |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
This module contains GHCup helpers specific to installation and introspection of files/versions etc.
Synopsis
- module GHCup.Utils.Dirs
- binarySymLinkDestination :: (MonadThrow m, MonadIO m) => FilePath -> FilePath -> m FilePath
- rmMinorGHCSymlinks :: (MonadReader env m, HasDirs env, MonadIO m, HasLog env, MonadThrow m, MonadFail m, MonadMask m) => GHCTargetVersion -> Excepts '[NotInstalled] m ()
- rmPlainGHC :: (MonadReader env m, HasDirs env, HasLog env, MonadThrow m, MonadFail m, MonadIO m, MonadMask m) => Maybe Text -> Excepts '[NotInstalled] m ()
- rmMajorGHCSymlinks :: (MonadReader env m, HasDirs env, MonadIO m, HasLog env, MonadThrow m, MonadFail m, MonadMask m) => GHCTargetVersion -> Excepts '[NotInstalled] m ()
- rmMinorHLSSymlinks :: (MonadReader env m, HasDirs env, MonadIO m, HasLog env, MonadThrow m, MonadFail m, MonadMask m) => Version -> Excepts '[NotInstalled] m ()
- rmPlainHLS :: (MonadReader env m, HasDirs env, HasLog env, MonadThrow m, MonadFail m, MonadIO m, MonadMask m) => Excepts '[NotInstalled] m ()
- ghcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool
- ghcSrcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool
- ghcSet :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m) => Maybe Text -> m (Maybe GHCTargetVersion)
- getInstalledGHCs :: (MonadReader env m, HasDirs env, MonadIO m) => m [Either FilePath GHCTargetVersion]
- getInstalledCabals :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) => m [Either FilePath Version]
- cabalInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool
- cabalSet :: (HasLog env, MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version)
- getInstalledHLSs :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) => m [Either FilePath Version]
- getInstalledStacks :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) => m [Either FilePath Version]
- stackSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m, HasLog env) => m (Maybe Version)
- stackInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool
- hlsInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool
- isLegacyHLS :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool
- hlsSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version)
- hlsGHCVersions :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m [Version]
- hlsGHCVersions' :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => Version -> m [Version]
- hlsServerBinaries :: (MonadReader env m, HasDirs env, MonadIO m) => Version -> Maybe Version -> m [FilePath]
- hlsInternalServerScripts :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) => Version -> Maybe Version -> m [FilePath]
- hlsInternalServerBinaries :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadFail m) => Version -> Maybe Version -> m [FilePath]
- hlsInternalServerLibs :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadFail m) => Version -> Version -> m [FilePath]
- hlsWrapperBinary :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m) => Version -> m (Maybe FilePath)
- hlsAllBinaries :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) => Version -> m [FilePath]
- getMajorMinorV :: MonadThrow m => Version -> m (Int, Int)
- matchMajor :: Version -> Int -> Int -> Bool
- matchPVPrefix :: PVP -> PVP -> Bool
- toL :: PVP -> [Int]
- getGHCForPVP :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) => PVP -> Maybe Text -> m (Maybe GHCTargetVersion)
- getGHCForPVP' :: MonadThrow m => PVP -> [(PVP, Text, Maybe Text)] -> Maybe Text -> m (Maybe GHCTargetVersion)
- getLatestToolFor :: MonadThrow m => Tool -> PVP -> GHCupDownloads -> m (Maybe (PVP, VersionInfo))
- unpackToDir :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m) => FilePath -> FilePath -> Excepts '[UnknownArchive, ArchiveResult] m ()
- getArchiveFiles :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m) => FilePath -> Excepts '[UnknownArchive, ArchiveResult] m [FilePath]
- intoSubdir :: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m, MonadCatch m) => FilePath -> TarDir -> Excepts '[TarDirDoesNotExist] m FilePath
- getTagged :: Tag -> Fold (Map Version VersionInfo) (Version, VersionInfo)
- getLatest :: GHCupDownloads -> Tool -> Maybe (Version, VersionInfo)
- getRecommended :: GHCupDownloads -> Tool -> Maybe (Version, VersionInfo)
- getLatestBaseVersion :: GHCupDownloads -> PVP -> Maybe (Version, VersionInfo)
- ghcInternalBinDir :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m) => GHCTargetVersion -> m FilePath
- ghcToolFiles :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m) => GHCTargetVersion -> Excepts '[NotInstalled] m [FilePath]
- ghcUpSrcBuiltFile :: FilePath
- make :: (MonadThrow m, MonadIO m, MonadReader env m, HasDirs env, HasLog env, HasSettings env) => [String] -> Maybe FilePath -> m (Either ProcessError ())
- makeOut :: (MonadReader env m, HasDirs env, MonadIO m) => [String] -> Maybe FilePath -> m CapturedProcess
- applyPatches :: (MonadReader env m, HasDirs env, HasLog env, MonadIO m) => FilePath -> FilePath -> Excepts '[PatchFailed] m ()
- applyPatch :: (MonadReader env m, HasDirs env, HasLog env, MonadIO m) => FilePath -> FilePath -> Excepts '[PatchFailed] m ()
- darwinNotarization :: (MonadReader env m, HasDirs env, MonadIO m) => Platform -> FilePath -> m (Either ProcessError ())
- getChangeLog :: GHCupDownloads -> Tool -> Either Version Tag -> Maybe URI
- runBuildAction :: (MonadReader env m, HasDirs env, HasSettings env, MonadIO m, MonadMask m, HasLog env, MonadUnliftIO m, MonadFail m, MonadCatch m) => FilePath -> Maybe FilePath -> Excepts e m a -> Excepts e m a
- cleanUpOnError :: (MonadReader env m, HasDirs env, HasSettings env, MonadIO m, MonadMask m, HasLog env, MonadUnliftIO m, MonadFail m, MonadCatch m) => FilePath -> Excepts e m a -> Excepts e m a
- rmBDir :: (MonadReader env m, HasLog env, MonadUnliftIO m, MonadIO m) => FilePath -> m ()
- getVersionInfo :: Version -> Tool -> GHCupDownloads -> Maybe VersionInfo
- exeExt :: String
- exeExt' :: ByteString
- getLinkTarget :: FilePath -> IO FilePath
- pathIsLink :: FilePath -> IO Bool
- rmLink :: (MonadReader env m, HasDirs env, MonadIO m, MonadMask m) => FilePath -> m ()
- createLink :: (MonadMask m, MonadThrow m, HasLog env, MonadIO m, MonadReader env m, HasDirs env, MonadUnliftIO m, MonadFail m) => FilePath -> FilePath -> m ()
- ensureGlobalTools :: (MonadMask m, MonadThrow m, HasLog env, MonadIO m, MonadReader env m, HasDirs env, HasSettings env, HasGHCupInfo env, MonadUnliftIO m, MonadFail m) => Excepts '[GPGError, DigestError, DownloadFailed, NoDownload] m ()
- ensureDirectories :: Dirs -> IO ()
- ghcBinaryName :: GHCTargetVersion -> String
- installDestSanityCheck :: (MonadIO m, MonadCatch m) => InstallDirResolved -> Excepts '[DirNotEmpty] m ()
- enableAnsiSupport :: IO (Either String Bool)
Documentation
module GHCup.Utils.Dirs
binarySymLinkDestination Source #
:: (MonadThrow m, MonadIO m) | |
=> FilePath | binary dir |
-> FilePath | the full toolpath |
-> m FilePath |
Create a relative symlink destination for the binary directory, given a target toolpath.
rmMinorGHCSymlinks :: (MonadReader env m, HasDirs env, MonadIO m, HasLog env, MonadThrow m, MonadFail m, MonadMask m) => GHCTargetVersion -> Excepts '[NotInstalled] m () Source #
Removes the minor GHC symlinks, e.g. ghc-8.6.5.
:: (MonadReader env m, HasDirs env, HasLog env, MonadThrow m, MonadFail m, MonadIO m, MonadMask m) | |
=> Maybe Text | target |
-> Excepts '[NotInstalled] m () |
Removes the set ghc version for the given target, if any.
rmMajorGHCSymlinks :: (MonadReader env m, HasDirs env, MonadIO m, HasLog env, MonadThrow m, MonadFail m, MonadMask m) => GHCTargetVersion -> Excepts '[NotInstalled] m () Source #
Remove the major GHC symlink, e.g. ghc-8.6.
rmMinorHLSSymlinks :: (MonadReader env m, HasDirs env, MonadIO m, HasLog env, MonadThrow m, MonadFail m, MonadMask m) => Version -> Excepts '[NotInstalled] m () Source #
Removes the minor HLS files, e.g. 'haskell-language-server-8.10.7~1.6.1.0' and 'haskell-language-server-wrapper-1.6.1.0'.
rmPlainHLS :: (MonadReader env m, HasDirs env, HasLog env, MonadThrow m, MonadFail m, MonadIO m, MonadMask m) => Excepts '[NotInstalled] m () Source #
Removes the set HLS version, if any.
ghcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool Source #
Whether the given GHC versin is installed.
ghcSrcInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadThrow m) => GHCTargetVersion -> m Bool Source #
Whether the given GHC version is installed from source.
:: (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) |
Whether the given GHC version is set as the current.
getInstalledGHCs :: (MonadReader env m, HasDirs env, MonadIO m) => m [Either FilePath GHCTargetVersion] Source #
Get all installed GHCs by reading ~.ghcupghc/dir. If a dir cannot be parsed, returns left.
getInstalledCabals :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) => m [Either FilePath Version] Source #
Get all installed cabals, by matching on ~/.ghcup/bin/cabal-*
.
cabalInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool Source #
Whether the given cabal version is installed.
cabalSet :: (HasLog env, MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version) Source #
getInstalledHLSs :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) => m [Either FilePath Version] Source #
getInstalledStacks :: (MonadReader env m, HasDirs env, MonadIO m, MonadCatch m) => m [Either FilePath Version] Source #
Get all installed stacks, by matching on
~/.ghcup/bin/stack-stackver
.
stackSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m, HasLog env) => m (Maybe Version) Source #
stackInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool Source #
Whether the given Stack version is installed.
hlsInstalled :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool Source #
Whether the given HLS version is installed.
isLegacyHLS :: (MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) => Version -> m Bool Source #
hlsSet :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m (Maybe Version) Source #
hlsGHCVersions :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => m [Version] Source #
Return the GHC versions the currently selected HLS supports.
hlsGHCVersions' :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadCatch m) => Version -> m [Version] Source #
:: (MonadReader env m, HasDirs env, MonadIO m) | |
=> Version | |
-> Maybe Version | optional GHC version |
-> m [FilePath] |
Get all server binaries for an hls version from the ~.ghcupbin directory, if any.
hlsInternalServerScripts Source #
:: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) | |
=> Version | |
-> Maybe Version | optional GHC version |
-> m [FilePath] |
Get all scripts for a hls version from the ~.ghcuphlsverbin directory, if any. Returns the full path.
hlsInternalServerBinaries Source #
:: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadFail m) | |
=> Version | |
-> Maybe Version | optional GHC version |
-> m [FilePath] |
hlsInternalServerLibs Source #
:: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m, MonadFail m) | |
=> Version | |
-> Version | GHC version |
-> m [FilePath] |
hlsWrapperBinary :: (MonadReader env m, HasDirs env, MonadThrow m, MonadIO m) => Version -> m (Maybe FilePath) Source #
Get the wrapper binary for an hls version, if any.
hlsAllBinaries :: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) => Version -> m [FilePath] Source #
Get all binaries for an hls version, if any.
getMajorMinorV :: MonadThrow m => Version -> m (Int, Int) Source #
Extract (major, minor) from any version.
matchPVPrefix :: PVP -> PVP -> Bool Source #
Match PVP prefix.
>>>
matchPVPrefix [pver|8.8|] [pver|8.8.4|]
True>>>
matchPVPrefix [pver|8|] [pver|8.8.4|]
True>>>
matchPVPrefix [pver|8.10|] [pver|8.8.4|]
False>>>
matchPVPrefix [pver|8.10|] [pver|8.10.7|]
True
:: (MonadReader env m, HasDirs env, MonadIO m, MonadThrow m) | |
=> PVP | |
-> Maybe Text | the target triple |
-> m (Maybe GHCTargetVersion) |
Get the latest installed full GHC version that satisfies the given (possibly partial) PVP version.
:: MonadThrow m | |
=> PVP | |
-> [(PVP, Text, Maybe Text)] | installed GHCs |
-> Maybe Text | the target triple |
-> m (Maybe GHCTargetVersion) |
Like getGHCForPVP
, except with explicit input parameter.
>>>
getGHCForPVP' [pver|8|] installedVersions Nothing
Just (GHCTargetVersion {_tvTarget = Nothing, _tvVersion = Version {_vEpoch = Nothing, _vChunks = (Digits 8 :| []) :| [Digits 10 :| [],Digits 7 :| []], _vRel = [Str "debug" :| []], _vMeta = Just "lol"}})>>>
fmap prettyShow $ getGHCForPVP' [pver|8.8|] installedVersions Nothing
"Just 8.8.4">>>
fmap prettyShow $ getGHCForPVP' [pver|8.10.4|] installedVersions Nothing
"Just 8.10.4"
getLatestToolFor :: MonadThrow m => Tool -> PVP -> GHCupDownloads -> m (Maybe (PVP, VersionInfo)) Source #
Get the latest available ghc for the given PVP version, which may only contain parts.
>>>
(fmap . fmap) fst $ getLatestToolFor GHC [pver|8|] r
Just (PVP {_pComponents = 8 :| [10,7]})>>>
(fmap . fmap) fst $ getLatestToolFor GHC [pver|8.8|] r
Just (PVP {_pComponents = 8 :| [8,4]})>>>
(fmap . fmap) fst $ getLatestToolFor GHC [pver|8.8.4|] r
Just (PVP {_pComponents = 8 :| [8,4]})
:: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m) | |
=> FilePath | destination dir |
-> FilePath | archive path |
-> Excepts '[UnknownArchive, ArchiveResult] m () |
Unpack an archive to a temporary directory and return that path.
:: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m) | |
=> FilePath | archive path |
-> Excepts '[UnknownArchive, ArchiveResult] m [FilePath] |
:: (MonadReader env m, HasLog env, MonadIO m, MonadThrow m, MonadCatch m) | |
=> FilePath | unpacked tar dir |
-> TarDir | how to descend |
-> Excepts '[TarDirDoesNotExist] m FilePath |
getTagged :: Tag -> Fold (Map Version VersionInfo) (Version, VersionInfo) Source #
Get the tool version that has this tag. If multiple have it, picks the greatest version.
getLatest :: GHCupDownloads -> Tool -> Maybe (Version, VersionInfo) Source #
getRecommended :: GHCupDownloads -> Tool -> Maybe (Version, VersionInfo) Source #
getLatestBaseVersion :: GHCupDownloads -> PVP -> Maybe (Version, VersionInfo) Source #
Gets the latest GHC with a given base version.
ghcInternalBinDir :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m) => GHCTargetVersion -> m FilePath Source #
Usually ~/.ghcup/ghc/<ver>/bin/
ghcToolFiles :: (MonadReader env m, HasDirs env, MonadThrow m, MonadFail m, MonadIO m) => GHCTargetVersion -> Excepts '[NotInstalled] m [FilePath] Source #
Get tool files from ~/.ghcup/ghc/<ver>/bin/*
while ignoring *-<ver>
symlinks and accounting for cross triple prefix.
Returns unversioned relative files without extension, e.g.:
["hsc2hs","haddock","hpc","runhaskell","ghc","ghc-pkg","ghci","runghc","hp2ps"]
ghcUpSrcBuiltFile :: FilePath Source #
This file, when residing in ~/.ghcup/ghc/<ver>/
signals that
this GHC was built from source. It contains the build config.
make :: (MonadThrow m, MonadIO m, MonadReader env m, HasDirs env, HasLog env, HasSettings env) => [String] -> Maybe FilePath -> m (Either ProcessError ()) Source #
Calls gmake if it exists in PATH, otherwise make.
makeOut :: (MonadReader env m, HasDirs env, MonadIO m) => [String] -> Maybe FilePath -> m CapturedProcess Source #
:: (MonadReader env m, HasDirs env, HasLog env, MonadIO m) | |
=> FilePath | dir containing patches |
-> FilePath | dir to apply patches in |
-> Excepts '[PatchFailed] m () |
Try to apply patches in order. The order is determined by
a quilt series file (in the patch directory) if one exists,
else the patches are applied in lexicographical order.
Fails with PatchFailed
on first failure.
:: (MonadReader env m, HasDirs env, HasLog env, MonadIO m) | |
=> FilePath | Patch |
-> FilePath | dir to apply patches in |
-> Excepts '[PatchFailed] m () |
darwinNotarization :: (MonadReader env m, HasDirs env, MonadIO m) => Platform -> FilePath -> m (Either ProcessError ()) Source #
getChangeLog :: GHCupDownloads -> Tool -> Either Version Tag -> Maybe URI Source #
:: (MonadReader env m, HasDirs env, HasSettings env, MonadIO m, MonadMask m, HasLog env, MonadUnliftIO m, MonadFail m, MonadCatch m) | |
=> FilePath | build directory (cleaned up depending on Settings) |
-> Maybe FilePath | dir to *always* clean up on exception |
-> Excepts e m a | |
-> Excepts e m a |
Execute a build action while potentially cleaning up:
- the build directory, depending on the KeepDirs setting
- the install destination, depending on whether the build failed
:: (MonadReader env m, HasDirs env, HasSettings env, MonadIO m, MonadMask m, HasLog env, MonadUnliftIO m, MonadFail m, MonadCatch m) | |
=> FilePath | build directory (cleaned up depending on Settings) |
-> Excepts e m a | |
-> Excepts e m a |
Clean up the given directory if the action fails, depending on the Settings.
rmBDir :: (MonadReader env m, HasLog env, MonadUnliftIO m, MonadIO m) => FilePath -> m () Source #
Remove a build directory, ignoring if it doesn't exist and gracefully printing other errors without crashing.
getVersionInfo :: Version -> Tool -> GHCupDownloads -> Maybe VersionInfo Source #
exeExt' :: ByteString Source #
The file extension for executables.
getLinkTarget :: FilePath -> IO FilePath Source #
On unix, we can use symlinks, so we just get the symbolic link target.
On windows, we have to emulate symlinks via shims,
see createLink
.
:: (MonadMask m, MonadThrow m, HasLog env, MonadIO m, MonadReader env m, HasDirs env, MonadUnliftIO m, MonadFail m) | |
=> FilePath | path to the target executable |
-> FilePath | path to be created |
-> m () |
Creates a symbolic link on unix and a fake symlink on windows for executables, which: 1. is a shim exe 2. has a corresponding .shim file in the same directory that contains the target
This overwrites previously existing files.
On windows, this requires that ensureGlobalTools
was run beforehand.
ensureGlobalTools :: (MonadMask m, MonadThrow m, HasLog env, MonadIO m, MonadReader env m, HasDirs env, HasSettings env, HasGHCupInfo env, MonadUnliftIO m, MonadFail m) => Excepts '[GPGError, DigestError, DownloadFailed, NoDownload] m () Source #
ensureDirectories :: Dirs -> IO () Source #
Ensure ghcup directory structure exists.
ghcBinaryName :: GHCTargetVersion -> String Source #
For ghc without arch triple, this is:
- ghc
For ghc with arch triple:
- triple-ghc (e.g. arm-linux-gnueabihf-ghc)
installDestSanityCheck :: (MonadIO m, MonadCatch m) => InstallDirResolved -> Excepts '[DirNotEmpty] m () Source #
Does basic checks for isolated installs Isolated Directory: 1. if it doesn't exist -> proceed 2. if it exists and is empty -> proceed 3. if it exists and is non-empty -> panic and leave the house
enableAnsiSupport :: IO (Either String Bool) Source #
Enables ANSI support on windows, does nothing on unix.
Returns 'Left str' on errors and 'Right bool' on success, where
bool
markes whether ansi support was already enabled.
This function never crashes.
Rip-off of https://docs.rs/ansi_term/0.12.1/x86_64-pc-windows-msvc/src/ansi_term/windows.rs.html#10-61