From 4729364e99fc9e96ce78ee0334344f5d240a8c93 Mon Sep 17 00:00:00 2001 From: Arjun Kathuria Date: Fri, 23 Jul 2021 15:57:42 +0530 Subject: [PATCH] Adds isolate install functionality to 'Cabal' tool installs --- app/ghcup/Main.hs | 34 +++++++++++++++++++------------ lib/GHCup.hs | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 13 deletions(-) diff --git a/app/ghcup/Main.hs b/app/ghcup/Main.hs index f5ba12c..7b284dd 100644 --- a/app/ghcup/Main.hs +++ b/app/ghcup/Main.hs @@ -1649,19 +1649,27 @@ Report bugs at |] let installCabal InstallOptions{..} = - (case instBindist of - Nothing -> runInstTool instPlatform $ do - (v, vi) <- liftE $ fromVersion instVer Cabal - liftE $ installCabalBin (_tvVersion v) - pure vi - Just uri -> do - s' <- appState - runInstTool' s'{ settings = settings { noVerify = True}} instPlatform $ do - (v, vi) <- liftE $ fromVersion instVer Cabal - liftE $ installCabalBindist - (DownloadInfo uri Nothing "") - (_tvVersion v) - pure vi + (case isolateDir of + Just isoDir -> + runInstTool instPlatform $ do + (v, vi) <- liftE $ fromVersion instVer Cabal + let cabalVersion = (_tvVersion v) + liftE $ installCabalBinIsolated isoDir cabalVersion + pure vi + Nothing -> + case instBindist of + Nothing -> runInstTool instPlatform $ do + (v, vi) <- liftE $ fromVersion instVer Cabal + liftE $ installCabalBin (_tvVersion v) + pure vi + Just uri -> do + s' <- appState + runInstTool' s'{ settings = settings { noVerify = True}} instPlatform $ do + (v, vi) <- liftE $ fromVersion instVer Cabal + liftE $ installCabalBindist + (DownloadInfo uri Nothing "") + (_tvVersion v) + pure vi ) >>= \case VRight vi -> do diff --git a/lib/GHCup.hs b/lib/GHCup.hs index fc30c5f..a3c0930 100644 --- a/lib/GHCup.hs +++ b/lib/GHCup.hs @@ -487,6 +487,57 @@ installCabal' path inst ver = do destPath lift $ chmod_755 destPath +-- | Installs GHC to a specified location, doesn't make any symlinks. +installCabalBinIsolated :: ( MonadMask m + , MonadCatch m + , MonadReader env m + , HasPlatformReq env + , HasGHCupInfo env + , HasDirs env + , HasSettings env + , MonadLogger m + , MonadResource m + , MonadIO m + , MonadUnliftIO m + , MonadFail m + ) + => FilePath + -> Version + -> Excepts + '[ AlreadyInstalled + , CopyError + , DigestError + , DownloadFailed + , NoDownload + , NotInstalled + , UnknownArchive + , TarDirDoesNotExist +#if !defined(TAR) + , ArchiveResult +#endif + ] + m + () +installCabalBinIsolated isoDir ver = do + dlinfo <- liftE $ getDownloadInfo Cabal ver + lift $ $(logDebug) [i|Requested to install cabal version #{ver}|] + + -- download (or use cached version) + dl <- liftE $ downloadCached dlinfo Nothing + + PlatformRequest {_rPlatform} <- lift getPlatformReq + + -- unpack + tmpUnpack <- lift withGHCupTmpDir + liftE $ unpackToDir tmpUnpack dl + void $ lift $ darwinNotarization _rPlatform tmpUnpack + + -- the subdir of the archive where we do the work + workdir <- maybe (pure tmpUnpack) (liftE . intoSubdir tmpUnpack) (view dlSubdir dlinfo) + + lift $ $(logInfo) [i|isolated installing Cabal to #{isoDir}|] + liftE $ installCabal' workdir isoDir ver + -- | Installs cabal into @~\/.ghcup\/bin/cabal-\@ and -- creates a default @cabal -> cabal-x.y.z.q@ symlink for