update inode cache to cover file even when nothing needs to be done to linkAnnex
authorJoey Hess <joeyh@joeyh.name>
Tue, 15 Dec 2015 17:02:33 +0000 (13:02 -0400)
committerJoey Hess <joeyh@joeyh.name>
Tue, 15 Dec 2015 17:02:33 +0000 (13:02 -0400)
This covers the case where multiple files have the same content and are
added with git add. Previously only the one that was linked to the annex
got its inode cached; now both are.

Annex/Content.hs

index f4daa3813ab20afe99e47c1b5b24fe0311e3e456..e99dfb1dd4d998f086dbc6b9450bc360961b8307 100644 (file)
@@ -27,6 +27,7 @@ module Annex.Content (
        linkAnnex,
        linkAnnex',
        LinkAnnexResult(..),
+       unlinkAnnex,
        checkedCopyFile,
        sendAnnex,
        prepSendAnnex,
@@ -512,7 +513,6 @@ populatePointerFile k obj f = go =<< isPointerFile f
                        liftIO $ writeFile f (formatPointer k)
        go _ = return ()
 
-
 {- Hard links a file into .git/annex/objects/, falling back to a copy
  - if necessary. Does nothing if the object file already exists.
  -
@@ -527,17 +527,22 @@ linkAnnex key src = do
        modifyContent dest $ linkAnnex' key src dest
 
 {- Hard links (or copies) src to dest, one of which should be the
- - annex object. -}
+ - annex object. Updates inode cache for src and for dest when it's
+ - changed. -}
 linkAnnex' :: Key -> FilePath -> FilePath -> Annex LinkAnnexResult
 linkAnnex' key src dest = 
        ifM (liftIO $ doesFileExist dest)
-               ( return LinkAnnexNoop
+               ( do
+                       Database.Keys.storeInodeCaches key [src]
+                       return LinkAnnexNoop
                , ifM (linkAnnex'' key src dest)
                        ( do
                                thawContent dest
                                Database.Keys.storeInodeCaches key [dest, src]
                                return LinkAnnexOk
-                       , return LinkAnnexFailed
+                       , do
+                               Database.Keys.storeInodeCaches key [src]
+                               return LinkAnnexFailed
                        )
                )
 
@@ -560,6 +565,14 @@ linkAnnex'' key src dest = catchBoolIO $ do
        copy
 #endif
 
+{- Removes the annex object file for a key. Lowlevel. -}
+unlinkAnnex :: Key -> Annex ()
+unlinkAnnex key = do
+       obj <- calcRepo $ gitAnnexLocation key
+       modifyContent obj $ do
+               secureErase obj
+               liftIO $ nukeFile obj
+
 {- Checks disk space before copying. -}
 checkedCopyFile :: Key -> FilePath -> FilePath -> Annex Bool
 checkedCopyFile key src dest = catchBoolIO $