forked from commercialhaskell/stack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFreeze.hs
More file actions
79 lines (70 loc) · 2.46 KB
/
Freeze.hs
File metadata and controls
79 lines (70 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Stack.Freeze
( freeze
, FreezeOpts (..)
, FreezeMode (..)
) where
import Data.Aeson ((.=), object)
import qualified Data.Yaml as Yaml
import RIO.Process
import qualified RIO.ByteString as B
import Stack.Prelude
import Stack.Types.Config
data FreezeMode = FreezeProject | FreezeSnapshot
newtype FreezeOpts = FreezeOpts
{ freezeMode :: FreezeMode
}
freeze :: HasEnvConfig env => FreezeOpts -> RIO env ()
freeze (FreezeOpts mode) = do
mproject <- view $ configL.to configProject
let warn = logWarn "No project was found: nothing to freeze"
case mproject of
PCProject (p, _) -> doFreeze p mode
PCGlobalProject -> warn
PCNoProject _ -> warn
doFreeze ::
(HasProcessContext env, HasLogFunc env, HasPantryConfig env)
=> Project
-> FreezeMode
-> RIO env ()
doFreeze p FreezeProject = do
let deps = projectDependencies p
resolver = projectResolver p
completePackageLocation' pl =
case pl of
RPLImmutable pli -> PLImmutable <$> completePackageLocation pli
RPLMutable m -> pure $ PLMutable m
resolver' <- completeSnapshotLocation resolver
deps' <- mapM completePackageLocation' deps
let rawCompleted = map toRawPL deps'
rawResolver = toRawSL resolver'
if rawCompleted == deps && rawResolver == resolver
then
logInfo "No freezing is required for this project"
else do
logInfo "# Fields not mentioned below do not need to be updated"
if rawResolver == resolver
then logInfo "# No update to resolver is needed"
else do
logInfo "# Frozen version of resolver"
B.putStr $ Yaml.encode $ object ["resolver" .= rawResolver]
if rawCompleted == deps
then logInfo "# No update to extra-deps is needed"
else do
logInfo "# Frozen version of extra-deps"
B.putStr $ Yaml.encode $ object ["extra-deps" .= rawCompleted]
doFreeze p FreezeSnapshot = do
resolver <- completeSnapshotLocation $ projectResolver p
result <- loadSnapshotLayer resolver
case result of
Left _wc ->
logInfo "No freezing is required for compiler resolver"
Right snap -> do
snap' <- completeSnapshotLayer snap
let rawCompleted = toRawSnapshotLayer snap'
if rawCompleted == snap
then
logInfo "No freezing is required for the snapshot of this project"
else
liftIO $ B.putStr $ Yaml.encode snap'