Skip to content

Commit cdbd736

Browse files
committed
Add drop-packages to stack.yaml commercialhaskell#4567
1 parent cde979b commit cdbd736

9 files changed

Lines changed: 50 additions & 2 deletions

File tree

ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ Behavior changes:
7070

7171
* Remove the deprecated `--upgrade-cabal` flag to `stack setup`.
7272

73+
* Support the `drop-packages` field in `stack.yaml`
74+
7375
Other enhancements:
7476

7577
* Defer loading up of files for local packages. This allows us to get

doc/yaml_configuration.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,29 @@ flags:
229229
If a specified flag is different than the one specified for a snapshot package,
230230
then the snapshot package will automatically be promoted to be an extra-dep.
231231

232+
### drop-packages
233+
234+
Packages which, when present in the snapshot specified in `resolver`,
235+
should not be included in our package. This can be used for a few
236+
different purposes, e.g.:
237+
238+
* Ensure that packages you don't want used in your project cannot be
239+
used in a `package.yaml` file (e.g., for license reasons)
240+
* Prevent overriding of a global package like `Cabal`. For more
241+
information, see
242+
[stackage#4425](https://github.com/commercialhaskell/stackage/issues/4425)
243+
* When using a custom GHC build, avoid incompatible packages (see
244+
[this
245+
comment](https://github.com/commercialhaskell/stack/pull/4655#issuecomment-477954429)).
246+
247+
```yaml
248+
drop-packages:
249+
- Cabal
250+
- buggy-package
251+
- package-with-unacceptable-license
252+
```
253+
254+
Since Stack 2.0
232255

233256
### user-message
234257

src/Stack/Config.hs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,8 +535,10 @@ loadBuildConfig = do
535535
map (second dpLocation) deps0
536536

537537
let packages1 = Map.fromList packages0
538-
snPackages = snapshotPackages snapshot `Map.difference` packages1
538+
snPackages = snapshotPackages snapshot
539+
`Map.difference` packages1
539540
`Map.difference` Map.fromList deps0
541+
`Map.withoutKeys` projectDropPackages project
540542

541543
snDeps <- Map.traverseWithKey (snapToDepPackage (shouldHaddockDeps bopts)) snPackages
542544

@@ -597,6 +599,7 @@ loadBuildConfig = do
597599
, projectCompiler = Nothing
598600
, projectExtraPackageDBs = []
599601
, projectCurator = Nothing
602+
, projectDropPackages = mempty
600603
}
601604

602605
-- | Check if there are any duplicate package names and, if so, throw an

src/Stack/Init.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ initProject currDir initOpts mresolver = do
130130
, projectCompiler = Nothing
131131
, projectExtraPackageDBs = []
132132
, projectCurator = Nothing
133+
, projectDropPackages = mempty
133134
}
134135

135136
makeRel = fmap toFilePath . makeRelativeToCurrentDir

src/Stack/Types/Config.hs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,12 +614,14 @@ data Project = Project
614614
-- ^ Extra configuration intended exclusively for usage by the
615615
-- curator tool. In other words, this is /not/ part of the
616616
-- documented and exposed Stack API. SUBJECT TO CHANGE.
617+
, projectDropPackages :: !(Set PackageName)
618+
-- ^ Packages to drop from the 'projectResolver'.
617619
}
618620
deriving Show
619621

620622
instance ToJSON Project where
621623
-- Expanding the constructor fully to ensure we don't miss any fields.
622-
toJSON (Project userMsg packages extraDeps flags resolver mcompiler extraPackageDBs mcurator) = object $ concat
624+
toJSON (Project userMsg packages extraDeps flags resolver mcompiler extraPackageDBs mcurator drops) = object $ concat
623625
[ maybe [] (\cv -> ["compiler" .= cv]) mcompiler
624626
, maybe [] (\msg -> ["user-message" .= msg]) userMsg
625627
, if null extraPackageDBs then [] else ["extra-package-dbs" .= extraPackageDBs]
@@ -628,6 +630,7 @@ instance ToJSON Project where
628630
, ["packages" .= packages]
629631
, ["resolver" .= resolver]
630632
, maybe [] (\c -> ["curator" .= c]) mcurator
633+
, if Set.null drops then [] else ["drop-packages" .= Set.map CabalString drops]
631634
]
632635

633636
-- | Extra configuration intended exclusively for usage by the
@@ -1444,6 +1447,7 @@ parseProjectAndConfigMonoid rootDir =
14441447
config <- parseConfigMonoidObject rootDir o
14451448
extraPackageDBs <- o ..:? "extra-package-dbs" ..!= []
14461449
mcurator <- jsonSubWarningsT (o ..:? "curator")
1450+
drops <- o ..:? "drop-packages" ..!= mempty
14471451
return $ do
14481452
deps' <- mapM (resolvePaths (Just rootDir)) deps
14491453
resolver' <- resolvePaths (Just rootDir) resolver
@@ -1456,6 +1460,7 @@ parseProjectAndConfigMonoid rootDir =
14561460
, projectDependencies = concatMap toList (deps' :: [NonEmpty RawPackageLocation])
14571461
, projectFlags = flags
14581462
, projectCurator = mcurator
1463+
, projectDropPackages = Set.map unCabalString drops
14591464
}
14601465
pure $ ProjectAndConfigMonoid project config
14611466

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import StackTest
2+
3+
main :: IO ()
4+
main = stackErr ["build"]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.cabal
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
name: unimportant
2+
version: 0
3+
dependencies:
4+
- base
5+
- unliftio-core
6+
library: {}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
resolver: lts-11.22
2+
drop-packages:
3+
- unliftio-core

0 commit comments

Comments
 (0)