From 55aff097b49ff85bb4eff1cc4f42c9fe40df3f49 Mon Sep 17 00:00:00 2001 From: lrworth Date: Sat, 7 Oct 2023 02:30:43 +1100 Subject: [PATCH] Support GHC 9.4 (#2532) * chore: enable CPP in Dhall.DirectoryTree Adding a \ to the escaped newlines appears to make CPP generate valid haskell without getting stuck. * feat: support unix-compat 0.8 In unix-compat 0.7, `getUserEntryForName` threw an exception when called on Windows. unix-compat 0.8 removes it entirely. To increase likelihood of this change being merged, the behaviour of the 0.7 version has been incorporated into Dhall.DirectoryTree. * chore: fix template-haskell bound dhall does not compile with template-haskell >=2.17 due to signature change of Language.Haskell.TH.Syntax.PlainTV. * chore: support template-haskell 2.17 through 2.19 In particular this enables building with GHC 9.4. * chore(dhall): version 1.42.1 * fix: System.Posix.User.getGroupEntryForName does not exist on Windows --- dhall/dhall.cabal | 8 +- dhall/src/Dhall/DirectoryTree.hs | 139 +++++++++++++++++-------------- dhall/src/Dhall/TH.hs | 7 +- 3 files changed, 90 insertions(+), 64 deletions(-) diff --git a/dhall/dhall.cabal b/dhall/dhall.cabal index 3732d1c99..f36fb2682 100644 --- a/dhall/dhall.cabal +++ b/dhall/dhall.cabal @@ -1,6 +1,6 @@ Cabal-Version: 2.4 Name: dhall -Version: 1.42.0 +Version: 1.42.1 Build-Type: Simple License: BSD-3-Clause License-File: LICENSE @@ -251,10 +251,14 @@ Common common th-lift-instances >= 0.1.13 && < 0.2 , time >= 1.9 && < 1.13, transformers >= 0.5.2.0 && < 0.7 , - unix-compat >= 0.4.2 && < 0.7 , + unix-compat >= 0.4.2 && < 0.8 , unordered-containers >= 0.1.3.0 && < 0.3 , vector >= 0.11.0.0 && < 0.14 + if !os(windows) + Build-Depends: + unix >= 2.7 && < 2.9 , + if flag(with-http) CPP-Options: -DWITH_HTTP diff --git a/dhall/src/Dhall/DirectoryTree.hs b/dhall/src/Dhall/DirectoryTree.hs index 405931e9b..fec32bea4 100644 --- a/dhall/src/Dhall/DirectoryTree.hs +++ b/dhall/src/Dhall/DirectoryTree.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} @@ -54,8 +55,12 @@ import qualified Prettyprinter as Pretty import qualified Prettyprinter.Render.String as Pretty import qualified System.Directory as Directory import qualified System.FilePath as FilePath +#ifdef mingw32_HOST_OS +import System.IO.Error (illegalOperationErrorType, mkIOError) +#else +import qualified System.Posix.User as Posix +#endif import qualified System.PosixCompat.Files as Posix -import qualified System.PosixCompat.User as Posix {-| Attempt to transform a Dhall record into a directory tree where: @@ -263,12 +268,24 @@ makeType = Record . Map.fromList <$> sequenceA -- | Resolve a `User` to a numerical id. getUser :: User -> IO UserID getUser (UserId uid) = return uid -getUser (UserName name) = Posix.userID <$> Posix.getUserEntryForName name +getUser (UserName name) = +#ifdef mingw32_HOST_OS + ioError $ mkIOError illegalOperationErrorType x Nothing Nothing + where x = "System.Posix.User.getUserEntryForName: not supported" +#else + Posix.userID <$> Posix.getUserEntryForName name +#endif -- | Resolve a `Group` to a numerical id. getGroup :: Group -> IO GroupID getGroup (GroupId gid) = return gid -getGroup (GroupName name) = Posix.groupID <$> Posix.getGroupEntryForName name +getGroup (GroupName name) = +#ifdef mingw32_HOST_OS + ioError $ mkIOError illegalOperationErrorType x Nothing Nothing + where x = "System.Posix.User.getGroupEntryForName: not supported" +#else + Posix.groupID <$> Posix.getGroupEntryForName name +#endif -- | Process a `FilesystemEntry`. Writes the content to disk and apply the -- metadata to the newly created item. @@ -409,57 +426,57 @@ instance Show FilesystemError where Pretty.renderString (Dhall.Pretty.layout message) where message = - Util._ERROR <> ": Not a valid directory tree expression \n\ - \ \n\ - \Explanation: Only a subset of Dhall expressions can be converted to a directory \n\ - \tree. Specifically, record literals or maps can be converted to directories, \n\ - \❰Text❱ literals can be converted to files, and ❰Optional❱ values are included if \n\ - \❰Some❱ and omitted if ❰None❱. Values of union types can also be converted if \n\ - \they are an alternative which has a non-nullary constructor whose argument is of \n\ - \an otherwise convertible type. Furthermore, there is a more advanced approach to \n\ - \constructing a directory tree utilizing a fixpoint encoding. Consult the upstream \n\ - \documentation of the `toDirectoryTree` function in the Dhall.Directory module for \n\ - \further information on that. \n\ - \No other type of value can be translated to a directory tree. \n\ - \ \n\ - \For example, this is a valid expression that can be translated to a directory \n\ - \tree: \n\ - \ \n\ - \ \n\ - \ ┌──────────────────────────────────┐ \n\ - \ │ { `example.json` = \"[1, true]\" } │ \n\ - \ └──────────────────────────────────┘ \n\ - \ \n\ - \ \n\ - \In contrast, the following expression is not allowed due to containing a \n\ - \❰Natural❱ field, which cannot be translated in this way: \n\ - \ \n\ - \ \n\ - \ ┌───────────────────────┐ \n\ - \ │ { `example.txt` = 1 } │ \n\ - \ └───────────────────────┘ \n\ - \ \n\ - \ \n\ - \Note that key names cannot contain path separators: \n\ - \ \n\ - \ \n\ - \ ┌─────────────────────────────────────┐ \n\ - \ │ { `directory/example.txt` = \"ABC\" } │ Invalid: Key contains a forward slash\n\ - \ └─────────────────────────────────────┘ \n\ - \ \n\ - \ \n\ - \Instead, you need to refactor the expression to use nested records instead: \n\ - \ \n\ - \ \n\ - \ ┌───────────────────────────────────────────┐ \n\ - \ │ { directory = { `example.txt` = \"ABC\" } } │ \n\ - \ └───────────────────────────────────────────┘ \n\ - \ \n\ - \ \n\ - \You tried to translate the following expression to a directory tree: \n\ - \ \n\ - \" <> Util.insert unexpectedExpression <> "\n\ - \ \n\ + Util._ERROR <> ": Not a valid directory tree expression \n\\ + \ \n\\ + \Explanation: Only a subset of Dhall expressions can be converted to a directory \n\\ + \tree. Specifically, record literals or maps can be converted to directories, \n\\ + \❰Text❱ literals can be converted to files, and ❰Optional❱ values are included if \n\\ + \❰Some❱ and omitted if ❰None❱. Values of union types can also be converted if \n\\ + \they are an alternative which has a non-nullary constructor whose argument is of \n\\ + \an otherwise convertible type. Furthermore, there is a more advanced approach to \n\\ + \constructing a directory tree utilizing a fixpoint encoding. Consult the upstream \n\\ + \documentation of the `toDirectoryTree` function in the Dhall.Directory module for \n\\ + \further information on that. \n\\ + \No other type of value can be translated to a directory tree. \n\\ + \ \n\\ + \For example, this is a valid expression that can be translated to a directory \n\\ + \tree: \n\\ + \ \n\\ + \ \n\\ + \ ┌──────────────────────────────────┐ \n\\ + \ │ { `example.json` = \"[1, true]\" } │ \n\\ + \ └──────────────────────────────────┘ \n\\ + \ \n\\ + \ \n\\ + \In contrast, the following expression is not allowed due to containing a \n\\ + \❰Natural❱ field, which cannot be translated in this way: \n\\ + \ \n\\ + \ \n\\ + \ ┌───────────────────────┐ \n\\ + \ │ { `example.txt` = 1 } │ \n\\ + \ └───────────────────────┘ \n\\ + \ \n\\ + \ \n\\ + \Note that key names cannot contain path separators: \n\\ + \ \n\\ + \ \n\\ + \ ┌─────────────────────────────────────┐ \n\\ + \ │ { `directory/example.txt` = \"ABC\" } │ Invalid: Key contains a forward slash\n\\ + \ └─────────────────────────────────────┘ \n\\ + \ \n\\ + \ \n\\ + \Instead, you need to refactor the expression to use nested records instead: \n\\ + \ \n\\ + \ \n\\ + \ ┌───────────────────────────────────────────┐ \n\\ + \ │ { directory = { `example.txt` = \"ABC\" } } │ \n\\ + \ └───────────────────────────────────────────┘ \n\\ + \ \n\\ + \ \n\\ + \You tried to translate the following expression to a directory tree: \n\\ + \ \n\\ + \" <> Util.insert unexpectedExpression <> "\n\\ + \ \n\\ \... which is not an expression that can be translated to a directory tree. \n" {- | This error indicates that you want to set some metadata for a file or @@ -475,11 +492,11 @@ instance Show MetadataUnsupportedError where Pretty.renderString (Dhall.Pretty.layout message) where message = - Util._ERROR <> ": Setting metadata is not supported on this platform. \n\ - \ \n\ - \Explanation: Your Dhall expression indicates that you intend to set some metadata \n\ - \like ownership or permissions for the following file or directory: \n\ - \ \n\ - \" <> Pretty.pretty metadataForPath <> "\n\ - \ \n\ + Util._ERROR <> ": Setting metadata is not supported on this platform. \n\\ + \ \n\\ + \Explanation: Your Dhall expression indicates that you intend to set some metadata \n\\ + \like ownership or permissions for the following file or directory: \n\\ + \ \n\\ + \" <> Pretty.pretty metadataForPath <> "\n\\ + \ \n\\ \... which is not supported on your platform. \n" diff --git a/dhall/src/Dhall/TH.hs b/dhall/src/Dhall/TH.hs index ed08d0334..203ec662f 100644 --- a/dhall/src/Dhall/TH.hs +++ b/dhall/src/Dhall/TH.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE OverloadedStrings #-} @@ -263,7 +264,11 @@ toDeclaration generateOptions@GenerateOptions{..} haskellTypes typ = interpretOptions = generateToInterpretOptions generateOptions typ - toTypeVar (V n i) = Syntax.PlainTV $ Syntax.mkName (Text.unpack n ++ show i) +#if MIN_VERSION_template_haskell(2,17,0) + toTypeVar (V n i) = Syntax.PlainTV (Syntax.mkName (Text.unpack n ++ show i)) () +#else + toTypeVar (V n i) = Syntax.PlainTV (Syntax.mkName (Text.unpack n ++ show i)) +#endif toDataD typeName typeParams constructors = do let name = Syntax.mkName (Text.unpack typeName)