Deal with stale mappings for deleted file in direct mode.

The most common way for a mapping to be stale is when a file was deleted,
or renamed. Nothing updates the mappings for deletions yet.
But they can also become stale in other ways. For example a file can
be modified.

So, the mapping is not trusted to be consistent. When we get a key,
only replace symlinks that still point to that key with its content.
When we drop a key, only put back symlinks for files that still have
the direct mode content.
This commit is contained in:
Joey Hess 2013-02-05 16:48:00 -04:00
parent 9174d4449a
commit af3a25ee03
3 changed files with 22 additions and 4 deletions

View file

@ -247,8 +247,18 @@ moveAnnex key src = withObjectLoc key storeobject storedirect
freezeContent dest
freezeContentDir dest
)
storedirect [] = storeobject =<< inRepo (gitAnnexLocation key)
storedirect (dest:fs) = do
storedirect fs = storedirect' =<< liftIO (filterM validsymlink fs)
validsymlink f = do
tl <- tryIO $ readSymbolicLink f
return $ case tl of
Right l
| isLinkToAnnex l ->
Just key == fileKey (takeFileName l)
_ -> False
storedirect' [] = storeobject =<< inRepo (gitAnnexLocation key)
storedirect' (dest:fs) = do
updateCache key src
thawContent src
liftIO $ replaceFile dest $ moveFile src
@ -345,9 +355,10 @@ removeAnnex key = withObjectLoc key remove removedirect
removeFile file
cleanObjectLoc key
removedirect fs = do
cache <- recordedCache key
removeCache key
mapM_ resetfile fs
resetfile f = do
mapM_ (resetfile cache) fs
resetfile cache f = whenM (compareCache f cache) $ do
l <- calcGitLink f key
top <- fromRepo Git.repoPath
cwd <- liftIO getCurrentDirectory

1
debian/changelog vendored
View file

@ -9,6 +9,7 @@ git-annex (3.20130125) UNRELEASED; urgency=low
and other tasks.
* assistant: Ignore .DS_Store on OSX.
* assistant: Fix location log when adding new file in direct mode.
* Deal with stale mappings for deleted file in direct mode.
-- Joey Hess <joeyh@debian.org> Sat, 26 Jan 2013 15:48:40 +1100

View file

@ -87,6 +87,12 @@ is converted to a real file when it becomes present.
* kqueue does not deliver an event when an existing file is modified.
This doesn't affect OSX, which uses FSEvents now, but it makes direct
mode assistant not 100% on other BSD's.
* The mapping is not updated when files are deleted (or for the deletion
part of a rename). So it can contain old filenames that are no longer in
use. Code that uses the mapping has to take care to check that the
files they refer to exists, which is a good idea anyway. But,
it would be good to at some point update the mappings to remove deleted
files (fsck does this FWIW).
## done