summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2010-10-10 11:08:40 -0400
committerGravatar Joey Hess <joey@kitenet.net>2010-10-10 11:08:40 -0400
commitf98fa53d7f6d851b8a1ae804c02780769c98e07c (patch)
treed82ad5c4bd8037c8ae548c21946930d21cadf528
parent11ad93f023fa5e867b5b7bd47f45393caceb401a (diff)
fixed close after locking
-rw-r--r--LocationLog.hs15
-rw-r--r--Utility.hs7
-rw-r--r--git-annex.hs2
3 files changed, 16 insertions, 8 deletions
diff --git a/LocationLog.hs b/LocationLog.hs
index c921a2005..1523901df 100644
--- a/LocationLog.hs
+++ b/LocationLog.hs
@@ -12,6 +12,11 @@
-
- A line of the log will look like: "date N reponame"
- Where N=1 when the repo has the file, and 0 otherwise.
+ -
+ - TOOD: compact logs, by storing only current presence infomation when
+ - writing them.
+ -
+ - TODO: use ByteString
-}
module LocationLog where
@@ -67,9 +72,8 @@ readLog file = do
exists <- doesFileExist file
if exists
then do
- h <- openLocked file ReadMode
- s <- hGetContentsStrict h
- hClose h
+ s <- withFileLocked file ReadMode $ \h ->
+ hGetContentsStrict h
-- filter out any unparsable lines
return $ filter (\l -> (status l) /= Undefined )
$ map read $ lines s
@@ -80,9 +84,8 @@ readLog file = do
writeLog :: String -> LogLine -> IO ()
writeLog file line = do
createDirectoryIfMissing True (parentDir file)
- h <- openLocked file AppendMode
- hPutStrLn h $ show line
- hClose h
+ withFileLocked file AppendMode $ \h ->
+ hPutStrLn h $ show line
{- Generates a new LogLine with the current date. -}
logNow :: LogStatus -> String -> IO LogLine
diff --git a/Utility.hs b/Utility.hs
index ab9ce04f3..d1eb247d3 100644
--- a/Utility.hs
+++ b/Utility.hs
@@ -9,12 +9,15 @@ import Data.String.Utils
{- Let's just say that Haskell makes reading/writing a file with
- file locking excessively difficult. -}
-openLocked file mode = do
+withFileLocked file mode action = do
+ -- TODO: find a way to use bracket here
handle <- openFile file mode
lockfd <- handleToFd handle -- closes handle
waitToSetLock lockfd (lockType mode, AbsoluteSeek, 0, 0)
handle' <- fdToHandle lockfd
- return handle'
+ ret <- action handle'
+ hClose handle'
+ return ret
where
lockType ReadMode = ReadLock
lockType _ = WriteLock
diff --git a/git-annex.hs b/git-annex.hs
index e8032a132..66b9491bd 100644
--- a/git-annex.hs
+++ b/git-annex.hs
@@ -6,3 +6,5 @@ import GitRepo
main = do
gitPrep
+ l <- readLog "demo.log"
+ writeLog "demo2.log" $ l !! 0