Skip to content

Commit ed4d66c

Browse files
committed
Disable setting file permissions on Windows
It is currently broken; See the discussion of #2452
1 parent 45a0459 commit ed4d66c

File tree

3 files changed

+34
-3
lines changed

3 files changed

+34
-3
lines changed

dhall/src/Dhall/DirectoryTree.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ applyMetadata entry fp = do
311311

312312
let mode' = maybe mode (updateModeWith mode) (entryMode entry)
313313
unless (mode' == mode) $
314-
Posix.setFileMode fp $ modeToFileMode mode'
314+
setFileModeOnUnix fp $ modeToFileMode mode'
315315

316316
-- | Calculate the new `Mode` from the current mode and the changes specified by
317317
-- the user.

dhall/src/Dhall/DirectoryTree/Types.hs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{-# LANGUAGE CPP #-}
2-
{-# LANGUAGE DeriveAnyClass #-}
32
{-# LANGUAGE DeriveGeneric #-}
43
{-# LANGUAGE FlexibleInstances #-}
54
{-# LANGUAGE LambdaCase #-}
@@ -21,6 +20,8 @@ module Dhall.DirectoryTree.Types
2120
, Group(..)
2221
, Mode(..)
2322
, Access(..)
23+
24+
, setFileModeOnUnix
2425
) where
2526

2627
import Data.Functor.Identity (Identity (..))
@@ -45,9 +46,11 @@ import qualified Dhall.Marshal.Decode as Decode
4546

4647
#ifdef mingw32_HOST_OS
4748
import Data.Word (Word32)
49+
import System.IO (hPutStrLn, stderr)
4850

4951
import qualified Unsafe.Coerce
5052
#else
53+
import qualified System.PosixCompat.Files as Posix
5154
import qualified System.PosixCompat.Types as Posix
5255
#endif
5356

@@ -179,3 +182,13 @@ accessDecoder :: FromDhall (f Bool) => InputNormalizer -> Decoder (Access f)
179182
accessDecoder = Decode.genericAutoWithInputNormalizer Decode.defaultInterpretOptions
180183
{ fieldModifier = Text.toLower . Text.drop (Text.length "access")
181184
}
185+
186+
187+
188+
-- | Set file permissions if we are not on Windows as it is currently not supported.
189+
setFileModeOnUnix :: FilePath -> Posix.FileMode -> IO ()
190+
#ifdef mingw32_HOST_OS
191+
setFileModeOnUnix fp _ = hPutStrLn stderr $ "Warning: Feature is not supported on your platform; Failed to set permissions for " <> fp
192+
#else
193+
setFileModeOnUnix fp mode = Posix.setFileMode fp mode
194+
#endif

dhall/tests/Dhall/Test/DirectoryTree.hs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE CPP #-}
12
{-# LANGUAGE OverloadedLists #-}
23
{-# LANGUAGE OverloadedStrings #-}
34

@@ -9,6 +10,7 @@ import Data.Either.Validation
910
import Dhall.DirectoryTree (Entry(..), Group(..), User(..))
1011
import Lens.Family (set)
1112
import System.FilePath ((</>))
13+
import System.PosixCompat.Types (FileMode)
1214
import Test.Tasty
1315
import Test.Tasty.HUnit
1416

@@ -26,7 +28,9 @@ tests = testGroup "to-directory-tree"
2628
[ fixpointedType
2729
, fixpointedEmpty
2830
, fixpointedSimple
31+
#ifndef mingw32_HOST_OS
2932
, fixpointedPermissions
33+
#endif
3034
, fixpointedUserGroup
3135
]
3236
]
@@ -58,6 +62,11 @@ fixpointedSimple = testCase "simple" $ do
5862
, Directory $ outDir </> "directory"
5963
]
6064

65+
{-
66+
This test is disabled on Windows for now as it fails:
67+
expected: 448
68+
but got: 438
69+
-}
6170
fixpointedPermissions :: TestTree
6271
fixpointedPermissions = testCase "permissions" $ do
6372
let outDir = "./tests/to-directory-tree/fixpoint-permissions.out"
@@ -69,7 +78,16 @@ fixpointedPermissions = testCase "permissions" $ do
6978
]
7079
s <- Files.getFileStatus $ outDir </> "file"
7180
let mode = Files.fileMode s `Files.intersectFileModes` Files.accessModes
72-
mode @?= Files.ownerModes
81+
prettyMode mode @?= prettyMode Files.ownerModes
82+
where
83+
prettyMode :: FileMode -> String
84+
prettyMode m =
85+
[ 'r' | isBitSet Files.ownerExecuteMode m ] <>
86+
[ 'w' | isBitSet Files.ownerExecuteMode m ] <>
87+
[ 'x' | isBitSet Files.ownerExecuteMode m ]
88+
89+
isBitSet :: FileMode -> FileMode -> Bool
90+
isBitSet mask m = mask `Files.intersectFileModes` m == Files.nullFileMode
7391

7492
fixpointedUserGroup :: TestTree
7593
fixpointedUserGroup = testCase "user and group" $ do

0 commit comments

Comments
 (0)