Skip to content

Commit

Permalink
Remove read-only in cabal clean on Windows
Browse files Browse the repository at this point in the history
  • Loading branch information
jasagredo committed Jul 22, 2024
1 parent 705b6eb commit 599def7
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 1 deletion.
21 changes: 20 additions & 1 deletion cabal-install/src/Distribution/Client/CmdClean.hs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ import Distribution.Simple.Utils
, info
, wrapText
)
import Distribution.System
( OS (Windows)
, buildOS
)
import Distribution.Utils.Path hiding
( (<.>)
, (</>)
Expand All @@ -60,6 +64,9 @@ import Distribution.Verbosity
( normal
)

import Control.Exception
( throw
)
import Control.Monad
( forM
, forM_
Expand All @@ -78,6 +85,10 @@ import System.Directory
import System.FilePath
( (</>)
)
import System.IO.Error
( isPermissionError
)
import qualified System.Process as Process

data CleanFlags = CleanFlags
{ cleanSaveConfig :: Flag Bool
Expand Down Expand Up @@ -168,7 +179,15 @@ cleanAction (ProjectFlags{..}, CleanFlags{..}) extraArgs _ = do
let distRoot = distDirectory distLayout

info verbosity ("Deleting dist-newstyle (" ++ distRoot ++ ")")
handleDoesNotExist () $ removeDirectoryRecursive distRoot
handleDoesNotExist () $ do
if buildOS == Windows
then do
-- Windows can't delete some git files #10182
void $ Process.createProcess_ "attrib" $ Process.shell $ "attrib -s -h -r " <> distRoot <> "\\*.* /s /d"
catch
(removeDirectoryRecursive distRoot)
(\e -> if isPermissionError e then removeDirectoryRecursive distRoot else throw e)
else removeDirectoryRecursive distRoot

removeEnvFiles $ distProjectRootDirectory distLayout

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
cabal-version: 3.0
name: aa
version: 0.1.0.0
build-type: Simple

library
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# cabal build
Resolving dependencies...
Build profile: -w ghc-<GHCVER> -O1
In order, the following would be built:
- aa-0.1.0.0 (lib) (first run)
# cabal clean
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
packages: .

source-repository-package
type: git
location: https://github.com/haskell/bytestring
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import Test.Cabal.Prelude

main = cabalTest $ withProjectFile "cabal.project" $ do
cabal' "build" ["--dry-run"]
cabal' "clean" []
return ()
11 changes: 11 additions & 0 deletions changelog.d/pr-10190
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
synopsis: Fix `cabal clean` permissions on Windows
packages: cabal-install
prs: #10190
issues: #10182
significance:

description: {

- `cabal clean` now removes the read-only mark recursively in the `dist-newstyle` folder on Windows before attempting to delete it.

}

0 comments on commit 599def7

Please sign in to comment.