summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-06-20 22:38:18 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-06-20 22:38:18 -0400
commit9f9e17aa0f4898063a58c88661bca01465b126a9 (patch)
tree93145a4538c8e35a2223ed106a2475dc7faf4e2a
parent53706ad9bf9bf22359154edab0ca61acea9027e1 (diff)
unlock: Made atomic.
-rw-r--r--Command/Unlock.hs10
-rw-r--r--debian/changelog1
-rw-r--r--doc/bugs/git_annex_unlock_is_not_atomic.mdwn2
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]]