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:
parent
9174d4449a
commit
af3a25ee03
3 changed files with 22 additions and 4 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue