{- git-annex command
-
- - Copyright 2010-2016 Joey Hess <id@joeyh.name>
+ - Copyright 2010-2022 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU AGPL version 3 or higher.
-}
import Annex.Perms
import Annex.Link
import Annex.ReplaceFile
+import Annex.InodeSentinal
+import Utility.InodeCache
import Git.FilePath
import qualified Database.Keys
import qualified Utility.RawFilePath as R
perform :: RawFilePath -> Key -> CommandPerform
perform dest key = do
destmode <- liftIO $ catchMaybeIO $ fileMode <$> R.getFileStatus dest
- replaceWorkTreeFile (fromRawFilePath dest) $ \tmp ->
+ destic <- replaceWorkTreeFile (fromRawFilePath dest) $ \tmp -> do
ifM (inAnnex key)
( do
r <- linkFromAnnex' key (toRawFilePath tmp) destmode
LinkAnnexFailed -> error "unlock failed"
, liftIO $ writePointerFile (toRawFilePath tmp) key destmode
)
- next $ cleanup dest key destmode
+ withTSDelta (liftIO . genInodeCache (toRawFilePath tmp))
+ next $ cleanup dest destic key destmode
-cleanup :: RawFilePath -> Key -> Maybe FileMode -> CommandCleanup
-cleanup dest key destmode = do
+cleanup :: RawFilePath -> Maybe InodeCache -> Key -> Maybe FileMode -> CommandCleanup
+cleanup dest destic key destmode = do
stagePointerFile dest destmode =<< hashPointerFile key
+ maybe noop (restagePointerFile (Restage True) dest) destic
Database.Keys.addAssociatedFile key =<< inRepo (toTopFilePath dest)
return True
--[[Joey]]
[[!tag confirmed]]
+
+> I wondered if this was still a problem in a v9 repository with
+> filter-process used instead of smudge. It's not really -- after unlocking
+> 1000 files, git status did need to refresh all 1000, but it ran
+> relatively quickly because it was able to use filter-process.
+>
+> But, those were small files. Large files would make it slower as it pipes
+> their content though. It would be better for Command.Unlock to use
+> restagePointerFile, so whatever price there is is paid during unlocking
+> and not unexpectedly later on.
+>
+> I tried again making Command.Unlock use restagePointerFile, and this
+> slowed git-annex unlock. But git status did then avoid doing any more
+> smudgeing. It seems that each call to restagePointerFile is running
+> git update-index, so still one git-annex smudge per file, rather
+> than combining several together.
+>
+> That's because restagePointerFile uses the git queue, and unlock
+> also queues a git add or something, so the queue isn't able to built
+> up because two dissimilar things are being queued. This seems an
+> unncessary behavior; it could queue up all the git adds and then
+> run restagePointerFile after them all.