@@ -83,6 +83,9 @@ module Stack.Types.Config
8383 ,GlobalOptsMonoid (.. )
8484 ,StackYamlLoc (.. )
8585 ,stackYamlLocL
86+ ,LockFileBehavior (.. )
87+ ,readLockFileBehavior
88+ ,lockFileBehaviorL
8689 ,defaultLogLevel
8790 -- ** Project & ProjectAndConfigMonoid
8891 ,Project (.. )
@@ -210,6 +213,7 @@ import qualified Options.Applicative.Types as OA
210213import Pantry.SQLite (Storage )
211214import Path
212215import qualified Paths_stack as Meta
216+ import qualified RIO.List as List
213217import RIO.PrettyPrint (HasTerm (.. ))
214218import RIO.PrettyPrint.StylesUpdate (StylesUpdate ,
215219 parseStylesUpdateFromString , HasStylesUpdate (.. ))
@@ -487,6 +491,7 @@ data GlobalOpts = GlobalOpts
487491 , globalStylesUpdate :: ! StylesUpdate -- ^ SGR (Ansi) codes for styles
488492 , globalTermWidth :: ! (Maybe Int ) -- ^ Terminal width override
489493 , globalStackYaml :: ! StackYamlLoc -- ^ Override project stack.yaml
494+ , globalLockFileBehavior :: ! LockFileBehavior
490495 } deriving (Show )
491496
492497-- | Location for the project's stack.yaml file.
@@ -505,6 +510,38 @@ data StackYamlLoc
505510stackYamlLocL :: HasRunner env => Lens' env StackYamlLoc
506511stackYamlLocL = globalOptsL. lens globalStackYaml (\ x y -> x { globalStackYaml = y })
507512
513+ -- | How to interact with lock files
514+ data LockFileBehavior
515+ = LFBReadWrite
516+ -- ^ Read and write lock files
517+ | LFBReadOnly
518+ -- ^ Read lock files, but do not write them
519+ | LFBIgnore
520+ -- ^ Entirely ignore lock files
521+ | LFBErrorOnWrite
522+ -- ^ Error out on trying to write a lock file. This can be used to
523+ -- ensure that lock files in a repository already ensure
524+ -- reproducible builds.
525+ deriving (Show , Enum , Bounded )
526+
527+ lockFileBehaviorL :: HasRunner env => SimpleGetter env LockFileBehavior
528+ lockFileBehaviorL = globalOptsL. to globalLockFileBehavior
529+
530+ -- | Parser for 'LockFileBehavior'
531+ readLockFileBehavior :: ReadM LockFileBehavior
532+ readLockFileBehavior = do
533+ s <- OA. readerAsk
534+ case Map. lookup s m of
535+ Just x -> pure x
536+ Nothing -> OA. readerError $ " Invalid lock file behavior, valid options: " ++
537+ List. intercalate " , " (Map. keys m)
538+ where
539+ m = Map. fromList $ map (\ x -> (render x, x)) [minBound .. maxBound ]
540+ render LFBReadWrite = " read-write"
541+ render LFBReadOnly = " read-only"
542+ render LFBIgnore = " ignore"
543+ render LFBErrorOnWrite = " error-on-write"
544+
508545-- | Project configuration information. Not every run of Stack has a
509546-- true local project; see constructors below.
510547data ProjectConfig a
@@ -532,6 +569,7 @@ data GlobalOptsMonoid = GlobalOptsMonoid
532569 , globalMonoidStyles :: ! StylesUpdate -- ^ Stack's output styles
533570 , globalMonoidTermWidth :: ! (First Int ) -- ^ Terminal width override
534571 , globalMonoidStackYaml :: ! (First FilePath ) -- ^ Override project stack.yaml
572+ , globalMonoidLockFileBehavior :: ! (First LockFileBehavior ) -- ^ See 'globalLockFileBehavior'
535573 } deriving Generic
536574
537575instance Semigroup GlobalOptsMonoid where
0 commit comments