@@ -8,6 +8,7 @@ module Stack2nix
8
8
9
9
import qualified Data.Text as T
10
10
import Data.String (fromString )
11
+ import Data.Maybe (fromMaybe )
11
12
12
13
import Control.Monad.Trans.Maybe
13
14
import Control.Monad.IO.Class (liftIO )
@@ -161,42 +162,43 @@ packages2nix args pkgs =
161
162
prettyNix <$> cabal2nix True (argDetailLevel args) src cabalFile
162
163
return (fromString pkg, fromString pkg $= mkPath False nix)
163
164
(DVCS (Git url rev) _ subdirs) ->
164
- fmap concat . forM subdirs $ \ subdir ->
165
- do cacheHits <- liftIO $ cacheHits (argCacheFile args) url rev subdir
166
- case cacheHits of
167
- [] -> do
168
- fetch (\ dir -> cabalFromPath url rev subdir $ dir </> subdir)
169
- (Source url rev UnknownHash subdir) >>= \ case
170
- (Just (DerivationSource {.. }, genBindings)) -> genBindings derivHash
171
- _ -> return []
172
- hits ->
173
- forM hits $ \ ( pkg, nix ) -> do
165
+ do hits <- forM subdirs $ \ subdir -> liftIO $ cacheHits (argCacheFile args) url rev subdir
166
+ if any null hits
167
+ then
168
+ fetch (return . cabalFromPath url rev subdirs)
169
+ (Source url rev UnknownHash ) >>= \ case
170
+ (Just (DerivationSource {.. }, genBindings)) -> fromMaybe [] <$> runMaybeT (genBindings derivHash)
171
+ _ -> return []
172
+ else
173
+ forM (concat hits) $ \ ( pkg, nix ) ->
174
174
return (fromString pkg, fromString pkg $= mkPath False nix)
175
175
_ -> return []
176
176
where relPath = shortRelativePath (argOutputDir args) (dropFileName (argStackYaml args))
177
177
cabalFromPath
178
- :: String -- URL
179
- -> String -- Revision
180
- -> FilePath -- Subdir
181
- -> FilePath -- Local Directory
182
- -> MaybeT IO (String -> IO [(T. Text , Binding NExpr )])
183
- cabalFromPath url rev subdir path = do
184
- d <- liftIO $ doesDirectoryExist path
185
- unless d $ fail (" not a directory: " ++ path)
186
- cabalFiles <- liftIO $ findCabalFiles (argHpackUse args) path
187
- return $ \ sha256 ->
178
+ :: String -- URL
179
+ -> String -- Revision
180
+ -> [FilePath ] -- Subdirs
181
+ -> FilePath -- Local Directory
182
+ -> String -- Sha256
183
+ -> MaybeT IO [(T. Text , Binding NExpr )]
184
+ cabalFromPath url rev subdirs dir sha256 =
185
+ fmap concat . forM subdirs $ \ subdir -> do
186
+ let path = dir </> subdir
187
+ d <- liftIO $ doesDirectoryExist path
188
+ unless d $ fail (" not a directory: " ++ path)
189
+ cabalFiles <- liftIO $ findCabalFiles (argHpackUse args) path
188
190
forM cabalFiles $ \ cabalFile -> do
189
- let pkg = cabalFilePkgName cabalFile
190
- nix = pkg <.> " nix"
191
- nixFile = argOutputDir args </> nix
192
- subdir' = if subdir == " ." then Nothing
193
- else Just subdir
194
- src = Just $ C2N. Git url rev (Just sha256) subdir'
195
- createDirectoryIfMissing True (takeDirectory nixFile)
196
- writeDoc nixFile =<<
197
- prettyNix <$> cabal2nix True (argDetailLevel args) src cabalFile
198
- liftIO $ appendCache (argCacheFile args) url rev subdir sha256 pkg nix
199
- return (fromString pkg, fromString pkg $= mkPath False nix)
191
+ let pkg = cabalFilePkgName cabalFile
192
+ nix = pkg <.> " nix"
193
+ nixFile = argOutputDir args </> nix
194
+ subdir' = if subdir == " ." then Nothing
195
+ else Just subdir
196
+ src = Just $ C2N. Git url rev (Just sha256) subdir'
197
+ liftIO $ createDirectoryIfMissing True (takeDirectory nixFile)
198
+ liftIO $ writeDoc nixFile =<<
199
+ prettyNix <$> cabal2nix True (argDetailLevel args) src cabalFile
200
+ liftIO $ appendCache (argCacheFile args) url rev subdir sha256 pkg nix
201
+ return (fromString pkg, fromString pkg $= mkPath False nix)
200
202
201
203
defaultNixContents :: String
202
204
defaultNixContents = unlines
0 commit comments