From 9f9e17aa0f4898063a58c88661bca01465b126a9 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 20 Jun 2011 22:38:18 -0400 Subject: [PATCH] unlock: Made atomic. --- Command/Unlock.hs | 10 +++++++--- debian/changelog | 1 + doc/bugs/git_annex_unlock_is_not_atomic.mdwn | 2 ++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Command/Unlock.hs b/Command/Unlock.hs index 161df2ddf9..ca8b62502a 100644 --- a/Command/Unlock.hs +++ b/Command/Unlock.hs @@ -44,11 +44,15 @@ perform dest key = do g <- Annex.gitRepo let src = gitAnnexLocation g key - liftIO $ removeFile dest + let tmpdest = gitAnnexTmpLocation g key + liftIO $ createDirectoryIfMissing True (parentDir tmpdest) showNote "copying..." - ok <- liftIO $ copyFile src dest + ok <- liftIO $ copyFile src tmpdest if ok then do - liftIO $ allowWrite dest + liftIO $ do + removeFile dest + renameFile tmpdest dest + allowWrite dest next $ return True else error "copy failed!" diff --git a/debian/changelog b/debian/changelog index b96b9f43d6..6439eb89fa 100644 --- a/debian/changelog +++ b/debian/changelog @@ -6,6 +6,7 @@ git-annex (0.20110611) UNRELEASED; urgency=low such as btrfs. * Allow --trust etc to specify a repository by name, for temporarily trusting repositories that are not configured remotes. + * unlock: Made atomic. * git-union-merge: New git subcommand, that does a generic union merge operation, and operates efficiently without touching the working tree. diff --git a/doc/bugs/git_annex_unlock_is_not_atomic.mdwn b/doc/bugs/git_annex_unlock_is_not_atomic.mdwn index a7751f6b7d..6d324ff500 100644 --- a/doc/bugs/git_annex_unlock_is_not_atomic.mdwn +++ b/doc/bugs/git_annex_unlock_is_not_atomic.mdwn @@ -3,3 +3,5 @@ Running a command like git annex unlock myfile is not atomic, that is if the execution is aborted you may end up with an incomplete version of myfile in the directory. If you don't notice this you may lock it again and then propagate this bad version of the file to your other repositories. A simple workaround is to simply name it something else while unlocking and then rename it to the correct filename once it's completely copied. I don't know Haskel yet so I can not fix this issue otherwise I would sure try. A part from this, I love git annex. + +> [[fixed|done]] --[[Joey]]