Preserve mtimes on unpacked GHC tarballs on windows wrt #187
This commit is contained in:
parent
5217aa0a1d
commit
4ed72fb517
30
lib/GHCup.hs
30
lib/GHCup.hs
@ -77,6 +77,9 @@ import System.Directory hiding ( findFiles )
|
|||||||
import System.Environment
|
import System.Environment
|
||||||
import System.FilePath
|
import System.FilePath
|
||||||
import System.IO.Error
|
import System.IO.Error
|
||||||
|
#if defined(IS_WINDOWS)
|
||||||
|
import System.IO.Temp
|
||||||
|
#endif
|
||||||
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
||||||
import Text.Regex.Posix
|
import Text.Regex.Posix
|
||||||
|
|
||||||
@ -249,6 +252,22 @@ installPackedGHC :: ( MonadMask m
|
|||||||
#endif
|
#endif
|
||||||
] m ()
|
] m ()
|
||||||
installPackedGHC dl msubdir inst ver = do
|
installPackedGHC dl msubdir inst ver = do
|
||||||
|
#if defined(IS_WINDOWS)
|
||||||
|
lift $ $(logInfo) "Installing GHC (this may take a while)"
|
||||||
|
|
||||||
|
Dirs { tmpDir } <- lift getDirs
|
||||||
|
unpackDir <- liftIO $ emptyTempFile tmpDir "ghc"
|
||||||
|
liftIO $ rmFile unpackDir
|
||||||
|
|
||||||
|
liftE $ unpackToDir unpackDir dl
|
||||||
|
|
||||||
|
d <- case msubdir of
|
||||||
|
Just td -> liftE $ intoSubdir unpackDir td
|
||||||
|
Nothing -> pure unpackDir
|
||||||
|
|
||||||
|
liftIO $ Win32.moveFileEx d (Just inst) 0
|
||||||
|
liftIO $ rmPath unpackDir
|
||||||
|
#else
|
||||||
PlatformRequest {..} <- lift getPlatformReq
|
PlatformRequest {..} <- lift getPlatformReq
|
||||||
|
|
||||||
-- unpack
|
-- unpack
|
||||||
@ -264,6 +283,7 @@ installPackedGHC dl msubdir inst ver = do
|
|||||||
liftE $ runBuildAction tmpUnpack
|
liftE $ runBuildAction tmpUnpack
|
||||||
(Just inst)
|
(Just inst)
|
||||||
(installUnpackedGHC workdir inst ver)
|
(installUnpackedGHC workdir inst ver)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
-- | Install an unpacked GHC distribution. This only deals with the GHC
|
-- | Install an unpacked GHC distribution. This only deals with the GHC
|
||||||
@ -280,13 +300,6 @@ installUnpackedGHC :: ( MonadReader env m
|
|||||||
-> FilePath -- ^ Path to install to
|
-> FilePath -- ^ Path to install to
|
||||||
-> Version -- ^ The GHC version
|
-> Version -- ^ The GHC version
|
||||||
-> Excepts '[ProcessError] m ()
|
-> Excepts '[ProcessError] m ()
|
||||||
#if defined(IS_WINDOWS)
|
|
||||||
installUnpackedGHC path inst _ = do
|
|
||||||
lift $ $(logInfo) "Installing GHC (this may take a while)"
|
|
||||||
-- windows bindists are relocatable and don't need
|
|
||||||
-- to run configure
|
|
||||||
liftIO $ copyDirectoryRecursive path inst
|
|
||||||
#else
|
|
||||||
installUnpackedGHC path inst ver = do
|
installUnpackedGHC path inst ver = do
|
||||||
PlatformRequest {..} <- lift getPlatformReq
|
PlatformRequest {..} <- lift getPlatformReq
|
||||||
|
|
||||||
@ -309,7 +322,6 @@ installUnpackedGHC path inst ver = do
|
|||||||
Nothing
|
Nothing
|
||||||
lEM $ make ["install"] (Just path)
|
lEM $ make ["install"] (Just path)
|
||||||
pure ()
|
pure ()
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
-- | Installs GHC into @~\/.ghcup\/ghc/\<ver\>@ and places the
|
-- | Installs GHC into @~\/.ghcup\/ghc/\<ver\>@ and places the
|
||||||
@ -1495,6 +1507,7 @@ rmGhcupDirs = do
|
|||||||
, binDir
|
, binDir
|
||||||
, logsDir
|
, logsDir
|
||||||
, cacheDir
|
, cacheDir
|
||||||
|
, tmpDir
|
||||||
} <- getDirs
|
} <- getDirs
|
||||||
|
|
||||||
let envFilePath = baseDir </> "env"
|
let envFilePath = baseDir </> "env"
|
||||||
@ -1506,6 +1519,7 @@ rmGhcupDirs = do
|
|||||||
rmDir cacheDir
|
rmDir cacheDir
|
||||||
rmDir logsDir
|
rmDir logsDir
|
||||||
rmBinDir binDir
|
rmBinDir binDir
|
||||||
|
rmDir tmpDir
|
||||||
#if defined(IS_WINDOWS)
|
#if defined(IS_WINDOWS)
|
||||||
rmDir (baseDir </> "msys64")
|
rmDir (baseDir </> "msys64")
|
||||||
#endif
|
#endif
|
||||||
|
@ -384,6 +384,7 @@ data Dirs = Dirs
|
|||||||
, cacheDir :: FilePath
|
, cacheDir :: FilePath
|
||||||
, logsDir :: FilePath
|
, logsDir :: FilePath
|
||||||
, confDir :: FilePath
|
, confDir :: FilePath
|
||||||
|
, tmpDir :: FilePath
|
||||||
}
|
}
|
||||||
deriving (Show, GHC.Generic)
|
deriving (Show, GHC.Generic)
|
||||||
|
|
||||||
|
@ -1086,19 +1086,14 @@ ensureGlobalTools = do
|
|||||||
|
|
||||||
-- | Ensure ghcup directory structure exists.
|
-- | Ensure ghcup directory structure exists.
|
||||||
ensureDirectories :: Dirs -> IO ()
|
ensureDirectories :: Dirs -> IO ()
|
||||||
ensureDirectories dirs = do
|
ensureDirectories (Dirs baseDir binDir cacheDir logsDir confDir tmpDir) = do
|
||||||
let Dirs
|
|
||||||
{ baseDir
|
|
||||||
, binDir
|
|
||||||
, cacheDir
|
|
||||||
, logsDir
|
|
||||||
, confDir
|
|
||||||
} = dirs
|
|
||||||
createDirRecursive' baseDir
|
createDirRecursive' baseDir
|
||||||
|
createDirRecursive' (baseDir </> "ghc")
|
||||||
createDirRecursive' binDir
|
createDirRecursive' binDir
|
||||||
createDirRecursive' cacheDir
|
createDirRecursive' cacheDir
|
||||||
createDirRecursive' logsDir
|
createDirRecursive' logsDir
|
||||||
createDirRecursive' confDir
|
createDirRecursive' confDir
|
||||||
|
createDirRecursive' tmpDir
|
||||||
pure ()
|
pure ()
|
||||||
|
|
||||||
|
|
||||||
|
@ -191,6 +191,15 @@ ghcupLogsDir = do
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
-- | Defaults to '~/.ghcup/tmp.
|
||||||
|
--
|
||||||
|
-- If 'GHCUP_USE_XDG_DIRS' is set (to anything),
|
||||||
|
-- then uses 'XDG_DATA_HOME/ghcup/tmp' as per xdg spec.
|
||||||
|
ghcupTmpDir :: IO FilePath
|
||||||
|
ghcupTmpDir = ghcupBaseDir <&> (</> "tmp")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
getAllDirs :: IO Dirs
|
getAllDirs :: IO Dirs
|
||||||
getAllDirs = do
|
getAllDirs = do
|
||||||
baseDir <- ghcupBaseDir
|
baseDir <- ghcupBaseDir
|
||||||
@ -198,6 +207,7 @@ getAllDirs = do
|
|||||||
cacheDir <- ghcupCacheDir
|
cacheDir <- ghcupCacheDir
|
||||||
logsDir <- ghcupLogsDir
|
logsDir <- ghcupLogsDir
|
||||||
confDir <- ghcupConfigDir
|
confDir <- ghcupConfigDir
|
||||||
|
tmpDir <- ghcupTmpDir
|
||||||
pure Dirs { .. }
|
pure Dirs { .. }
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user