implements --force option for cabal installs.
This commit is contained in:
parent
20bcb26e3d
commit
59a9a770a5
@ -443,7 +443,7 @@ install' _ (_, ListResult {..}) = do
|
|||||||
liftE $ installGHCBin lVer Nothing $> vi
|
liftE $ installGHCBin lVer Nothing $> vi
|
||||||
Cabal -> do
|
Cabal -> do
|
||||||
let vi = getVersionInfo lVer Cabal dls
|
let vi = getVersionInfo lVer Cabal dls
|
||||||
liftE $ installCabalBin lVer Nothing $> vi
|
liftE $ installCabalBin lVer Nothing False $> vi
|
||||||
GHCup -> do
|
GHCup -> do
|
||||||
let vi = snd <$> getLatest dls GHCup
|
let vi = snd <$> getLatest dls GHCup
|
||||||
liftE $ upgradeGHCup Nothing False $> vi
|
liftE $ upgradeGHCup Nothing False $> vi
|
||||||
|
@ -1779,7 +1779,7 @@ Report bugs at <https://gitlab.haskell.org/haskell/ghcup-hs/issues>|]
|
|||||||
(case instBindist of
|
(case instBindist of
|
||||||
Nothing -> runInstTool instPlatform $ do
|
Nothing -> runInstTool instPlatform $ do
|
||||||
(v, vi) <- liftE $ fromVersion instVer Cabal
|
(v, vi) <- liftE $ fromVersion instVer Cabal
|
||||||
liftE $ installCabalBin (_tvVersion v) isolateDir
|
liftE $ installCabalBin (_tvVersion v) isolateDir forceInstall
|
||||||
pure vi
|
pure vi
|
||||||
Just uri -> do
|
Just uri -> do
|
||||||
s' <- appState
|
s' <- appState
|
||||||
@ -1789,6 +1789,7 @@ Report bugs at <https://gitlab.haskell.org/haskell/ghcup-hs/issues>|]
|
|||||||
(DownloadInfo uri Nothing "")
|
(DownloadInfo uri Nothing "")
|
||||||
(_tvVersion v)
|
(_tvVersion v)
|
||||||
isolateDir
|
isolateDir
|
||||||
|
forceInstall
|
||||||
pure vi
|
pure vi
|
||||||
)
|
)
|
||||||
>>= \case
|
>>= \case
|
||||||
|
63
lib/GHCup.hs
63
lib/GHCup.hs
@ -401,6 +401,7 @@ installCabalBindist :: ( MonadMask m
|
|||||||
=> DownloadInfo
|
=> DownloadInfo
|
||||||
-> Version
|
-> Version
|
||||||
-> Maybe FilePath -- ^ isolated install filepath, if user provides any.
|
-> Maybe FilePath -- ^ isolated install filepath, if user provides any.
|
||||||
|
-> Bool -- ^ Force install
|
||||||
-> Excepts
|
-> Excepts
|
||||||
'[ AlreadyInstalled
|
'[ AlreadyInstalled
|
||||||
, CopyError
|
, CopyError
|
||||||
@ -415,24 +416,31 @@ installCabalBindist :: ( MonadMask m
|
|||||||
]
|
]
|
||||||
m
|
m
|
||||||
()
|
()
|
||||||
installCabalBindist dlinfo ver isoFilepath = do
|
installCabalBindist dlinfo ver isoFilepath forceInstall = do
|
||||||
lift $ logDebug $ "Requested to install cabal version " <> prettyVer ver
|
lift $ $(logDebug) $ "Requested to install cabal version " <> prettyVer ver
|
||||||
|
|
||||||
PlatformRequest {..} <- lift getPlatformReq
|
PlatformRequest {..} <- lift getPlatformReq
|
||||||
Dirs {..} <- lift getDirs
|
Dirs {..} <- lift getDirs
|
||||||
|
|
||||||
case isoFilepath of
|
-- check if we already have a regular cabal already installed
|
||||||
Nothing -> -- for regular install check if any previous versions installed
|
regularCabalInstalled <- checkIfCabalInstalled ver binDir exeExt
|
||||||
whenM
|
|
||||||
(lift (cabalInstalled ver) >>= \a -> liftIO $
|
|
||||||
handleIO (\_ -> pure False)
|
|
||||||
$ fmap (\x -> a && x)
|
|
||||||
-- ignore when the installation is a legacy cabal (binary, not symlink)
|
|
||||||
$ pathIsLink (binDir </> "cabal" <> exeExt)
|
|
||||||
)
|
|
||||||
(throwE $ AlreadyInstalled Cabal ver)
|
|
||||||
|
|
||||||
_ -> pure () -- check isn't required in isolated installs
|
case forceInstall of
|
||||||
|
True -> case isoFilepath of
|
||||||
|
Nothing -> -- force install and a regular install
|
||||||
|
when (regularCabalInstalled)
|
||||||
|
(do
|
||||||
|
lift $ $(logInfo) $ "Removing the currently installed version first!"
|
||||||
|
liftE $ rmCabalVer ver)
|
||||||
|
|
||||||
|
_ -> pure () -- force install and an isolated install (checks done later while unpacking)
|
||||||
|
|
||||||
|
False -> case isoFilepath of
|
||||||
|
Nothing ->
|
||||||
|
when (regularCabalInstalled)
|
||||||
|
(throwE $ AlreadyInstalled Cabal ver)
|
||||||
|
|
||||||
|
_ -> pure ()
|
||||||
|
|
||||||
-- download (or use cached version)
|
-- download (or use cached version)
|
||||||
dl <- liftE $ downloadCached dlinfo Nothing
|
dl <- liftE $ downloadCached dlinfo Nothing
|
||||||
@ -447,25 +455,36 @@ installCabalBindist dlinfo ver isoFilepath = do
|
|||||||
|
|
||||||
case isoFilepath of
|
case isoFilepath of
|
||||||
Just isoDir -> do -- isolated install
|
Just isoDir -> do -- isolated install
|
||||||
lift $ logInfo $ "isolated installing Cabal to " <> T.pack isoDir
|
lift $ $(logInfo) $ "isolated installing Cabal to " <> T.pack isoDir
|
||||||
liftE $ installCabalUnpacked workdir isoDir Nothing
|
liftE $ installCabalUnpacked workdir isoDir Nothing forceInstall
|
||||||
|
|
||||||
Nothing -> do -- regular install
|
Nothing -> do -- regular install
|
||||||
liftE $ installCabalUnpacked workdir binDir (Just ver)
|
liftE $ installCabalUnpacked workdir binDir (Just ver) forceInstall
|
||||||
|
|
||||||
-- create symlink if this is the latest version for regular installs
|
-- create symlink if this is the latest version for regular installs
|
||||||
cVers <- lift $ fmap rights getInstalledCabals
|
cVers <- lift $ fmap rights getInstalledCabals
|
||||||
let lInstCabal = headMay . reverse . sort $ cVers
|
let lInstCabal = headMay . reverse . sort $ cVers
|
||||||
when (maybe True (ver >=) lInstCabal) $ liftE $ setCabal ver
|
when (maybe True (ver >=) lInstCabal) $ liftE $ setCabal ver
|
||||||
|
|
||||||
|
where
|
||||||
|
|
||||||
|
checkIfCabalInstalled ver binDir exeExt = (lift (cabalInstalled ver) >>= \a -> liftIO $
|
||||||
|
handleIO (\_ -> pure False)
|
||||||
|
$ fmap (\x -> a && x)
|
||||||
|
-- ignore when the installation is a legacy cabal (binary, not symlink)
|
||||||
|
$ pathIsLink (binDir </> "cabal" <> exeExt)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
-- | Install an unpacked cabal distribution.
|
-- | Install an unpacked cabal distribution.
|
||||||
installCabalUnpacked :: (MonadReader env m, HasLog env, MonadCatch m, MonadIO m)
|
installCabalUnpacked :: (MonadReader env m, HasLog env, MonadCatch m, MonadIO m)
|
||||||
=> FilePath -- ^ Path to the unpacked cabal bindist (where the executable resides)
|
=> FilePath -- ^ Path to the unpacked cabal bindist (where the executable resides)
|
||||||
-> FilePath -- ^ Path to install to
|
-> FilePath -- ^ Path to install to
|
||||||
-> Maybe Version -- ^ Nothing for isolated install
|
-> Maybe Version -- ^ Nothing for isolated install
|
||||||
|
-> Bool -- ^ Force Install
|
||||||
-> Excepts '[CopyError, FileAlreadyExistsError] m ()
|
-> Excepts '[CopyError, FileAlreadyExistsError] m ()
|
||||||
installCabalUnpacked path inst mver' = do
|
installCabalUnpacked path inst mver' forceInstall = do
|
||||||
lift $ logInfo "Installing cabal"
|
lift $ $(logInfo) "Installing cabal"
|
||||||
let cabalFile = "cabal"
|
let cabalFile = "cabal"
|
||||||
liftIO $ createDirRecursive' inst
|
liftIO $ createDirRecursive' inst
|
||||||
let destFileName = cabalFile
|
let destFileName = cabalFile
|
||||||
@ -473,7 +492,8 @@ installCabalUnpacked path inst mver' = do
|
|||||||
<> exeExt
|
<> exeExt
|
||||||
let destPath = inst </> destFileName
|
let destPath = inst </> destFileName
|
||||||
|
|
||||||
liftE $ throwIfFileAlreadyExists destPath
|
unless forceInstall -- Overwrite it when it IS a force install
|
||||||
|
(liftE $ throwIfFileAlreadyExists destPath)
|
||||||
|
|
||||||
handleIO (throwE . CopyError . show) $ liftIO $ copyFile
|
handleIO (throwE . CopyError . show) $ liftIO $ copyFile
|
||||||
(path </> cabalFile <> exeExt)
|
(path </> cabalFile <> exeExt)
|
||||||
@ -498,6 +518,7 @@ installCabalBin :: ( MonadMask m
|
|||||||
)
|
)
|
||||||
=> Version
|
=> Version
|
||||||
-> Maybe FilePath -- isolated install Path, if user provided any
|
-> Maybe FilePath -- isolated install Path, if user provided any
|
||||||
|
-> Bool -- force install
|
||||||
-> Excepts
|
-> Excepts
|
||||||
'[ AlreadyInstalled
|
'[ AlreadyInstalled
|
||||||
, CopyError
|
, CopyError
|
||||||
@ -512,9 +533,9 @@ installCabalBin :: ( MonadMask m
|
|||||||
]
|
]
|
||||||
m
|
m
|
||||||
()
|
()
|
||||||
installCabalBin ver isoFilepath = do
|
installCabalBin ver isoFilepath forceInstall = do
|
||||||
dlinfo <- liftE $ getDownloadInfo Cabal ver
|
dlinfo <- liftE $ getDownloadInfo Cabal ver
|
||||||
installCabalBindist dlinfo ver isoFilepath
|
installCabalBindist dlinfo ver isoFilepath forceInstall
|
||||||
|
|
||||||
|
|
||||||
-- | Like 'installHLSBin, except takes the 'DownloadInfo' as
|
-- | Like 'installHLSBin, except takes the 'DownloadInfo' as
|
||||||
|
Loading…
Reference in New Issue
Block a user