From c000727aeb50cdcb2f56a5f2be32db1c052aaa56 Mon Sep 17 00:00:00 2001 From: Oleg Grenrus <oleg.grenrus@iki.fi> Date: Sat, 9 Jan 2021 21:26:54 +0200 Subject: [PATCH] Recognise but warn about other-extensions When cabal-version is old. Fixes https://github.com/haskell/cabal/issues/7234 --- Cabal/Distribution/FieldGrammar/Class.hs | 13 +++++++++++++ Cabal/Distribution/FieldGrammar/Parsec.hs | 14 ++++++++++++++ .../PackageDescription/FieldGrammar.hs | 2 +- .../PackageTests/Regression/T7234/Fail/M.hs | 1 + .../PackageTests/Regression/T7234/Fail/cabal.out | 7 +++++++ .../Regression/T7234/Fail/cabal.project | 1 + .../Regression/T7234/Fail/cabal.test.hs | 5 +++++ .../Regression/T7234/Fail/issue7234.cabal | 14 ++++++++++++++ .../PackageTests/Regression/T7234/Success/M.hs | 1 + .../Regression/T7234/Success/cabal.out | 9 +++++++++ .../Regression/T7234/Success/cabal.project | 1 + .../Regression/T7234/Success/cabal.test.hs | 4 ++++ .../Regression/T7234/Success/issue7234.cabal | 15 +++++++++++++++ 13 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal diff --git a/Cabal/Distribution/FieldGrammar/Class.hs b/Cabal/Distribution/FieldGrammar/Class.hs index e6965125d3..ea78db4910 100644 --- a/Cabal/Distribution/FieldGrammar/Class.hs +++ b/Cabal/Distribution/FieldGrammar/Class.hs @@ -146,6 +146,19 @@ class -> g s a -> g s a + -- | Annotate field with since spec-version. + -- This is used to recognise, but warn about the field. + -- It is used to process @other-extensions@ field. + -- + -- Default implementation is to not warn. + -- + -- @since 3.4.0.0 + availableSinceWarn + :: CabalSpecVersion -- ^ spec version + -> g s a + -> g s a + availableSinceWarn _ = id + -- | Field which can be defined at most once. uniqueField :: (FieldGrammar c g, c (Identity a)) diff --git a/Cabal/Distribution/FieldGrammar/Parsec.hs b/Cabal/Distribution/FieldGrammar/Parsec.hs index d0a64eb7f5..085378f0c6 100644 --- a/Cabal/Distribution/FieldGrammar/Parsec.hs +++ b/Cabal/Distribution/FieldGrammar/Parsec.hs @@ -287,6 +287,20 @@ instance FieldGrammar Parsec ParsecFieldGrammar where pure def + availableSinceWarn vs (ParsecFG names prefixes parser) = ParsecFG names prefixes parser' + where + parser' v values + | v >= vs = parser v values + | otherwise = do + let unknownFields = Map.intersection values $ Map.fromSet (const ()) names + for_ (Map.toList unknownFields) $ \(name, fields) -> + for_ fields $ \(MkNamelessField pos _) -> + parseWarning pos PWTUnknownField $ + "The field " <> show name <> " is available only since the Cabal specification version " ++ showCabalSpecVersion vs ++ "." + + parser v values + + -- todo we know about this field deprecatedSince vs msg (ParsecFG names prefixes parser) = ParsecFG names prefixes parser' where diff --git a/Cabal/Distribution/PackageDescription/FieldGrammar.hs b/Cabal/Distribution/PackageDescription/FieldGrammar.hs index 65985bca40..c2efd6d2b7 100644 --- a/Cabal/Distribution/PackageDescription/FieldGrammar.hs +++ b/Cabal/Distribution/PackageDescription/FieldGrammar.hs @@ -538,7 +538,7 @@ buildInfoFieldGrammar = BuildInfo <*> monoidalFieldAla "default-extensions" (alaList' FSep MQuoted) L.defaultExtensions ^^^ availableSince CabalSpecV1_10 [] <*> monoidalFieldAla "other-extensions" formatOtherExtensions L.otherExtensions - ^^^ availableSince CabalSpecV1_10 [] + ^^^ availableSinceWarn CabalSpecV1_10 <*> monoidalFieldAla "extensions" (alaList' FSep MQuoted) L.oldExtensions ^^^ deprecatedSince CabalSpecV1_12 "Please use 'default-extensions' or 'other-extensions' fields." diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs b/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs new file mode 100644 index 0000000000..ef2ad8bb3f --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/M.hs @@ -0,0 +1 @@ +module M where diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out new file mode 100644 index 0000000000..6dfd0a150d --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.out @@ -0,0 +1,7 @@ +# cabal v2-build +Resolving dependencies... +cabal: Could not resolve dependencies: +[__0] next goal: issue7234 (user goal) +[__0] rejecting: issue7234-0 (conflict: requires HopefullyThisExtensionWontOccur) +[__0] fail (backjumping, conflict set: issue7234) +After searching the rest of the dependency tree exhaustively, these were the goals I've had most trouble fulfilling: issue7234 (2) diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project new file mode 100644 index 0000000000..e6fdbadb43 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs new file mode 100644 index 0000000000..6a83874e86 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/cabal.test.hs @@ -0,0 +1,5 @@ +import Test.Cabal.Prelude +main = cabalTest $ + -- this should fail, + -- none of GHC have extension declared in other-extensions + fails $ cabal "v2-build" ["all"] diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal b/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal new file mode 100644 index 0000000000..7f94105dd0 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Fail/issue7234.cabal @@ -0,0 +1,14 @@ +cabal-version: >=1.8 +name: issue7234 +version: 0 +synopsis: Old cabal-version package +description: But we have other-extensions to guide solver +author: Oleg Grenrus +category: Tests +maintainer: oleg.grenrus@iki.fi +build-type: Simple + +library + build-depends: base <5 + other-extensions: HopefullyThisExtensionWontOccur + exposed-modules: M diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs b/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs new file mode 100644 index 0000000000..ef2ad8bb3f --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/M.hs @@ -0,0 +1 @@ +module M where diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out new file mode 100644 index 0000000000..347976aa80 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.out @@ -0,0 +1,9 @@ +# cabal v2-build +Resolving dependencies... +Build profile: -w ghc-<GHCVER> -O1 +In order, the following will be built: + - issue7234-0 (lib) (first run) +Warning: issue7234.cabal:14:3: The field "other-extensions" is available only since the Cabal specification version 1.10. +Configuring library for issue7234-0.. +Preprocessing library for issue7234-0.. +Building library for issue7234-0.. diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project new file mode 100644 index 0000000000..e6fdbadb43 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs new file mode 100644 index 0000000000..caaeb22728 --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/cabal.test.hs @@ -0,0 +1,4 @@ +import Test.Cabal.Prelude +main = cabalTest $ + -- this should not fail, just warn. + cabal "v2-build" ["all"] diff --git a/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal b/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal new file mode 100644 index 0000000000..dad34460df --- /dev/null +++ b/cabal-testsuite/PackageTests/Regression/T7234/Success/issue7234.cabal @@ -0,0 +1,15 @@ +cabal-version: >=1.8 +name: issue7234 +version: 0 +synopsis: Old cabal-version package +description: But we have other-extensions to guide solver +author: Oleg Grenrus +category: Tests +maintainer: oleg.grenrus@iki.fi +build-type: Simple + +library + build-depends: base <5 + -- this extension is in virtually all GHCs, but there should be a warning + other-extensions: GADTs + exposed-modules: M -- GitLab