@@ -121,6 +121,7 @@ import Distribution.Client.Config
121121import Distribution.Client.DistDirLayout
122122 ( CabalDirLayout (.. )
123123 , DistDirLayout (.. )
124+ , ProjectFileKey (.. )
124125 , ProjectRoot (.. )
125126 , defaultProjectFile
126127 )
@@ -786,11 +787,11 @@ readProjectLocalConfigOrDefault
786787 -> DistDirLayout
787788 -> Rebuild ProjectConfigSkeleton
788789readProjectLocalConfigOrDefault verbosity parserOption httpTransport distDirLayout = do
789- let projectFile = distProjectFile distDirLayout " "
790+ let projectFile = distProjectFile distDirLayout ProjectFileKeyMain
790791 usesExplicitProjectRoot <- liftIO $ doesFileExist projectFile
791792 if usesExplicitProjectRoot
792793 then do
793- readProjectFileSkeleton parserOption verbosity httpTransport distDirLayout " " " project file "
794+ readProjectFileSkeleton parserOption verbosity httpTransport distDirLayout ProjectFileKeyMain
794795 else do
795796 monitorFiles [monitorNonExistentFile projectFile]
796797 return (singletonProjectConfigSkeleton defaultImplicitProjectConfig)
@@ -803,6 +804,13 @@ defaultImplicitProjectConfig =
803804 , projectConfigProvenance = Set. singleton Implicit
804805 }
805806
807+ -- | A human readable description of the project file.
808+ extensionDescription :: ProjectFileKey -> String
809+ extensionDescription = \ case
810+ ProjectFileKeyMain -> " project file"
811+ ProjectFileKeyLocal -> " project local configuration file"
812+ ProjectFileKeyFreeze -> " project freeze file"
813+
806814-- | Reads a @cabal.project.local@ file in the given project root dir,
807815-- or returns empty. This file gets written by @cabal configure@, or in
808816-- principle can be edited manually or by other tools.
@@ -818,8 +826,7 @@ readProjectLocalExtraConfig verbosity parserOption httpTransport distDirLayout =
818826 verbosity
819827 httpTransport
820828 distDirLayout
821- " local"
822- " project local configuration file"
829+ ProjectFileKeyLocal
823830
824831-- | Reads a @cabal.project.freeze@ file in the given project root dir,
825832-- or returns empty. This file gets written by @cabal freeze@, or in
@@ -836,18 +843,16 @@ readProjectLocalFreezeConfig verbosity parserOption httpTransport distDirLayout
836843 verbosity
837844 httpTransport
838845 distDirLayout
839- " freeze"
840- " project freeze file"
846+ ProjectFileKeyFreeze
841847
842848-- | Reads a named extended (with imports and conditionals) config file in the given project root dir, or returns empty.
843849-- This function is generic and can be used with the legacy or parsec parser, or a combination of both.
844- readProjectFileSkeletonGen :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> (FilePath -> IO ProjectConfigSkeleton ) -> Rebuild ProjectConfigSkeleton
850+ readProjectFileSkeletonGen :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> (FilePath -> IO ProjectConfigSkeleton ) -> Rebuild ProjectConfigSkeleton
845851readProjectFileSkeletonGen
846852 verbosity
847853 httpTransport
848854 dir
849- extensionName
850- extensionDescription
855+ key
851856 parseConfig =
852857 do
853858 exists <- liftIO $ doesFileExist extensionFile
@@ -864,7 +869,7 @@ readProjectFileSkeletonGen
864869 monitorFiles [monitorNonExistentFile extensionFile]
865870 return mempty
866871 where
867- extensionFile = distProjectFile dir extensionName
872+ extensionFile = distProjectFile dir key
868873
869874-- There are 3 different variants of the project parsing function.
870875-- 1. readProjectFileSkeletonLegacy: always uses the legacy parser
@@ -884,7 +889,7 @@ readProjectFileSkeletonGen
884889-- 1. reportParseResult: reports legacy parse errors to the user
885890-- 2. reportParseResultParsec: reports parsec parse errors to the user
886891
887- readProjectFileSkeleton :: ProjectFileParser -> Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> Rebuild ProjectConfigSkeleton
892+ readProjectFileSkeleton :: ProjectFileParser -> Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> Rebuild ProjectConfigSkeleton
888893readProjectFileSkeleton option =
889894 case option of
890895 LegacyParser -> readProjectFileSkeletonLegacy
@@ -893,50 +898,50 @@ readProjectFileSkeleton option =
893898 CompareParser -> readProjectFileSkeletonCompare
894899
895900-- | Read a project file using the legacy parser.
896- readProjectFileSkeletonLegacy :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> Rebuild ProjectConfigSkeleton
897- readProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription = do
898- readProjectFileSkeletonGen verbosity httpTransport distDirLayout extensionName extensionDescription $ \ fp -> do
901+ readProjectFileSkeletonLegacy :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> Rebuild ProjectConfigSkeleton
902+ readProjectFileSkeletonLegacy verbosity httpTransport distDirLayout key = do
903+ readProjectFileSkeletonGen verbosity httpTransport distDirLayout key $ \ fp -> do
899904 debug verbosity " Reading project file using the legacy parser"
900- parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription fp
901- >>= liftIO . reportParseResult verbosity extensionDescription fp
905+ parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout key fp
906+ >>= liftIO . reportParseResult verbosity ( extensionDescription key) fp
902907
903908-- | Read a project file using the parsec parser, but if that fails, it falls back to the legacy parser.
904- readProjectFileSkeletonFallback :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> Rebuild ProjectConfigSkeleton
905- readProjectFileSkeletonFallback verbosity httpTransport distDirLayout extensionName extensionDescription = do
906- readProjectFileSkeletonGen verbosity httpTransport distDirLayout extensionName extensionDescription $ \ fp -> do
909+ readProjectFileSkeletonFallback :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> Rebuild ProjectConfigSkeleton
910+ readProjectFileSkeletonFallback verbosity httpTransport distDirLayout key = do
911+ readProjectFileSkeletonGen verbosity httpTransport distDirLayout key $ \ fp -> do
907912 debug verbosity " Reading project file using the fallback parser"
908- (res, bs) <- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout extensionName extensionDescription fp
913+ (res, bs) <- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout key fp
909914 let (_, pres) = runParseResult res
910915 case pres of
911916 -- 1. Successful parse with parsec parser, handle the result as normal.
912917 Right {} -> liftIO $ reportParseResultParsec verbosity fp bs res
913918 -- 2. The parse failed with the parsec parser, fallback to the legacy parser.
914919 Left {} -> do
915- lres <- parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription fp
920+ lres <- parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout key fp
916921 case lres of
917922 -- 3a. The legacy parser worked, but the parsec parser failed!
918923 -- Report a warning to the user that this happened.
919924 OldParser. ProjectParseOk {} -> do
920925 warn verbosity " The new parsec parser failed, but the legacy parser worked. This is unexpected, please report this as a bug.\n The legacy parser will be removed in the next major version."
921- liftIO $ reportParseResult verbosity extensionDescription fp lres
926+ liftIO $ reportParseResult verbosity ( extensionDescription key) fp lres
922927 -- 3b. The legacy parser failed as well, report the original error.
923928 OldParser. ProjectParseFailed {} -> do
924929 liftIO $ reportParseResultParsec verbosity fp bs res
925930
926931-- | Read a project file using the parsec parser.
927- readProjectFileSkeletonParsec :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> Rebuild ProjectConfigSkeleton
928- readProjectFileSkeletonParsec verbosity httpTransport distDirLayout extensionName extensionDescription = do
929- readProjectFileSkeletonGen verbosity httpTransport distDirLayout extensionName extensionDescription $ \ fp -> do
932+ readProjectFileSkeletonParsec :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> Rebuild ProjectConfigSkeleton
933+ readProjectFileSkeletonParsec verbosity httpTransport distDirLayout key = do
934+ readProjectFileSkeletonGen verbosity httpTransport distDirLayout key $ \ fp -> do
930935 debug verbosity " Reading project file using the parsec parser"
931- (res, bs) <- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout extensionName extensionDescription fp
936+ (res, bs) <- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout key fp
932937 liftIO $ reportParseResultParsec verbosity fp bs res
933938
934- readProjectFileSkeletonCompare :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> Rebuild ProjectConfigSkeleton
935- readProjectFileSkeletonCompare verbosity httpTransport distDirLayout extensionName extensionDescription = do
936- readProjectFileSkeletonGen verbosity httpTransport distDirLayout extensionName extensionDescription $ \ fp -> do
939+ readProjectFileSkeletonCompare :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> Rebuild ProjectConfigSkeleton
940+ readProjectFileSkeletonCompare verbosity httpTransport distDirLayout key = do
941+ readProjectFileSkeletonGen verbosity httpTransport distDirLayout key $ \ fp -> do
937942 debug verbosity " Reading project file using the comparative parser"
938- (pres, bs) <- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout extensionName extensionDescription fp
939- lres <- parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription fp
943+ (pres, bs) <- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout key fp
944+ lres <- parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout key fp
940945 let (_, ppres) = runParseResult pres
941946 case (lres, ppres) of
942947 -- 1. Both succeed, compare the results
@@ -947,12 +952,12 @@ readProjectFileSkeletonCompare verbosity httpTransport distDirLayout extensionNa
947952 -- Report a warning to the user that this happened.
948953 (OldParser. ProjectParseFailed {}, Right {}) -> do
949954 warn verbosity " The legacy parser failed, but the new parsec parser worked. This is unexpected, please report this as a bug.\n The legacy parser will be removed in the next major version."
950- liftIO $ reportParseResult verbosity extensionDescription fp lres
955+ liftIO $ reportParseResult verbosity ( extensionDescription key) fp lres
951956 -- 3. The legacy parser succeeded, but the parsec parser failed.
952957 -- Report a warning to the user that this happened.
953958 (OldParser. ProjectParseOk {}, Left {}) -> do
954959 warn verbosity " The new parsec parser failed, but the legacy parser worked. This is unexpected, please report this as a bug.\n The legacy parser will be removed in the next major version."
955- liftIO $ reportParseResult verbosity extensionDescription fp lres
960+ liftIO $ reportParseResult verbosity ( extensionDescription key) fp lres
956961 (OldParser. ProjectParseFailed {}, Left {}) -> do
957962 -- 4. Both failed, report the original error. We don't check that the same errors are reported.
958963 liftIO $ reportParseResultParsec verbosity fp bs pres
@@ -975,16 +980,16 @@ reportParseResultParsec verbosity fpath contents pr = do
975980 dieWithException verbosity $ ProjectConfigParseFailure $ ProjectConfigParseError errors warnings
976981
977982-- | Reads a named extended (with imports and conditionals) config file in the given project root dir, or returns empty.
978- parseProjectFileSkeletonLegacy :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> FilePath -> IO (OldParser. ProjectParseResult ProjectConfigSkeleton )
979- parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription extensionFile = do
983+ parseProjectFileSkeletonLegacy :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> FilePath -> IO (OldParser. ProjectParseResult ProjectConfigSkeleton )
984+ parseProjectFileSkeletonLegacy verbosity httpTransport distDirLayout key extensionFile = do
980985 bs <- BS. readFile extensionFile
981986 res <- parseProject extensionFile (distDownloadSrcDirectory distDirLayout) httpTransport verbosity $ ProjectConfigToParse bs
982987 case res of
983988 x@ (OldParser. ProjectParseOk _ skeleton) -> reportDuplicateImports verbosity skeleton >> pure x
984989 x@ OldParser. ProjectParseFailed {} -> pure x
985990
986- parseProjectFileSkeletonParsec :: Verbosity -> HttpTransport -> DistDirLayout -> String -> String -> FilePath -> IO (Parsec. ParseResult ProjectFileSource ProjectConfigSkeleton , BS. ByteString )
987- parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout extensionName extensionDescription extensionFile = do
991+ parseProjectFileSkeletonParsec :: Verbosity -> HttpTransport -> DistDirLayout -> ProjectFileKey -> FilePath -> IO (Parsec. ParseResult ProjectFileSource ProjectConfigSkeleton , BS. ByteString )
992+ parseProjectFileSkeletonParsec verbosity httpTransport distDirLayout key extensionFile = do
988993 bs <- BS. readFile extensionFile
989994 res <- Parsec. parseProject extensionFile (distDownloadSrcDirectory distDirLayout) httpTransport verbosity $ ProjectConfigToParse bs
990995 case snd $ runParseResult res of
@@ -1002,12 +1007,12 @@ showProjectConfig =
10021007-- | Write a @cabal.project.local@ file in the given project root dir.
10031008writeProjectLocalExtraConfig :: DistDirLayout -> ProjectConfig -> IO ()
10041009writeProjectLocalExtraConfig DistDirLayout {distProjectFile} =
1005- writeProjectConfigFile (distProjectFile " local " )
1010+ writeProjectConfigFile (distProjectFile ProjectFileKeyLocal )
10061011
10071012-- | Write a @cabal.project.freeze@ file in the given project root dir.
10081013writeProjectLocalFreezeConfig :: DistDirLayout -> ProjectConfig -> IO ()
10091014writeProjectLocalFreezeConfig DistDirLayout {distProjectFile} =
1010- writeProjectConfigFile (distProjectFile " freeze " )
1015+ writeProjectConfigFile (distProjectFile ProjectFileKeyFreeze )
10111016
10121017-- | Write in the @cabal.project@ format to the given file.
10131018writeProjectConfigFile :: FilePath -> ProjectConfig -> IO ()
0 commit comments