Skip to content

Commit d0944b1

Browse files
committed
Prototype for source repository support in cabal.project
This allows to write ``` source-repository-package type: git location: https://github.com/.... subdir: somesubdirinyourrepository tag: 481cabcab15501f300728bfa4f6de517d4492777 ```
1 parent 8866ca3 commit d0944b1

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

cabal-install/Distribution/Client/ProjectConfig.hs

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ module Distribution.Client.ProjectConfig (
4848
import Prelude ()
4949
import Distribution.Client.Compat.Prelude
5050

51+
import Distribution.Client.Get
52+
( BranchCmd(..), findUsableBranchers, findBranchCmd )
5153
import Distribution.Client.ProjectConfig.Types
5254
import Distribution.Client.ProjectConfig.Legacy
5355
import Distribution.Client.RebuildMonad
@@ -56,7 +58,7 @@ import Distribution.Client.Glob
5658

5759
import Distribution.Client.Types
5860
import Distribution.Client.DistDirLayout
59-
( CabalDirLayout(..) )
61+
( CabalDirLayout(..), DistDirLayout(..) )
6062
import Distribution.Client.GlobalFlags
6163
( RepoContext(..), withRepoContext' )
6264
import Distribution.Client.BuildReports.Types
@@ -115,6 +117,8 @@ import Data.Either
115117
import qualified Data.Map as Map
116118
import Data.Set (Set)
117119
import qualified Data.Set as Set
120+
import System.Exit
121+
( ExitCode(..) )
118122
import System.FilePath hiding (combine)
119123
import System.Directory
120124
import Network.URI (URI(..), URIAuth(..), parseAbsoluteURI)
@@ -862,14 +866,17 @@ mplusMaybeT ma mb = do
862866
-- Note here is where we convert from project-root relative paths to absolute
863867
-- paths.
864868
--
865-
readSourcePackage :: Verbosity -> ProjectPackageLocation
869+
readSourcePackage :: Verbosity -> DistDirLayout -> ProjectPackageLocation
866870
-> Rebuild UnresolvedSourcePackage
867-
readSourcePackage verbosity (ProjectPackageLocalCabalFile cabalFile) =
868-
readSourcePackage verbosity (ProjectPackageLocalDirectory dir cabalFile)
871+
readSourcePackage verbosity distDirLayout (ProjectPackageLocalCabalFile cabalFile) =
872+
readSourcePackage
873+
verbosity
874+
distDirLayout
875+
(ProjectPackageLocalDirectory dir cabalFile)
869876
where
870877
dir = takeDirectory cabalFile
871878

872-
readSourcePackage verbosity (ProjectPackageLocalDirectory dir cabalFile) = do
879+
readSourcePackage verbosity _ (ProjectPackageLocalDirectory dir cabalFile) = do
873880
monitorFiles [monitorFileHashed cabalFile]
874881
root <- askRoot
875882
pkgdesc <- liftIO $ readGenericPackageDescription verbosity (root </> cabalFile)
@@ -879,7 +886,45 @@ readSourcePackage verbosity (ProjectPackageLocalDirectory dir cabalFile) = do
879886
packageSource = LocalUnpackedPackage (root </> dir),
880887
packageDescrOverride = Nothing
881888
}
882-
readSourcePackage _verbosity _ =
889+
890+
readSourcePackage verbosity distDirLayout (ProjectPackageRemoteRepo repo) = do
891+
892+
when (isNothing (repoTag repo)) $ do
893+
fail ("Source repository without tag are not allowed")
894+
895+
branchers <- liftIO findUsableBranchers
896+
let
897+
tag = fromJust (repoTag repo)
898+
destDir = distUnpackedSrcRootDirectory distDirLayout </> ("src-" ++ tag)
899+
subdir = fromMaybe "" (repoSubdir repo)
900+
pkgdir = destDir </> subdir
901+
repoloc = fromMaybe "" (repoLocation repo)
902+
903+
repoExists <- liftIO $ doesDirectoryExist destDir
904+
when (not repoExists) $ do
905+
case findBranchCmd branchers [repo] Nothing of
906+
Just (BranchCmd fork) -> do
907+
exitCode <- liftIO $ fork verbosity destDir
908+
case exitCode of
909+
ExitSuccess -> return ()
910+
ExitFailure _ -> fail ("Couldn't fork package from " ++ repoloc)
911+
Nothing -> fail ("No usable brancher found for " ++ repoloc)
912+
913+
pkgdirExists <- liftIO $ doesDirectoryExist pkgdir
914+
when (not pkgdirExists) $ do
915+
fail ("Subdirectory does not exists in repository " ++ repoloc)
916+
917+
matches <- matchFileGlob (globStarDotCabal pkgdir)
918+
case matches of
919+
[cabalFile]
920+
-> readSourcePackage
921+
verbosity
922+
distDirLayout
923+
(ProjectPackageLocalDirectory pkgdir cabalFile)
924+
[] -> fail ("No cabal file found in source repository")
925+
_ -> fail ("More than one cabal file found in source repository")
926+
927+
readSourcePackage _verbosity _ _ =
883928
fail $ "TODO: add support for fetching and reading local tarballs, remote "
884929
++ "tarballs, remote repos and passing named packages through"
885930

cabal-install/Distribution/Client/ProjectPlanning.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,8 @@ rebuildInstallPlan verbosity
392392
phaseReadLocalPackages projectConfig = do
393393

394394
localCabalFiles <- findProjectPackages projectRootDir projectConfig
395-
mapM (readSourcePackage verbosity) localCabalFiles
396395

396+
mapM (readSourcePackage verbosity distDirLayout) localCabalFiles
397397

398398
-- Configure the compiler we're using.
399399
--
@@ -2815,7 +2815,7 @@ setupHsTestFlags :: ElaboratedConfiguredPackage
28152815
-> ElaboratedSharedConfig
28162816
-> Verbosity
28172817
-> FilePath
2818-
-> Cabal.TestFlags
2818+
-> Cabal.TestFlags
28192819
setupHsTestFlags _ _ verbosity builddir = Cabal.TestFlags
28202820
{ testDistPref = toFlag builddir
28212821
, testVerbosity = toFlag verbosity

0 commit comments

Comments
 (0)