@@ -11,7 +11,7 @@ import Distribution.Nixpkgs.Haskell.Stack
1111import Distribution.Nixpkgs.Haskell.Stack.PrettyPrinting as PP
1212import Distribution.Version (Version)
1313import Distribution.Compiler (AbiTag(..), unknownCompilerInfo)
14−import Distribution.Package (mkPackageName, pkgName)
14+import Distribution.Package (PackageName, mkPackageName, pkgName)
1515import Distribution.Text as Text (display)
1616import Language.Nix as Nix
1717import Options.Applicative
@@ -32,7 +32,7 @@ run = do
3232 opts <- execParser pinfo
3333 let
3434 -- With optparse-applicative it seems there's no way to make
35− -- 'StackageOptions' optional for stackage override and required in
35+ -- 'StackageOptions' optional for Stackage override and required in
3636 -- other cases
3737 missingErr = error . ("Missing required parameter: " <>)
3838 sopts = StackageOptions
@@ -46,25 +46,20 @@ run = do
4646 let
4747 stackResolver = stackConf ^. scResolver
4848 stackPackagesConfig = mkStackPackagesConfig opts
49− stackConfPackages <- traverse (packageDerivation stackPackagesConfig (opts ^. optHackageDb))
49+ stackConfPackages <- traverse (fmap mkNode . packageDerivation stackPackagesConfig (opts ^. optHackageDb))
5050 $ stackConf ^. scPackages
51− let
52− reachable = Set.map mkPackageName
53− $ F.foldr1 Set.union
54− $ nodeDepends . mkNode <$> stackConfPackages
5551
5652 case buildTarget of
5753 TargetStackageClosure -> do
5854 (buildPlanFile, buildPlan, packageSetConfig) <- loadStackageBuildPlan stackResolver opts sopts
5955 let
6056 overrideConfig = mkOverrideConfig opts (siGhcVersion $ bpSystemInfo buildPlan)
61− stackageLoader mHash pkgId =
62− if pkgName pkgId `Set.member` reachable
63− then packageLoader packageSetConfig Nothing pkgId
64− else packageLoader packageSetConfig mHash pkgId
65− stackageSetConfig = packageSetConfig { packageLoader = stackageLoader }
57+ stackageSetConfig = if opts ^. optTweaks . tExtraDepsRevisionLatest
58+ then extraDepsLatestConfig stackConfPackages packageSetConfig
59+ else packageSetConfig
6660 stackagePackages <- buildStackagePackages stackageSetConfig buildPlan
6761 let
62+ reachable = reachableDeps stackConfPackages
6863 -- Nixpkgs generic-builder puts hscolour on path for all libraries
6964 withHscolour pkgs =
7065 let hscolour = F.find ((== "hscolour") . nodeName) stackagePackages
@@ -86,28 +81,34 @@ run = do
8681 writeOutFile buildPlanFile (opts ^. optOutStackageConfig)
8782 $ pPrintOutConfig (bpSystemInfo buildPlan) nodes
8883 writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation)
89− $ PP.overrideHaskellPackages overrideConfig stackConfPackages
84+ $ PP.overrideHaskellPackages overrideConfig (view nodeDerivation <$> stackConfPackages)
9085
9186 TargetStackagePackages -> do
9287 (buildPlanFile, buildPlan, packageSetConfig) <- loadStackageBuildPlan stackResolver opts sopts
9388 let
9489 overrideConfig = mkOverrideConfig opts (siGhcVersion $ bpSystemInfo buildPlan)
95− stackageLoader mHash pkgId =
96− if pkgName pkgId `Set.member` reachable
97− then packageLoader packageSetConfig Nothing pkgId
98− else packageLoader packageSetConfig mHash pkgId
99− stackageSetConfig = packageSetConfig { packageLoader = stackageLoader }
90+ stackageSetConfig = if opts ^. optTweaks . tExtraDepsRevisionLatest
91+ then extraDepsLatestConfig stackConfPackages packageSetConfig
92+ else packageSetConfig
93+ -- stackageLoader mHash pkgId =
94+ -- if pkgName pkgId `Set.member` reachable
95+ -- then packageLoader packageSetConfig Nothing pkgId
96+ -- else packageLoader packageSetConfig mHash pkgId
97+ -- stackageSetConfig = packageSetConfig { packageLoader = stackageLoader }
10098 nodes <- buildStackagePackages stackageSetConfig buildPlan
10199 writeOutFile buildPlanFile (opts ^. optOutStackagePackages)
102100 $ pPrintOutPackages (view nodeDerivation <$> nodes)
103101 writeOutFile buildPlanFile (opts ^. optOutStackageConfig)
104102 $ pPrintOutConfig (bpSystemInfo buildPlan) nodes
105103 writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation)
106− $ PP.overrideHaskellPackages overrideConfig stackConfPackages
104+ $ PP.overrideHaskellPackages overrideConfig (view nodeDerivation <$> stackConfPackages)
107105
108106 TargetStackageOverride ->
109− writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation)
110− $ PP.overrideStackage (stackConf ^. scResolver) (opts ^. optNixpkgsRepository) stackConfPackages
107+ writeOutFile (stackYaml ^. syFilePath) (opts ^. optOutDerivation) $
108+ PP.overrideStackage
109+ (stackConf ^. scResolver)
110+ (opts ^. optNixpkgsRepository)
111+ (view nodeDerivation <$> stackConfPackages)
111112
112113 -- Generate Stackage packages from resolver
113114 OriginResolver stackResolver -> do
@@ -141,6 +142,23 @@ buildStackagePackages packageSetConfig buildPlan = do
141142 traverse (uncurry (buildNode packageSetConfig stackagePackageConfig))
142143 $ Map.toAscList (bpPackages buildPlan)
143144
145+reachableDeps :: Traversable t => t Node -> Set.Set PackageName
146+reachableDeps = Set.map mkPackageName
147+ . F.foldr1 Set.union
148+ . fmap nodeDepends
149+
150+-- Return 'PackageSetConfig' with package loader that loads latest Hackage
151+-- revison for direct (reachable) dependencies of input packages
152+extraDepsLatestConfig :: Traversable t => t Node -> PackageSetConfig -> PackageSetConfig
153+extraDepsLatestConfig packages packageSetConfig =
154+ let
155+ reachable = reachableDeps packages
156+ stackageLoader mHash pkgId =
157+ if pkgName pkgId `Set.member` reachable
158+ then packageLoader packageSetConfig Nothing pkgId
159+ else packageLoader packageSetConfig mHash pkgId
160+ in packageSetConfig { packageLoader = stackageLoader }
161+
144162writeOutFile :: Show source => source -> FilePath -> Doc -> IO ()
145163writeOutFile source filePath contents =
146164 withFile filePath WriteMode $ \h -> do