hix 0.9.0 → 0.9.1
raw patch · 36 files changed
+280/−141 lines, 36 filesdep ~hix
Dependency ranges changed: hix
Files
- hix.cabal +4/−3
- lib/Hix.hs +1/−1
- lib/Hix/Class/Map.hs +7/−0
- lib/Hix/Console.hs +3/−0
- lib/Hix/Managed/Build.hs +18/−16
- lib/Hix/Managed/Build/Single.hs +2/−1
- lib/Hix/Managed/Build/Solve.hs +20/−12
- lib/Hix/Managed/Build/SolverPackages.hs +6/−2
- lib/Hix/Managed/Build/Target.hs +2/−1
- lib/Hix/Managed/Cabal/Changes.hs +2/−5
- lib/Hix/Managed/Cabal/Data/SolvedId.hs +28/−0
- lib/Hix/Managed/Cabal/Data/SolverState.hs +3/−2
- lib/Hix/Managed/Data/Initial.hs +3/−0
- lib/Hix/Managed/Data/Mutation.hs +2/−2
- lib/Hix/Managed/Data/StageState.hs +4/−4
- lib/Hix/Managed/Handlers/Build.hs +9/−9
- lib/Hix/Managed/Handlers/Build/Prod.hs +19/−8
- lib/Hix/Managed/Handlers/Build/Test.hs +2/−1
- lib/Hix/Managed/Handlers/Mutation.hs +5/−3
- lib/Hix/Managed/Handlers/Mutation/Bump.hs +8/−7
- lib/Hix/Managed/Handlers/Mutation/Lower.hs +8/−7
- lib/Hix/Managed/Lower/Data/LowerMode.hs +1/−2
- lib/Hix/Managed/Lower/Stabilize.hs +4/−4
- lib/Hix/Managed/Overrides.hs +4/−3
- lib/Hix/Managed/StageContext.hs +1/−1
- lib/Hix/Managed/StageState.hs +5/−4
- lib/Hix/Monad.hs +2/−2
- test/Hix/Test/Managed/Bump/MutationTest.hs +67/−19
- test/Hix/Test/Managed/LowerAuto/MutationOptimizeTest.hs +5/−4
- test/Hix/Test/Managed/LowerAuto/MutationStabilizeTest.hs +4/−3
- test/Hix/Test/Managed/LowerInit/MutationTest.hs +4/−3
- test/Hix/Test/Managed/LowerOptimize/CandidatesTest.hs +4/−1
- test/Hix/Test/Managed/LowerOptimize/MutationTest.hs +4/−3
- test/Hix/Test/Managed/LowerOptimize/OrderTest.hs +3/−2
- test/Hix/Test/Managed/LowerStabilize/MutationTest.hs +4/−3
- testing/Hix/Test/Managed/Run.hs +12/−3
hix.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: hix-version: 0.9.0+version: 0.9.1 synopsis: Haskell/Nix development build tools description: See https://hackage.haskell.org/package/hix/docs/Hix.html category: Build@@ -99,6 +99,7 @@ Hix.Managed.Cabal.Data.InstalledOverrides Hix.Managed.Cabal.Data.Packages Hix.Managed.Cabal.Data.Revision+ Hix.Managed.Cabal.Data.SolvedId Hix.Managed.Cabal.Data.SolveResources Hix.Managed.Cabal.Data.SolverState Hix.Managed.Cabal.Data.SolveTarget@@ -394,7 +395,7 @@ , generic-lens ==2.2.* , generics-sop ==0.5.* , hedgehog >=1.1 && <1.5- , hix:hix ==0.9.0+ , hix:hix ==0.9.1 , http-client ==0.7.* , http-client-tls ==0.3.* , http-types ==0.12.*@@ -556,7 +557,7 @@ , extra ==1.7.* , hedgehog >=1.1 && <1.5 , hix- , hix:testing ==0.9.0+ , hix:testing ==0.9.1 , incipit-base >=0.5 && <0.7 , path ==0.9.* , path-io >=1.7 && <1.9
lib/Hix.hs view
@@ -20,7 +20,7 @@ import Hix.Preproc (preprocess) hixVersion :: Text-hixVersion = "0.9.0"+hixVersion = "0.9.1" runCommand :: Command -> M () runCommand = \case
lib/Hix/Class/Map.hs view
@@ -792,3 +792,10 @@ Bool nMember k = Map.member k . nGet++nNull ::+ NMap map k v sort =>+ map ->+ Bool+nNull =+ null . nGet
lib/Hix/Console.hs view
@@ -49,6 +49,9 @@ color n = sgis [show (30 + n)] +bold :: Text -> Text+bold = sgis ["1"]+ data ColorOffsets = ColorOffsets { black :: Int,
lib/Hix/Managed/Build.hs view
@@ -22,11 +22,13 @@ import Hix.Managed.Build.Solve (solveMutation) import qualified Hix.Managed.Cabal.Changes import Hix.Managed.Cabal.Config (isNonReinstallableDep, isReinstallableId)+import Hix.Managed.Cabal.Data.SolvedId (SolvedId (..)) import Hix.Managed.Cabal.Data.SolverState (SolverState) import qualified Hix.Managed.Data.BuildConfig import Hix.Managed.Data.BuildConfig (BuildConfig) import qualified Hix.Managed.Data.EnvContext import Hix.Managed.Data.EnvContext (EnvContext)+import Hix.Managed.Data.Initial (Initial (..)) import Hix.Managed.Data.Mutable (MutableDep, addBuildVersions) import qualified Hix.Managed.Data.Mutation import Hix.Managed.Data.Mutation (BuildMutation (BuildMutation), DepMutation, MutationResult (..))@@ -61,7 +63,7 @@ logBuildInputs :: EnvName -> Text ->- [PackageId] ->+ [SolvedId] -> M () logBuildInputs env description overrides = do Log.info [exon|Building targets in #{Color.env env} with #{Color.package description}...|]@@ -107,7 +109,7 @@ Text -> Bool -> Versions ->- [PackageId] ->+ [SolvedId] -> M (Overrides, BuildStatus) buildVersions builder context description allowRevisions versions overrideVersions = do logBuildInputs context.env description reinstallable@@ -115,7 +117,7 @@ logBuildResult description result pure (overrides, buildStatus result) where- reinstallable = filter isReinstallableId overrideVersions+ reinstallable = filter (isReinstallableId . (.package)) overrideVersions buildConstraints :: EnvBuilder ->@@ -152,7 +154,7 @@ logMutationResult :: MutableDep ->- MutationResult s ->+ MutationResult -> M () logMutationResult package = \case MutationSuccess {candidate, changed = True} ->@@ -167,10 +169,10 @@ validateMutation :: EnvBuilder -> EnvContext ->- MutationHandlers a s ->- StageState a s ->+ MutationHandlers a ->+ StageState a SolverState -> DepMutation a ->- M (StageState a s)+ M (StageState a SolverState) validateMutation envBuilder context handlers stageState mutation = do result <- processReinstallable logMutationResult mutation.package result@@ -179,19 +181,19 @@ processReinstallable = if isNonReinstallableDep mutation.package then pure MutationKeep- else handlers.process stageState.ext mutation build+ else handlers.process (Initial stageState.ext) mutation build build = buildMutation envBuilder context stageState.state convergeMutations :: Pretty a =>- MutationHandlers a s ->+ MutationHandlers a -> BuildConfig -> EnvBuilder -> EnvContext ->- StageState a s ->+ StageState a SolverState -> [DepMutation a] ->- M (StageState a s)+ M (StageState a SolverState) convergeMutations handlers conf builder context state0 = spin state0 {iterations = 0} where@@ -235,16 +237,16 @@ processQuery :: Pretty a => (QueryDep -> M (Maybe (DepMutation a))) ->- MutationHandlers a s ->+ MutationHandlers a -> BuildConfig -> StageContext ->- s ->- M (StageState a s)-processQuery candidates handlers conf StageContext {env, builder, state, query = query} ext = do+ Initial SolverState ->+ M (StageState a SolverState)+processQuery candidates handlers conf StageContext {env, builder, state, query = query} solverState = do mutations <- postprocess =<< reinstallableCandidates candidates query convergeMutations handlers conf builder env stageState mutations where postprocess | conf.toposortMutations = sortMutations | otherwise = pure- stageState = initStageState state ext+ stageState = initStageState state solverState CabalHandlers {sortMutations} = builder.cabal
lib/Hix/Managed/Build/Single.hs view
@@ -8,6 +8,7 @@ import Hix.Managed.Constraints (fromVersions) import qualified Hix.Managed.Data.EnvContext import Hix.Managed.Data.EnvContext (EnvContext)+import Hix.Managed.Data.Initial (initial) import Hix.Managed.Data.Mutable (MutableVersions) import Hix.Managed.Data.StageState (BuildStatus (Failure)) import Hix.Managed.Handlers.Build (EnvBuilder)@@ -22,7 +23,7 @@ Maybe Overrides -> M BuildStatus buildVersions builder context description versions prevOverrides =- buildConstraints builder context description False (fold prevOverrides) solver <&> \case+ buildConstraints builder context description False (fold prevOverrides) (initial solver) <&> \case Just (_, _, status) -> status Nothing -> Failure where
lib/Hix/Managed/Build/Solve.hs view
@@ -1,6 +1,5 @@ module Hix.Managed.Build.Solve where -import Data.List (partition) import qualified Data.Set as Set import Distribution.PackageDescription (customFieldsPD) import Distribution.Pretty (pretty)@@ -8,12 +7,14 @@ import Text.PrettyPrint (hang, ($$), (<+>)) import Hix.Class.Map (nRestrictKeys)+import Hix.Console (bold) import Hix.Data.Monad (M) import Hix.Data.PackageId (PackageId) import Hix.Data.Version (packageIdVersions) import qualified Hix.Log as Log import qualified Hix.Managed.Cabal.Changes import Hix.Managed.Cabal.Changes (SolverChanges (SolverChanges), SolverPlan (SolverPlan))+import Hix.Managed.Cabal.Data.SolvedId (SolvedId (..), revisedId, unrevisedId) import qualified Hix.Managed.Cabal.Data.SolverState import Hix.Managed.Cabal.Data.SolverState (SolverState) import qualified Hix.Managed.Data.EnvContext@@ -26,7 +27,7 @@ logNonReinstallable :: NonEmpty PackageId -> M () logNonReinstallable ids =- Log.verbose [exon|NOTE: Cabal solver suggested new versions for non-reinstallable packages: #{showPL ids}|]+ Log.verbose [exon|#{bold "Note"}: Cabal solver suggested new versions for non-reinstallable packages: #{showPL ids}|] -- | Forcing revisions means that any package that has a revision in the Hackage snapshot will be treated as an -- override, i.e. it will be built from Hackage despite having the same version as the one installed in nixpkgs.@@ -43,16 +44,21 @@ checkRevision :: Bool -> CabalHandlers ->+ Set PackageId -> PackageId ->- Either PackageId PackageId-checkRevision forceRevisions cabal package+ Either SolvedId SolvedId+checkRevision forceRevisions cabal prevRevisions package+ | Set.member package prevRevisions+ = Right revision | forceRevisions , Just packageDesc <- cabal.sourcePackage package , any isRevision packageDesc.customFieldsPD- = Right package+ = Right revision | otherwise- = Left package+ = Left (unrevisedId package) where+ revision = revisedId package+ isRevision = \case ("x-revision", rev) | rev /= "0" -> True _ -> False@@ -67,20 +73,22 @@ processSolverPlan forceRevisions cabal deps prevRevisions SolverPlan {..} = do Log.debugP $ hang "New project deps from solver:" 2 (pretty projectDeps) $$- "Forced revisions:" <+> prettyL forcedRevisions $$- "Reused revisions:" <+> prettyL reusedRevisions+ "Revisions:" <+> prettyL revisions traverse_ logNonReinstallable nonReinstallable pure SolverChanges {versions, overrides} where projectDeps = nRestrictKeys mutablePIds versions- versions = packageIdVersions (overrides ++ installed)- overrides = changes ++ forcedRevisions ++ reusedRevisions++ versions = packageIdVersions ((.package) <$> (overrides ++ installed))++ overrides = (unrevisedId <$> changes) ++ revisions+ -- If a package has been selected for revision during a prior build, add it to the overrides despite its matching -- version. -- This simply ensures that the revision procedure can be skipped in this build, since the same version will likely -- cause the same dependency bounds error that triggered the revision.- (reusedRevisions, installed) = partition (flip Set.member prevRevisions) noForcedRevisions- (noForcedRevisions, forcedRevisions) = partitionEithers (checkRevision forceRevisions cabal <$> matching)+ (installed, revisions) = partitionEithers (checkRevision forceRevisions cabal prevRevisions <$> matching)+ mutablePIds = Set.fromList (depName <$> Set.toList deps.mutable) -- TODO probably best to store the revisions in the SolverState
lib/Hix/Managed/Build/SolverPackages.hs view
@@ -15,6 +15,7 @@ import Hix.Managed.Data.StageState (BuildResult (..)) import Hix.Monad (appContext, eitherFatal) import Hix.Pretty (showP)+import Hix.Class.Map (nNull) badOutput :: Text -> Text badOutput output = [exon|The output of building the solver package set is not a single valid store path: #{output}|]@@ -49,9 +50,12 @@ leftA cleanBuild =<< previousBuild where cleanBuild err = do- Log.verbose "Build with previous solver overrides failed"+ Log.info+ if nNull storedOverrides+ then "Vanilla package set doesn't build. Computing overrides..."+ else "Build with previous solver overrides failed. Recomputing overrides..." Log.debug err- appContext "computing the overrides for the solver package set" do+ appContext "computing new overrides for the solver package set" do solverResult =<< runStateT (build (suggestJailbreakAndLatestVersion resources)) (mempty, mempty) previousBuild = do
lib/Hix/Managed/Build/Target.hs view
@@ -19,6 +19,7 @@ ) import Hix.Managed.Build.NixOutput.Analysis (FailureReason (..)) import Hix.Managed.Build.NixProcess (nixBuild)+import Hix.Managed.Cabal.Data.SolvedId (SolvedId) import Hix.Managed.Data.BuildConfig (BuildConfig) import Hix.Managed.Data.StageState (BuildResult (..), buildUnsuccessful) import Hix.Managed.Data.Targets (Targets, firstMTargets)@@ -132,7 +133,7 @@ EnvBuilderResources -> Bool -> Versions ->- [PackageId] ->+ [SolvedId] -> M (BuildResult, Overrides) buildTargets builder allowRevisions _ overrideVersions = do overrides <- packageOverrides builder.global.hackage builder.localUnavailable overrideVersions
lib/Hix/Managed/Cabal/Changes.hs view
@@ -10,6 +10,7 @@ import Distribution.Solver.Types.SourcePackage (SourcePackage (..)) import Text.PrettyPrint (hang, ($+$)) +import Hix.Managed.Cabal.Data.SolvedId (SolvedId) import qualified Hix.Data.PackageId as PackageId import Hix.Data.PackageId (PackageId) import Hix.Data.Version (Versions)@@ -56,14 +57,10 @@ data SolverChanges = SolverChanges { versions :: Versions,- overrides :: [PackageId]- -- ,- -- projectDeps :: Versions+ overrides :: [SolvedId] } deriving stock (Eq, Show, Generic) instance Pretty SolverChanges where pretty SolverChanges {..} = hang "overrides:" 2 (prettyL overrides)- -- $+$- -- hang "projectDeps:" 2 (pretty projectDeps)
+ lib/Hix/Managed/Cabal/Data/SolvedId.hs view
@@ -0,0 +1,28 @@+module Hix.Managed.Cabal.Data.SolvedId where++import Distribution.Pretty (Pretty (..))+import Text.PrettyPrint (brackets, (<+>))++import Hix.Data.Overrides (IsRevision (..))+import Hix.Data.PackageId (PackageId)++data SolvedId =+ SolvedId {+ package :: PackageId,+ revision :: Maybe IsRevision+ }+ deriving stock (Eq, Show)++instance Pretty SolvedId where+ pretty SolvedId {..} =+ pretty package <+> foldMap renderRevision revision+ where+ renderRevision = \case+ IsRevision -> brackets "rev"+ IsNotRevision -> ""++revisedId :: PackageId -> SolvedId+revisedId package = SolvedId {package, revision = Just IsRevision}++unrevisedId :: PackageId -> SolvedId+unrevisedId package = SolvedId {package, revision = Nothing}
lib/Hix/Managed/Cabal/Data/SolverState.hs view
@@ -17,6 +17,7 @@ import Hix.Managed.Data.Constraints (EnvConstraints) import qualified Hix.Managed.Data.EnvContext import Hix.Managed.Data.EnvContext (EnvDeps)+import Hix.Managed.Data.Initial (Initial (..)) import Hix.Managed.Data.Mutable (MutableDep, depName) data SolverFlags =@@ -64,9 +65,9 @@ EnvDeps -> EnvConstraints -> SolverFlags ->- SolverState+ Initial SolverState solverState user deps modeConstraints flags =- UnsafeSolverState constraints flags+ Initial (UnsafeSolverState constraints flags) where constraints = modeConstraints <>
lib/Hix/Managed/Data/Initial.hs view
@@ -12,3 +12,6 @@ instance Pretty a => Pretty (Initial a) where pretty (Initial a) = pretty a++initial :: Initial a -> a+initial = coerce
lib/Hix/Managed/Data/Mutation.hs view
@@ -35,12 +35,12 @@ } deriving stock (Generic) -data MutationResult s =+data MutationResult = MutationSuccess { candidate :: MutableId, changed :: Bool, state :: MutationState,- ext :: s+ solverState :: SolverState } | MutationKeep
lib/Hix/Managed/Data/StageState.hs view
@@ -5,7 +5,7 @@ import Hix.Data.Error (Error) import Hix.Data.PackageId (PackageId)-import Hix.Managed.Data.Initial (Initial (Initial))+import Hix.Managed.Data.Initial (Initial (..)) import Hix.Managed.Data.Mutable (MutableDep) import qualified Hix.Managed.Data.MutableId import Hix.Managed.Data.MutableId (MutableId (MutableId))@@ -99,6 +99,6 @@ } deriving stock (Eq, Show) -initStageState :: Initial MutationState -> s -> StageState a s-initStageState (Initial state) ext =- StageState {success = [], failed = [], iterations = 0, ..}+initStageState :: Initial MutationState -> Initial s -> StageState a s+initStageState (Initial state) (Initial ext) =+ StageState {success = [], failed = [], iterations = 0, state, ..}
lib/Hix/Managed/Handlers/Build.hs view
@@ -4,16 +4,16 @@ import Hix.Data.Monad (M) import Hix.Data.Overrides (Overrides)-import Hix.Data.PackageId (PackageId) import Hix.Data.PackageName (LocalPackage) import Hix.Data.Version (Versions) import Hix.Managed.Cabal.Changes (SolverPlan) import Hix.Managed.Cabal.Data.Config (GhcDb (..)) import Hix.Managed.Cabal.Data.InstalledOverrides (InstalledOverrides)+import Hix.Managed.Cabal.Data.SolvedId (SolvedId) import Hix.Managed.Data.Constraints (EnvConstraints) import Hix.Managed.Data.EnvContext (EnvContext (..)) import Hix.Managed.Data.EnvState (EnvState)-import Hix.Managed.Data.Initial (Initial (..))+import Hix.Managed.Data.Initial (Initial, initial) import Hix.Managed.Data.ManagedPackage (ProjectPackages) import Hix.Managed.Data.StageState (BuildFailure (UnknownFailure), BuildResult (BuildFailure)) import qualified Hix.Managed.Handlers.AvailableVersions as AvailableVersions@@ -41,7 +41,7 @@ EnvBuilder { state :: EnvState, cabal :: CabalHandlers,- buildTargets :: Bool -> Versions -> [PackageId] -> M (BuildResult, Overrides)+ buildTargets :: Bool -> Versions -> [SolvedId] -> M (BuildResult, Overrides) } data Builder =@@ -61,23 +61,23 @@ } testBuilder ::- (Bool -> Versions -> [PackageId] -> M (BuildResult, Overrides)) ->+ (Bool -> Versions -> [SolvedId] -> M (BuildResult, Overrides)) -> (Builder -> M a) -> M a testBuilder buildTargets use = use Builder {- withEnvBuilder = \ EnvBuilderContext {initCabal, env = EnvContext {ghc}, initialState = Initial state} useE -> do+ withEnvBuilder = \ EnvBuilderContext {initCabal, env = EnvContext {ghc}, initialState} useE -> do ghcDb <- noteClient "Test builder needs an explicit GHC DB" ghc (cabal, _) <- initCabal.run mempty ghcDb- useE EnvBuilder {..} (Initial state)+ useE EnvBuilder {state = initial initialState, ..} initialState } -versionsBuilder :: SourceHashHandlers -> (Versions -> M BuildResult) -> (Builder -> M a) -> M a+versionsBuilder :: SourceHashHandlers -> (Versions -> M (BuildResult, Overrides)) -> (Builder -> M a) -> M a versionsBuilder hackage build = testBuilder \ _ versions overrideVersions -> do overrides <- packageOverrides hackage mempty overrideVersions- status <- build versions- pure (status, overrides)+ (status, revisions) <- build versions+ pure (status, revisions <> overrides) handlersNull :: BuildHandlers handlersNull =
lib/Hix/Managed/Handlers/Build/Prod.hs view
@@ -16,11 +16,12 @@ import Hix.Managed.Build.SolverPackages (solverGhc) import Hix.Managed.Build.Target (BuilderResources (..), EnvBuilderResources (..), buildTargets) import qualified Hix.Managed.Cabal.Data.Config as CabalConfig-import Hix.Managed.Cabal.Data.Config (CabalConfig (..), HackagePurpose (ForVersions), allHackages)+import Hix.Managed.Cabal.Data.Config (CabalConfig (..), GhcDb, HackagePurpose (ForVersions), allHackages) import Hix.Managed.Cabal.Data.InstalledOverrides (InstalledOverrides (..)) import Hix.Managed.Data.BuildConfig (BuildConfig) import Hix.Managed.Data.EnvContext (EnvContext (..)) import Hix.Managed.Data.EnvState (EnvState (..))+import qualified Hix.Managed.Data.Initial as Initial import Hix.Managed.Data.Initial (Initial (..)) import Hix.Managed.Data.ManagedPackage (ProjectPackages) import Hix.Managed.Handlers.AvailableVersions (AvailableVersionsHandlers)@@ -53,8 +54,8 @@ use tmpRoot \ (err :: IOError) -> throwM (Fatal (show err)) -storeSolverOverrides :: Overrides -> Initial EnvState -> EnvState-storeSolverOverrides new (Initial EnvState {..}) =+storeSolverOverrides :: Overrides -> EnvState -> EnvState+storeSolverOverrides new EnvState {..} = EnvState {solver = new, ..} -- | Determine the set of package IDs that should not be treated as installed in the solver package set when Cabal@@ -84,18 +85,28 @@ Jailbreak -> Nothing Local -> Nothing +withSolverOverrides ::+ GhcDb ->+ EnvState ->+ BuilderResources ->+ EnvBuilderContext ->+ (EnvBuilder -> Initial EnvState -> M a) ->+ M a+withSolverOverrides ghc state global EnvBuilderContext {initCabal, env = EnvContext {env, targets}} use = do+ (cabal, localUnavailable) <- initCabal.run (installedOverrides state) ghc+ use EnvBuilder {buildTargets = buildTargets EnvBuilderResources {..}, ..} (Initial state)+ withEnvBuilder :: ∀ a . BuilderResources -> EnvBuilderContext -> (EnvBuilder -> Initial EnvState -> M a) -> M a-withEnvBuilder global EnvBuilderContext {initCabal, env = EnvContext {env, targets, ghc}, initialState} use = do- (resolvedGhc, solverOverrides) <- solverGhc global env ((.solver) <$> initialState) ghc- let state = maybe (.value) storeSolverOverrides solverOverrides initialState- (cabal, localUnavailable) <- initCabal.run (installedOverrides state) resolvedGhc+withEnvBuilder global context@EnvBuilderContext {env = EnvContext {env, ghc}, initialState} use = do writeInitialEnvState global.stateFile global.root env initialState- use EnvBuilder {buildTargets = buildTargets EnvBuilderResources {..}, ..} (Initial state)+ (resolvedGhc, solverOverrides) <- solverGhc global env ((.solver) <$> initialState) ghc+ let state = maybe id storeSolverOverrides solverOverrides (Initial.initial initialState)+ withSolverOverrides resolvedGhc state global context use withBuilder :: SourceHashHandlers ->
lib/Hix/Managed/Handlers/Build/Test.hs view
@@ -5,6 +5,7 @@ import Hix.Data.Monad (M) import Hix.Data.NixExpr (Expr)+import Hix.Data.Overrides (Overrides) import qualified Hix.Data.PackageId import Hix.Data.PackageId (PackageId) import Hix.Data.PackageName (PackageName)@@ -28,7 +29,7 @@ handlersUnitTest :: MonadIO m => GhcPackages ->- (Versions -> M BuildResult) ->+ (Versions -> M (BuildResult, Overrides)) -> m (BuildHandlers, IORef [Expr], IORef [FailedMutation]) handlersUnitTest ghcPackages builder = do (stateFile, stateFileRef) <- StateFile.handlersUnitTest
lib/Hix/Managed/Handlers/Mutation.hs view
@@ -1,14 +1,16 @@ module Hix.Managed.Handlers.Mutation where import Hix.Data.Monad (M)+import Hix.Managed.Cabal.Data.SolverState (SolverState)+import Hix.Managed.Data.Initial (Initial) import Hix.Managed.Data.Mutation (BuildMutation, DepMutation, MutationResult) import Hix.Managed.Data.MutationState (MutationState) -data MutationHandlers a s =+data MutationHandlers a = MutationHandlers { process ::- s ->+ Initial SolverState -> DepMutation a -> (BuildMutation -> M (Maybe MutationState)) ->- M (MutationResult s)+ M MutationResult }
lib/Hix/Managed/Handlers/Mutation/Bump.hs view
@@ -12,6 +12,7 @@ import Hix.Managed.Data.Bump (Bump (Bump)) import qualified Hix.Managed.Data.Constraints import Hix.Managed.Data.Constraints (MutationConstraints (MutationConstraints))+import Hix.Managed.Data.Initial (Initial, initial) import Hix.Managed.Data.MutableId (MutableId) import qualified Hix.Managed.Data.Mutation import Hix.Managed.Data.Mutation (@@ -33,18 +34,18 @@ -- TODO Avoid building unchanged candidates after the first build of the same set of deps. processMutationBump ::- SolverState ->+ Initial SolverState -> DepMutation Bump -> (BuildMutation -> M (Maybe MutationState)) ->- M (MutationResult SolverState)-processMutationBump solver DepMutation {package, mutation = Bump {version, changed}} build =+ M MutationResult+processMutationBump solverState DepMutation {package, mutation = Bump {version, changed}} build = builder version <&> \case- Just (candidate, ext, state) ->- MutationSuccess {candidate, changed, state, ext}+ Just (candidate, solverResult, state) ->+ MutationSuccess {candidate, changed, state, solverState = solverResult} Nothing -> MutationFailed where- builder = buildCandidate build updateBound updateConstraintsBump solver package+ builder = buildCandidate build updateBound updateConstraintsBump (initial solverState) package -handlersBump :: MutationHandlers Bump SolverState+handlersBump :: MutationHandlers Bump handlersBump = MutationHandlers {process = processMutationBump}
lib/Hix/Managed/Handlers/Mutation/Lower.hs view
@@ -16,6 +16,7 @@ import qualified Hix.Managed.Data.BuildConfig import Hix.Managed.Data.BuildConfig (BuildConfig) import Hix.Managed.Data.Constraints (MutationConstraints)+import Hix.Managed.Data.Initial (Initial, initial) import qualified Hix.Managed.Data.Lower import Hix.Managed.Data.Lower (Lower (Lower)) import Hix.Managed.Data.MutableId (MutableId)@@ -36,14 +37,14 @@ BuildConfig -> LowerMode -> (Bool -> MutableId -> PackageId -> MutationConstraints -> MutationConstraints) ->- SolverState ->+ Initial SolverState -> DepMutation Lower -> (BuildMutation -> M (Maybe MutationState)) ->- M (MutationResult SolverState)-processMutationLower conf mode update solver DepMutation {package, retract, mutation = Lower {majors}} build = do+ M MutationResult+processMutationLower conf mode update solverInit DepMutation {package, retract, mutation = Lower {majors}} build = do foldM buildMajor (Right 0, Nothing) majors <&> \case- (_, Just (candidate, ext, state)) ->- MutationSuccess {candidate, changed = True, state, ext}+ (_, Just (candidate, solverResult, state)) ->+ MutationSuccess {candidate, changed = True, state, solverState = solverResult} (_, Nothing) -> mode.noSuccess where@@ -72,12 +73,12 @@ Just result -> (Left 0, Just result) Nothing -> (bimap (+ 1) (+ 1) failed, prev) - builder = buildCandidate build withLower (update retract) solver package+ builder = buildCandidate build withLower (update retract) (initial solverInit) package handlersLower :: BuildConfig -> LowerMode -> (Bool -> MutableId -> PackageId -> MutationConstraints -> MutationConstraints) ->- MutationHandlers Lower SolverState+ MutationHandlers Lower handlersLower conf mode updatePackageParams = MutationHandlers {process = processMutationLower conf mode updatePackageParams}
lib/Hix/Managed/Lower/Data/LowerMode.hs view
@@ -1,12 +1,11 @@ module Hix.Managed.Lower.Data.LowerMode where -import Hix.Managed.Cabal.Data.SolverState (SolverState) import Hix.Managed.Data.Mutation (MutationResult (MutationFailed, MutationKeep)) data LowerMode = LowerMode { firstSuccess :: Bool,- noSuccess :: MutationResult SolverState+ noSuccess :: MutationResult } deriving stock (Eq, Show, Generic)
lib/Hix/Managed/Lower/Stabilize.hs view
@@ -16,7 +16,7 @@ import qualified Hix.Managed.Data.Constraints import Hix.Managed.Data.Constraints (MutationConstraints (MutationConstraints)) import qualified Hix.Managed.Data.EnvContext-import Hix.Managed.Data.Initial (Initial (Initial))+import Hix.Managed.Data.Initial (Initial (..)) import Hix.Managed.Data.Mutable (MutableDep, depName) import qualified Hix.Managed.Data.MutableId import Hix.Managed.Data.MutableId (MutableId)@@ -98,7 +98,7 @@ BuildConfig -> Flow () stabilizeStage handlers conf =- runStage_ "stabilize" (lowerStabilize handlers conf)+ runStage_ "stabilize" (lowerStabilize handlers conf) stabilizeIfPossible :: BuildHandlers ->@@ -111,8 +111,8 @@ validateCurrent :: Flow BuildStatus validateCurrent =- execStatelessStage "stabilize-current" \- StageContext {env, state = Initial MutationState {versions, overrides}, builder} ->+ execStatelessStage "stabilize-current"+ \ StageContext {env, state = Initial MutationState {versions, overrides}, builder} -> buildVersions builder env "current lower bounds" versions (Just overrides) <&> \case Success -> StageNoAction (Just "Env builds successfully with the current bounds.") Failure -> StageFailure (FailedPrecondition ["Env does not build successfully with the current bounds."])
lib/Hix/Managed/Overrides.hs view
@@ -9,6 +9,7 @@ import qualified Hix.Managed.Handlers.SourceHash import Hix.Managed.Handlers.SourceHash (SourceHashHandlers) import Hix.Monad (fatalError)+import Hix.Managed.Cabal.Data.SolvedId (SolvedId (..)) -- | Fetch an override's hash from the given sources, which is the set of configured Hackages in production. -- If the package wasn't found anywhere, and it is part of the local build, assume that it hasn't been published yet and@@ -44,9 +45,9 @@ packageOverrides :: SourceHashHandlers -> Set LocalPackage ->- [PackageId] ->+ [SolvedId] -> M Overrides packageOverrides handlers localUnavailable versions =- nForAssoc versions \ package -> do- o <- packageOverrideRegular handlers localUnavailable package+ nForAssoc versions \ SolvedId {..} -> do+ o <- packageOverride revision handlers localUnavailable package pure (package.name, o)
lib/Hix/Managed/StageContext.hs view
@@ -4,7 +4,7 @@ import Hix.Managed.Data.EnvRequest (EnvRequest (..)) import qualified Hix.Managed.Data.EnvState import Hix.Managed.Data.EnvState (EnvState (EnvState))-import Hix.Managed.Data.Initial (Initial (Initial))+import Hix.Managed.Data.Initial (Initial (..)) import qualified Hix.Managed.Data.MutationState import Hix.Managed.Data.MutationState (MutationState (MutationState)) import Hix.Managed.Data.Query (Query (Query))
lib/Hix/Managed/StageState.hs view
@@ -2,22 +2,23 @@ import qualified Data.Map.Strict as Map +import Hix.Managed.Cabal.Data.SolverState (SolverState) import qualified Hix.Managed.Data.MutableId import qualified Hix.Managed.Data.Mutation import Hix.Managed.Data.Mutation (DepMutation, MutationResult (..)) import Hix.Managed.Data.StageState (BuildSuccess (CandidateBuilt, Unmodified), StageState (..)) updateStageState ::- StageState a s ->+ StageState a SolverState -> DepMutation a ->- MutationResult s ->- StageState a s+ MutationResult ->+ StageState a SolverState updateStageState old mutation = \case MutationSuccess {..} -> old { success = Map.insert candidate.name buildSuccess old.success, state,- ext+ ext = solverState } where buildSuccess | changed = CandidateBuilt candidate
lib/Hix/Monad.hs view
@@ -295,7 +295,7 @@ t M a -> t M a appContextT =- appContextAtT LogVerbose LogInfo+ appContextAtT LogVerbose LogError appContextAt :: LogLevel -> LogLevel -> Text -> M a -> M a appContextAt logLevel level description ma =@@ -303,7 +303,7 @@ appContextAtT logLevel level description (IdentityT ma) appContext :: Text -> M a -> M a-appContext = appContextAt LogVerbose LogInfo+appContext = appContextAt LogVerbose LogError appContextVerbose :: Text -> M a -> M a appContextVerbose desc ma = do
test/Hix/Test/Managed/Bump/MutationTest.hs view
@@ -1,18 +1,18 @@ module Hix.Test.Managed.Bump.MutationTest where import qualified Data.Text as Text-import Distribution.Types.PackageDescription (customFieldsPD, emptyPackageDescription) import Exon (exon) import Test.Tasty (TestTree, testGroup) import Hix.Class.Map ((!!)) import Hix.Data.Error (ErrorMessage (Fatal)) import Hix.Data.Options (ProjectOptions (..))-import Hix.Data.Version (Versions)+import Hix.Data.Overrides (IsRevision (..), Override (..), Overrides)+import Hix.Data.Version (SourceHash (..), Versions) import Hix.Managed.Bump.Optimize (bumpOptimizeMain) import qualified Hix.Managed.Cabal.Data.Packages import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages), InstalledPackages)-import Hix.Managed.Cabal.Data.SourcePackage (SourcePackageId (description), SourcePackages)+import Hix.Managed.Cabal.Data.SourcePackage (SourcePackages) import Hix.Managed.Data.ManagedPackage (ProjectPackages, managedPackages) import qualified Hix.Managed.Data.ProjectStateProto import Hix.Managed.Data.ProjectStateProto (ProjectStateProto (ProjectStateProto))@@ -22,7 +22,7 @@ import Hix.Pretty (showP) import Hix.Test.Hedgehog (eqLines, listEqTail) import qualified Hix.Test.Managed.Run-import Hix.Test.Managed.Run (Result (Result), TestParams (..), bumpTest, nosortOptions, testParams)+import Hix.Test.Managed.Run (Result (Result), TestParams (..), bumpTest, nosortOptions, testParams, withoutRevisions) import Hix.Test.Utils (UnitTest, unitTest) packages :: ProjectPackages@@ -37,6 +37,7 @@ "direct5", "direct6", "direct7",+ "direct8", "local1", "local2 <0.9", "local3 <0.9",@@ -60,6 +61,7 @@ ("direct5-1.0.1", []), ("direct6-1.0.1", []), ("direct7-1.0.1", ["transitive1-1.0.1"]),+ ("direct8-1.0.1", []), ("transitive1-1.0.1", ["direct6-1.0.1"]) ] @@ -103,10 +105,11 @@ ("direct7", [ ([1, 0, 1], ["transitive1 <1.1"]) ]),+ ("direct8", [+ ([1, 0, 1], [])+ ]), ("transitive1", [- ([1, 0, 1], ["direct6 <1.2"] {- description = Just (emptyPackageDescription {customFieldsPD = [("x-revision", "2")]})- })+ ([1, 0, 1], ["direct6 <1.2"]) ]), ("local2", [ ([0, 8, 0], []),@@ -126,14 +129,14 @@ ghcPackages :: GhcPackages ghcPackages = GhcPackages {installed, available} -build :: Versions -> M BuildStatus+build :: Versions -> M (BuildStatus, Overrides) build = \case versions | Just [0, 9, 0] <- versions !! "local2"- -> pure Failure+ -> failure versions | Just [0, 9, 0] <- versions !! "local3"- -> pure Failure+ -> failure [ ("base", [4, 12, 0, 0]), ("direct1", [1, 2, 1]),@@ -143,12 +146,20 @@ ("direct5", [1, 1, 1]), ("direct6", [1, 0, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 8, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Success+ ] -> pure (Success, [+ ("direct8", Override {+ version = [1, 0, 1],+ hash = SourceHash "direct8-1.0.1",+ repo = Nothing,+ revision = Just IsRevision+ })+ ]) [ ("base", [4, 12, 0, 0]),@@ -159,12 +170,13 @@ ("direct5", [1, 1, 1]), ("direct6", [1, 0, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 8, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Failure+ ] -> failure [ ("base", [4, 12, 0, 0]),@@ -175,12 +187,13 @@ ("direct5", [1, 1, 1]), ("direct6", [1, 0, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 8, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Success+ ] -> success [ ("base", [4, 12, 0, 0]),@@ -191,12 +204,13 @@ ("direct5", [1, 2, 1]), ("direct6", [1, 0, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 8, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Success+ ] -> success [ ("base", [4, 12, 0, 0]),@@ -207,12 +221,13 @@ ("direct5", [1, 2, 1]), ("direct6", [1, 1, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 8, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Success+ ] -> success [ ("base", [4, 12, 0, 0]),@@ -223,12 +238,13 @@ ("direct5", [1, 2, 1]), ("direct6", [1, 1, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 8, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Success+ ] -> success [ ("base", [4, 12, 0, 0]),@@ -239,12 +255,13 @@ ("direct5", [1, 2, 1]), ("direct6", [1, 1, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 10, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Success+ ] -> success -- -- second iteration [@@ -256,15 +273,20 @@ ("direct5", [1, 2, 1]), ("direct6", [1, 1, 1]), ("direct7", [1, 0, 1]),+ ("direct8", [1, 0, 1]), ("local2", [0, 8, 0]), ("local3", [0, 8, 0]), ("local4", [0, 10, 0]), ("local5", [1, 0]), ("transitive1", [1, 0, 1])- ] -> pure Failure+ ] -> failure versions -> throwM (Fatal [exon|Unexpected build plan: #{showP versions}|])+ where+ success = pure (Success, mempty) + failure = pure (Failure, mempty)+ state :: ProjectStateProto state = ProjectStateProto {@@ -322,6 +344,10 @@ lower = null; upper = "1.1"; };+ direct8 = {+ lower = null;+ upper = "1.1";+ }; local1 = { lower = null; upper = null;@@ -358,6 +384,7 @@ direct5 = "1.2.1"; direct6 = "1.1.1"; direct7 = "1.0.1";+ direct8 = "1.0.1"; local2 = "0.8.0"; local3 = "0.8.0"; local4 = "0.10.0";@@ -395,6 +422,11 @@ version = "1.0.1"; hash = "direct7-1.0.1"; };+ direct8 = {+ version = "1.0.1";+ hash = "direct8-1.0.1";+ revision = true;+ }; local2 = { version = "0.8.0"; hash = "local2-0.8.0";@@ -440,6 +472,7 @@ 📦 [34mdirect5[0m 1.2.1 ↕ [no bounds] -> <[32m1.3[0m 📦 [34mdirect6[0m 1.1.1 ↕ <[31m1.1[0m -> <[32m1.2[0m 📦 [34mdirect7[0m 1.0.1 ↕ [no bounds] -> <[32m1.1[0m+ 📦 [34mdirect8[0m 1.0.1 ↕ [no bounds] -> <[32m1.1[0m 📦 [34mlocal2[0m 0.8.0 ↕ <0.9 📦 [34mlocal3[0m 0.8.0 ↕ <0.9 📦 [34mlocal4[0m 0.10.0 ↕ <[31m0.9[0m -> <[32m0.11[0m@@ -480,6 +513,21 @@ -- It has a dependency on @direct4@ with an upper bound of <1.2, which would prevent it from being selected by the -- solver if we didn't use @AllowNewer@. --+-- - @direct6@ is a direct dependency of the project, and a direct dependency of @transitive1@.+-- @transitive1@ is a direct dependency of @direct7@, and therefore @direct6@ is a transitive dependency of both+-- @direct7@ and the project.+-- While @direct7@ and @transitive1@ both have their latest versions installed, the installed version of @transitive1@+-- has a dependency on @direct6-1.0.1@ (since installed versions don't have range deps, and need the precise package+-- ID of dependencies with which they were installed).+-- When @direct6@ is then bumped regularly to the latest version, both @transitive1@ and @direct7@ are overridden as+-- well by the solver.+--+-- - The installed version of @direct8@ is simulated to have incompatible bounds, which is indicated by the fact that+-- 'build' returns a revision override for it in the first build.+-- In later builds, the solver configures an override for @direct8@ initially, since revisions are persisted across+-- mutations in @SolverState@.+-- In the final state file, the override for @direct8@ includes the flag @revision = true@.+-- -- - @local2@ is in a different env, so it will be treated as a mutable dependency despite being a local package. -- It also has no installed version, since it wasn't available on Hackage (yet) at the time of the nixpkgs snapshot -- and therefore isn't present in nix;@@ -598,7 +646,7 @@ params = (testParams False packages_upToDate) { ghcPackages = ghcPackages_upToDate, state = state_upToDate,- build = build_upToDate+ build = withoutRevisions build_upToDate } test_bumpMutation :: TestTree
test/Hix/Test/Managed/LowerAuto/MutationOptimizeTest.hs view
@@ -5,6 +5,7 @@ import Hix.Class.Map (nGen, (!!)) import Hix.Data.Error (ErrorMessage (Fatal))+import Hix.Data.Overrides (Overrides) import Hix.Data.Version (Versions) import qualified Hix.Managed.Cabal.Data.Packages import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages), InstalledPackages)@@ -19,7 +20,7 @@ import Hix.NixExpr (renderRootExpr) import Hix.Pretty (showP) import Hix.Test.Hedgehog (eqLines)-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions) import Hix.Test.Utils (UnitTest, unitTest) packages :: ProjectPackages@@ -94,8 +95,8 @@ ghcPackages :: GhcPackages ghcPackages = GhcPackages {installed, available} -buildVersionsBasic :: Versions -> M BuildStatus-buildVersionsBasic = \case+buildVersionsBasic :: Versions -> M (BuildStatus, Overrides)+buildVersionsBasic = withoutRevisions \case versions | Just v <- versions !! "direct2" , v <= [1, 0]@@ -337,7 +338,7 @@ (testParams False packages) { ghcPackages, state = initialState,- build = buildVersionsReset+ build = withoutRevisions buildVersionsReset } test_lowerAutoMutationOptimize :: TestTree
test/Hix/Test/Managed/LowerAuto/MutationStabilizeTest.hs view
@@ -4,6 +4,7 @@ import Hix.Class.Map (nGen, (!!)) import Hix.Data.Error (ErrorMessage (Fatal))+import Hix.Data.Overrides (Overrides) import Hix.Data.Version (Versions) import qualified Hix.Managed.Cabal.Data.Packages import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages), InstalledPackages)@@ -18,7 +19,7 @@ import Hix.NixExpr (renderRootExpr) import Hix.Pretty (showP) import Hix.Test.Hedgehog (eqLines)-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions) import Hix.Test.Utils (UnitTest) packages :: ProjectPackages@@ -96,8 +97,8 @@ fromString [exon|direct#{show num}-1.0|] ) -build :: Versions -> M BuildStatus-build = \case+build :: Versions -> M (BuildStatus, Overrides)+build = withoutRevisions \case versions | Just v <- versions !! "direct2" , v <= [1, 0]
test/Hix/Test/Managed/LowerInit/MutationTest.hs view
@@ -6,6 +6,7 @@ import Hix.Class.Map ((!!)) import Hix.Data.Error (ErrorMessage (Fatal)) import Hix.Data.Options (ProjectOptions (..))+import Hix.Data.Overrides (Overrides) import Hix.Data.Version (Versions) import qualified Hix.Managed.Cabal.Changes import Hix.Managed.Cabal.Changes (SolverPlan (SolverPlan))@@ -23,7 +24,7 @@ import Hix.NixExpr (renderRootExpr) import Hix.Pretty (showP) import Hix.Test.Hedgehog (eqLines, listEqTail, listEqZip)-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, nosortOptions, testParams)+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, nosortOptions, testParams, withoutRevisions) import Hix.Test.Utils (UnitTest) packages :: ProjectPackages@@ -119,8 +120,8 @@ resolving = False } -build :: Versions -> M BuildStatus-build = \case+build :: Versions -> M (BuildStatus, Overrides)+build = withoutRevisions \case versions | Just [1, 0, n] <- versions !! "direct1" , n /= 5
test/Hix/Test/Managed/LowerOptimize/CandidatesTest.hs view
@@ -10,6 +10,7 @@ import qualified Hix.Managed.Cabal.Data.SolverState import Hix.Managed.Cabal.Data.SolverState (SolverState (SolverState), solverState, updateSolverState) import Hix.Managed.Data.Constraints (MutationConstraints (MutationConstraints, mutation))+import Hix.Managed.Data.Initial (initial) import Hix.Managed.Data.Mutable (MutableDep) import qualified Hix.Managed.Data.MutableId import Hix.Managed.Data.MutableId (MutableId (MutableId))@@ -79,10 +80,12 @@ for majors \ mut -> processMutationLower def lowerOptimizeMode lowerOptimizeUpdate initialState mut (build buildRef) mutationResults <- evalEither result- Just (MutationSuccess candidate True mstate (updateSolverState (const newConstraints) initialState)) === mutationResults+ Just target === mutationResults triedVersions <- liftIO (readIORef buildRef) (Just <$> targets) === triedVersions where+ target = MutationSuccess candidate True mstate (updateSolverState (const newConstraints) (initial initialState))+ dep = simpleQueryDep mutable [[2, 4]] mstate =
test/Hix/Test/Managed/LowerOptimize/MutationTest.hs view
@@ -3,6 +3,7 @@ import Exon (exon) import Hix.Data.Error (ErrorMessage (Fatal))+import Hix.Data.Overrides (Overrides) import Hix.Data.Version (Versions) import qualified Hix.Managed.Cabal.Data.Packages import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages))@@ -17,7 +18,7 @@ import Hix.NixExpr (renderRootExpr) import Hix.Pretty (showP) import Hix.Test.Hedgehog (eqLines)-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions) import Hix.Test.Utils (UnitTest) packages :: ProjectPackages@@ -78,8 +79,8 @@ resolving = False } -build :: Versions -> M BuildStatus-build = \case+build :: Versions -> M (BuildStatus, Overrides)+build = withoutRevisions \case [("direct1", [1, 9, 1]), ("direct2", [2, 0, 1]), ("transitive1", [1, 0, 1])] -> pure Success [("direct1", [1, 8, 1]), ("direct2", [2, 0, 1]), ("transitive1", [1, 0, 1])] -> pure Success [("direct1", [1, 8, 1]), ("direct2", [1, 9, 1]), ("transitive1", [1, 0, 1])] -> pure Failure
test/Hix/Test/Managed/LowerOptimize/OrderTest.hs view
@@ -1,6 +1,7 @@ module Hix.Test.Managed.LowerOptimize.OrderTest where import Hix.Data.Monad (M)+import Hix.Data.Overrides (Overrides) import Hix.Data.Version (Versions) import Hix.Managed.Cabal.Changes (SolverPlan (..)) import qualified Hix.Managed.Cabal.Data.Packages@@ -73,8 +74,8 @@ resolving = False } -build :: Versions -> M BuildStatus-build _ = pure Success+build :: Versions -> M (BuildStatus, Overrides)+build _ = pure (Success, mempty) cabalTarget :: [(EnvConstraints, Maybe SolverPlan)] cabalTarget =
test/Hix/Test/Managed/LowerStabilize/MutationTest.hs view
@@ -3,6 +3,7 @@ import Exon (exon) import Hix.Data.Error (ErrorMessage (Fatal))+import Hix.Data.Overrides (Overrides) import Hix.Data.Version (Versions) import qualified Hix.Managed.Cabal.Data.Packages import Hix.Managed.Cabal.Data.Packages (GhcPackages (GhcPackages))@@ -16,7 +17,7 @@ import Hix.NixExpr (renderRootExpr) import Hix.Pretty (showP) import Hix.Test.Hedgehog (eqLines)-import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams)+import Hix.Test.Managed.Run (Result (..), TestParams (..), lowerTest, testParams, withoutRevisions) import Hix.Test.Utils (UnitTest) available :: SourcePackages@@ -72,8 +73,8 @@ resolving = False } -build :: Versions -> M BuildStatus-build = \case+build :: Versions -> M (BuildStatus, Overrides)+build = withoutRevisions \case [("direct1", [2, 0, 1]), ("direct2", [2, 0, 1])] -> pure Success [("direct1", [1, 8, 1]), ("direct2", [1, 8, 1])] -> pure Failure [("direct1", [1, 8, 1]), ("direct2", [2, 0, 1])] -> pure Failure
testing/Hix/Test/Managed/Run.hs view
@@ -9,6 +9,7 @@ import Hix.Data.NixExpr (Expr) import qualified Hix.Data.Options as ProjectOptions import Hix.Data.Options (ProjectOptions)+import Hix.Data.Overrides (Overrides) import Hix.Data.PackageName (LocalPackage) import Hix.Data.Version (Versions) import Hix.Managed.Cabal.Changes (SolverPlan)@@ -45,7 +46,7 @@ ghcPackages :: GhcPackages, state :: ProjectStateProto, projectOptions :: ProjectOptions,- build :: Versions -> M BuildStatus+ build :: Versions -> M (BuildStatus, Overrides) } nosortOptions :: ProjectOptions@@ -65,9 +66,17 @@ ghcPackages = GhcPackages {installed = [], available = []}, state = def, projectOptions = nosortOptions,- build = const (pure Failure)+ build = const (pure (Failure, mempty)) } +withoutRevisions ::+ (Versions -> M BuildStatus) ->+ Versions ->+ M (BuildStatus, Overrides)+withoutRevisions build versions = do+ status <- build versions+ pure (status, mempty)+ data Result a = Result { stateFile :: Expr,@@ -100,7 +109,7 @@ managedTest' defaultEnvName params main = withFrozenCallStack do (handlers0, stateFileRef, _) <-- BuildHandlers.handlersUnitTest params.ghcPackages (fmap resultFromStatus . params.build)+ BuildHandlers.handlersUnitTest params.ghcPackages (fmap (first resultFromStatus) . params.build) (cabalRef, handlers1) <- if params.cabalLog then first Just <$> BuildHandlers.logCabal handlers0