git.iko.soy/typeable/pandoc
on master help sign in
markdown2pdf: Use proper temp directory for latex processing.

Previously /tmp/pandoc was used, which was problematic for several reasons. Closes #339.

commitfc3826e078302e8351fa68d05d84dada1668cd3a authorJohn MacFarlane <fiddlosopher@gmail.com> dateThu 10 Nov 2011, 11:55 (15 years ago) parent5c1c818
1 file changed+16−9
src/markdown2pdf.hs+16−9
src/markdown2pdf.hs+16−9
@@ -8,6 +8,8 @@ import Data.ByteString.UTF8 (toString)
88import Control.Monad (unless, guard, liftM, when)
99import Control.Concurrent (putMVar, takeMVar, newEmptyMVar, forkIO)
1010import Control.Exception (tryJust, bracket, evaluate)
11+import Control.Monad.Trans (liftIO)
12+import System.IO.Error (isAlreadyExistsError)
1113
1214import System.IO
1315import System.IO.Error (isDoesNotExistError)
@@ -176,17 +178,22 @@ saveOutput input output = do
176178 copyFile (encodeString input) (encodeString output)
177179 UTF8.hPutStrLn stderr $! "Created " ++ output
178180
179−main :: IO ()
180−main = bracket
181− -- acquire resource
182− (do dir <- getTemporaryDirectory
183− let tmp = dir </> "pandoc"
184− createDirectoryIfMissing True tmp
185− return tmp)
181+-- | Perform a function in a temporary directory and clean up.
182+withTempDir :: FilePath -> (FilePath -> IO a) -> IO a
183+withTempDir baseName = bracket (createTempDir 0 baseName) removeDirectoryRecursive
186184
187− -- release resource
188− ( \tmp -> removeDirectoryRecursive tmp)
185+-- | Create a temporary directory with a unique name.
186+createTempDir :: Integer -> FilePath -> IO FilePath
187+createTempDir num baseName = do
188+ sysTempDir <- getTemporaryDirectory
189+ let dirName = sysTempDir </> baseName <.> show num
190+ liftIO $ catch (createDirectory dirName >> return dirName) $
191+ \e -> if isAlreadyExistsError e
192+ then createTempDir (num + 1) baseName
193+ else ioError e
189194
195+main :: IO ()
196+main = withTempDir "pandoc"
190197 -- run computation
191198 $ \tmp -> do
192199 args <- liftM (map decodeString) getArgs