cabal-cargs 0.3 → 0.3.1
raw patch · 4 files changed
+60/−21 lines, 4 files
Files
- cabal-cargs.cabal +2/−2
- lib/CabalCargs/Spec.hs +33/−17
- tests/inputFiles/withSandbox/.cabal-sandbox/x86_64-linux-ghc-7.6.2-packages.conf.d/.gitignore +0/−2
- tests/inputFiles/withSandbox/cabal.sandbox.config +25/−0
cabal-cargs.cabal view
@@ -1,5 +1,5 @@ name: cabal-cargs-version: 0.3+version: 0.3.1 cabal-version: >=1.9.2 build-type: Simple license: BSD3@@ -20,8 +20,8 @@ tests/inputFiles/withoutSandbox/exe/Source.hs tests/inputFiles/withoutSandbox/lib/Source.hs tests/inputFiles/withSandbox/test.cabal+ tests/inputFiles/withSandbox/cabal.sandbox.config tests/inputFiles/withSandbox/dist/dist-sandbox-6d1acfa0/.gitignore- tests/inputFiles/withSandbox/.cabal-sandbox/x86_64-linux-ghc-7.6.2-packages.conf.d/.gitignore tests/inputFiles/withSandbox/exe/Source.hs tests/inputFiles/withSandbox/lib/Source.hs tests/goldenFiles/withoutSandbox/*.txt
lib/CabalCargs/Spec.hs view
@@ -25,7 +25,8 @@ import Filesystem.Path.CurrentOS ((</>)) import qualified Filesystem as FS import qualified Data.Text as T-import Data.List (find, isSuffixOf, isPrefixOf)+import Data.List (find, isPrefixOf)+import qualified Data.List as L import Data.Maybe (isJust) @@ -43,6 +44,8 @@ type Error = String++io :: MonadIO m => IO a -> m a io = liftIO @@ -91,9 +94,9 @@ -- the path to its package database is also returned. fromCabalFile :: FilePath -> S.Sections -> F.Fields -> EitherT Error IO Spec fromCabalFile file sections fields = do- pkgDB <- io $ findPackageDB file- distDir <- io $ findDistDir file pkgDescrp <- packageDescription file+ pkgDB <- findPackageDB file+ distDir <- io $ findDistDir file absFile <- FP.encodeString <$> (io $ absoluteFile file) right $ Spec { sections = sections@@ -120,7 +123,7 @@ fromSourceFile :: FilePath -> F.Fields -> EitherT Error IO Spec fromSourceFile file fields = do cabalFile <- findCabalFile file- pkgDB <- io $ findPackageDB cabalFile+ pkgDB <- findPackageDB cabalFile distDir <- io $ findDistDir cabalFile pkgDescrp <- packageDescription cabalFile srcSections <- io $ findSections file cabalFile pkgDescrp@@ -261,21 +264,34 @@ -- | Find the package database of the cabal sandbox from the given cabal file. -- The returned file path is relative to the directory of the cabal file.-findPackageDB :: FilePath -> IO (Maybe FilePath)+findPackageDB :: FilePath -> EitherT Error IO (Maybe FilePath) findPackageDB cabalFile = do- cabalDir <- absoluteDirectory cabalFile- let sandboxDir = cabalDir </> FP.decodeString ".cabal-sandbox"- hasDir <- FS.isDirectory sandboxDir- if hasDir+ cabalDir <- io $ absoluteDirectory cabalFile+ let sandboxConfig = cabalDir </> sandbox_config+ isFile <- io $ FS.isFile sandboxConfig+ if isFile then do- files <- filterM FS.isDirectory =<< (FS.listDirectory sandboxDir)- return $ FP.encodeString . (stripPrefix cabalDir) <$> find isPackageDB files- else return Nothing+ packageDB <- io $ readPackageDB sandboxConfig+ case packageDB of+ Just db -> right . Just $ stripPrefix cabalDir db+ _ -> left $ "Couldn't find field 'package-db: ' in " ++ (show sandboxConfig)+ else+ right Nothing where- isPackageDB file = "packages.conf.d" `isSuffixOf` (FP.encodeString file)+ -- | reads the 'package-db: ' field from the sandbox config file and returns the value of the field+ readPackageDB :: FP.FilePath -> IO (Maybe FP.FilePath)+ readPackageDB sandboxConfig = do+ lines <- lines <$> Strict.readFile (FP.encodeString sandboxConfig)+ return $ do+ line <- find (package_db `L.isPrefixOf`) lines+ packageDB <- L.stripPrefix package_db line+ return $ FP.decodeString packageDB + sandbox_config = FP.decodeString "cabal.sandbox.config"+ package_db = "package-db: " + -- | Find the dist directory of the cabal build from the given cabal file. For a non sandboxed -- build it's just the directory 'dist' in the cabal build directory. For a sandboxed build -- it's the directory 'dist/dist-sandbox-*'. The returned file path is relative to the@@ -288,7 +304,7 @@ if hasDistDir then do files <- filterM FS.isDirectory =<< (FS.listDirectory distDir)- return $ FP.encodeString . (stripPrefix cabalDir) <$> maybe (Just distDir) Just (find isSandboxDistDir files)+ return $ (stripPrefix cabalDir) <$> maybe (Just distDir) Just (find isSandboxDistDir files) else return Nothing where@@ -309,13 +325,13 @@ absoluteFile = FS.canonicalizePath . FP.decodeString -stripPrefix :: FP.FilePath -> FP.FilePath -> FP.FilePath+stripPrefix :: FP.FilePath -> FP.FilePath -> FilePath stripPrefix prefix file | Just stripped <- FP.stripPrefix prefix file- = stripped+ = FP.encodeString stripped | otherwise- = file+ = FP.encodeString file combineSections :: S.Sections -> [S.Section] -> S.Sections
− tests/inputFiles/withSandbox/.cabal-sandbox/x86_64-linux-ghc-7.6.2-packages.conf.d/.gitignore
@@ -1,2 +0,0 @@-*-!.gitignore
+ tests/inputFiles/withSandbox/cabal.sandbox.config view
@@ -0,0 +1,25 @@+-- This is a Cabal package environment file.+-- THIS FILE IS AUTO-GENERATED. DO NOT EDIT DIRECTLY.+-- Please create a 'cabal.config' file in the same directory+-- if you want to change the default settings for this sandbox.+++local-repo: .cabal-sandbox/packages+logs-dir: .cabal-sandbox/logs+world-file: .cabal-sandbox/world+user-install: False+package-db: .cabal-sandbox/x86_64-linux-ghc-7.6.2-packages.conf.d+build-summary: .cabal-sandbox/logs/build.log++install-dirs + prefix: .cabal-sandbox+ bindir: $prefix/bin+ libdir: $prefix/lib+ libsubdir: $arch-$os-$compiler/$pkgid+ libexecdir: $prefix/libexec+ datadir: $prefix/share+ datasubdir: $arch-$os-$compiler/$pkgid+ docdir: $datadir/doc/$arch-$os-$compiler/$pkgid+ htmldir: $docdir/html+ haddockdir: $htmldir+ sysconfdir: $prefix/etc