
#7971: doesDirectoryExist description differs from its behavior ----------------------------------------+----------------------------------- Reporter: dsf | Owner: Type: bug | Status: new Priority: normal | Component: libraries/directory Version: 7.6.3 | Keywords: Os: Unknown/Multiple | Architecture: Unknown/Multiple Failure: Incorrect result at runtime | Blockedby: Blocking: | Related: ----------------------------------------+----------------------------------- Comment(by Fuuzetsu): Why have you filed a bug for 7.6.3 when you are using 7.6.2? I don't think that's an issue here but you should probably be more careful next time. Here's my output for 7.6.3 {{{ ✓ misaki shana % cd /tmp/7971 ✓ misaki shana % l total 0 -rw-r--r-- 1 shana games 0 Jun 8 16:39 file lrwxrwxrwx 1 shana games 7 Jun 8 16:39 testDirLink -> testDir ✓ misaki shana % ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> import System.Directory Prelude System.Directory> doesDirectoryExist "testDirLink" Loading package filepath-1.3.0.1 ... linking ... done. Loading package array-0.4.0.1 ... linking ... done. Loading package deepseq-1.3.0.1 ... linking ... done. Loading package old-locale-1.0.0.5 ... linking ... done. Loading package time-1.4.0.1 ... linking ... done. Loading package bytestring-0.10.0.2 ... linking ... done. Loading package unix-2.6.0.1 ... linking ... done. Loading package directory-1.2.0.1 ... linking ... done. False Prelude System.Directory> }}} I had a look at what removeDirectoryRecursive is doing and nothing from the source seems to point that it will follow links. It will call ‘unlink’ on the symlink because doesDirectoryExist will return False and therefore will not follow the link. Testing with actual files confirms that calling removeDirectoryRecursive that has the link inside of it in fact does not do anything beyond removing the linked. Directory linked to is intact. Bah, it will never even check if something is the directory unless ‘unlink’ fails somehow at which point we get an exception in Either: ‘Left e’ and only then we check that something is directory. ‘unlink’ will work fine on the symlinks without following them. If anything, I think that the ‘Be careful’ message should be investigated. -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7971#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler