diff options
author | Joey Hess <joey@kitenet.net> | 2011-06-20 22:38:18 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2011-06-20 22:38:18 -0400 |
commit | 9f9e17aa0f4898063a58c88661bca01465b126a9 (patch) | |
tree | 93145a4538c8e35a2223ed106a2475dc7faf4e2a | |
parent | 53706ad9bf9bf22359154edab0ca61acea9027e1 (diff) |
unlock: Made atomic.
-rw-r--r-- | Command/Unlock.hs | 10 | ||||
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | 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 161df2ddf..ca8b62502 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 b96b9f43d..6439eb89f 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 a7751f6b7..6d324ff50 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]] |