aboutsummaryrefslogtreecommitdiff
path: root/CabalHelper
diff options
context:
space:
mode:
Diffstat (limited to 'CabalHelper')
-rw-r--r--CabalHelper/Compile.hs71
1 files changed, 48 insertions, 23 deletions
diff --git a/CabalHelper/Compile.hs b/CabalHelper/Compile.hs
index 59bb48c..f84b2e8 100644
--- a/CabalHelper/Compile.hs
+++ b/CabalHelper/Compile.hs
@@ -51,7 +51,7 @@ data Compile = Compile {
compCabalHelperSourceDir :: FilePath,
compCabalSourceDir :: Maybe FilePath,
compPackageDb :: Maybe FilePath,
- compCabalVersion :: Version,
+ compCabalVersion :: Either String Version,
compPackageDeps :: [String]
}
@@ -111,7 +111,7 @@ compileHelper opts cabalVer projdir distdir = withHelperSources $ \chdir -> do
case db_exists of
False -> mzero
True -> do
- db <- liftIO $ getPrivateCabalPkgDb opts cabalVer
+ db <- liftIO $ getPrivateCabalPkgDb opts (showVersion cabalVer)
vLog opts $ logMsg ++ "private package-db in " ++ db
liftIO $ compileWithPkg chdir (Just db) cabalVer
@@ -143,10 +143,10 @@ compileHelper opts cabalVer projdir distdir = withHelperSources $ \chdir -> do
compileWithPkg chdir (Just db) cabalVer
compileWithCabalTree chdir ver srcDir =
- compile distdir opts $ Compile chdir (Just srcDir) Nothing ver []
+ compile distdir opts $ Compile chdir (Just srcDir) Nothing (Right ver) []
compileWithPkg chdir mdb ver =
- compile distdir opts $ Compile chdir Nothing mdb ver [cabalPkgId ver]
+ compile distdir opts $ Compile chdir Nothing mdb (Right ver) [cabalPkgId ver]
cabalPkgId v = "Cabal-" ++ showVersion v
@@ -167,7 +167,9 @@ compile distdir opts@Options {..} Compile {..} = do
vLog opts $ "outdir: " ++ outdir
vLog opts $ "exedir: " ++ exedir
- let Version (mj:mi:_) _ = compCabalVersion
+ let (mj, mi) = case compCabalVersion of
+ Left _commitid -> (1, 10000)
+ Right (Version (x:y:_) _) -> (x, y)
let ghc_opts =
concat [
[ "-outputdir", outdir
@@ -204,12 +206,15 @@ compile distdir opts@Options {..} Compile {..} = do
ExitSuccess -> Right exe
e@(ExitFailure _) -> Left e
-exePath :: Version -> IO FilePath
+exePath :: Either String Version -> IO FilePath
exePath compCabalVersion = do
exePath' compCabalVersion <$> appDataDir
-exePath' :: Version-> FilePath -> FilePath
-exePath' compCabalVersion outdir =
+exePath' :: Either String Version -> FilePath -> FilePath
+exePath' (Left commitid) outdir =
+ outdir </> "cabal-helper-" ++ showVersion version -- our ver
+ ++ "-Cabal-HEAD-" ++ commitid
+exePath' (Right compCabalVersion) outdir =
outdir </> "cabal-helper-" ++ showVersion version -- our ver
++ "-Cabal-" ++ showVersion compCabalVersion
@@ -255,12 +260,20 @@ installCabal opts ver = do
mpatch :: Maybe (FilePath -> IO ())
mpatch = snd <$> find ((ver`elem`) . fst) patchyCabalVersions
msrcdir <- sequenceA $ unpackPatchedCabal opts ver tmpdir <$> mpatch
- db <- createPkgDb opts ver
- cabalInstall opts db ver msrcdir
+ db <- createPkgDb opts (showVersion ver)
+ cabalInstall opts db (maybe (Right ver) Left msrcdir)
return db
-cabalInstall :: Options -> FilePath -> Version -> Maybe FilePath -> IO ()
-cabalInstall opts db ver msrcdir = do
+installCabalHEAD :: Options -> IO (FilePath, String)
+installCabalHEAD opts = do
+ withSystemTempDirectory "cabal-helper" $ \tmpdir -> do
+ (srcdir, commit) <- unpackCabalHEAD tmpdir
+ db <- createPkgDb opts commit
+ cabalInstall opts db (Left srcdir)
+ return (db, commit)
+
+cabalInstall :: Options -> FilePath -> Either FilePath Version -> IO ()
+cabalInstall opts db e_ver_msrcdir = do
cabalInstallVer <- cabalInstallVersion opts
cabal_opts <- return $ concat
[
@@ -277,12 +290,12 @@ cabalInstall opts db ver msrcdir = do
then [ "--with-ghc-pkg=" ++ ghcPkgProgram opts ]
else []
,
- case msrcdir of
- Nothing ->
+ case e_ver_msrcdir of
+ Right ver ->
[ "install", "Cabal"
, "--constraint", "Cabal == " ++ showVersion ver
]
- Just srcdir ->
+ Left srcdir ->
[ "install", srcdir ]
]
@@ -340,14 +353,26 @@ patchyCabalVersions = [
unpackPatchedCabal ::
Options -> Version -> FilePath -> (FilePath -> IO ()) -> IO FilePath
unpackPatchedCabal opts cabalVer tmpdir patch = do
+ dir <- unpackCabal opts cabalVer tmpdir
+ patch dir
+ return dir
+
+unpackCabal ::
+ Options -> Version -> FilePath -> IO FilePath
+unpackCabal opts cabalVer tmpdir = do
let cabal = "Cabal-" ++ showVersion cabalVer
dir = tmpdir </> cabal
-
callProcessStderr (Just tmpdir) (cabalProgram opts) [ "get", cabal ]
-
- patch dir
return dir
+unpackCabalHEAD :: FilePath -> IO (FilePath, String)
+unpackCabalHEAD tmpdir = do
+ let dir = tmpdir </> "cabal-head.git"
+ url = "https://github.com/haskell/cabal.git"
+ ExitSuccess <- rawSystem "git" [ "clone", "--depth=1", url, dir]
+ commit <- trim <$> readProcess "git" ["rev-parse", "HEAD"] ""
+ return (dir </> "Cabal", commit)
+
errorInstallCabal :: Version -> FilePath -> a
errorInstallCabal cabalVer _distdir = panic $ printf "\
\Installing Cabal version %s failed.\n\
@@ -385,7 +410,7 @@ errorInstallCabal cabalVer _distdir = panic $ printf "\
cachedExe :: Version -> IO (Maybe FilePath)
cachedExe compCabalVersion = do
- exe <- exePath compCabalVersion
+ exe <- exePath (Right compCabalVersion)
exists <- doesFileExist exe
return $ if exists then Just exe else Nothing
@@ -403,7 +428,7 @@ listCabalVersions' Options {..} mdb = do
cabalPkgDbExists :: Options -> Version -> IO Bool
cabalPkgDbExists opts ver = do
- db <- getPrivateCabalPkgDb opts ver
+ db <- getPrivateCabalPkgDb opts (showVersion ver)
dexists <- doesDirectoryExist db
case dexists of
False -> return False
@@ -427,18 +452,18 @@ cabalInstallVersion Options {..} = do
trim :: String -> String
trim = dropWhileEnd isSpace
-createPkgDb :: Options -> Version -> IO FilePath
+createPkgDb :: Options -> String -> IO FilePath
createPkgDb opts@Options {..} ver = do
db <- getPrivateCabalPkgDb opts ver
exists <- doesDirectoryExist db
when (not exists) $ callProcessStderr Nothing ghcPkgProgram ["init", db]
return db
-getPrivateCabalPkgDb :: Options -> Version -> IO FilePath
+getPrivateCabalPkgDb :: Options -> String -> IO FilePath
getPrivateCabalPkgDb opts ver = do
appdir <- appDataDir
ghcVer <- ghcVersion opts
- return $ appdir </> "Cabal-" ++ showVersion ver ++ "-db-" ++ showVersion ghcVer
+ return $ appdir </> "Cabal-" ++ ver ++ "-db-" ++ showVersion ghcVer
-- | Find @version: XXX@ delcaration in a cabal file
cabalFileVersion :: String -> Version