aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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]]