From b106df45110320f24bbcd972f10f47192efbadd8 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 1 Jan 2016 15:09:42 -0400 Subject: scan for unlocked files on init/upgrade of v6 repo --- Database/Keys.hs | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'Database') diff --git a/Database/Keys.hs b/Database/Keys.hs index f5a28c704..30e6ff921 100644 --- a/Database/Keys.hs +++ b/Database/Keys.hs @@ -1,14 +1,14 @@ {- Sqlite database of information about Keys - - - Copyright 2015 Joey Hess - -: + - Copyright 2015-2016 Joey Hess + - - Licensed under the GNU GPL version 3 or higher. -} {-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell #-} {-# LANGUAGE OverloadedStrings, GADTs, FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses, GeneralizedNewtypeDeriving #-} -{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE RankNTypes, ScopedTypeVariables #-} module Database.Keys ( DbHandle, @@ -16,6 +16,7 @@ module Database.Keys ( getAssociatedFiles, getAssociatedKey, removeAssociatedFile, + scanAssociatedFiles, storeInodeCaches, addInodeCaches, getInodeCaches, @@ -35,6 +36,12 @@ import Annex.Perms import Annex.LockFile import Utility.InodeCache import Annex.InodeSentinal +import qualified Git.Types +import qualified Git.LsTree +import Git.Ref +import Git.FilePath +import Annex.CatFile +import Messages import Database.Persist.TH import Database.Esqueleto hiding (Key) @@ -203,6 +210,27 @@ removeAssociatedFile' :: SKey -> FilePath -> Writer removeAssociatedFile' sk f = queueDb $ delete $ from $ \r -> do where_ (r ^. AssociatedKey ==. val sk &&. r ^. AssociatedFile ==. val f) + +{- Find all unlocked associated files. This is expensive, and so normally + - the associated files are updated incrementally when changes are noticed. -} +scanAssociatedFiles :: Annex () +scanAssociatedFiles = runWriter $ \h -> do + showSideAction "scanning for unlocked files" + dropallassociated h + l <- inRepo $ Git.LsTree.lsTree headRef + forM_ l $ \i -> + when (isregfile i) $ + maybe noop (add h i) + =<< catKey (Git.Types.Ref $ Git.LsTree.sha i) + where + dropallassociated = queueDb $ + delete $ from $ \(_r :: SqlExpr (Entity Associated)) -> + return () + isregfile i = Git.Types.toBlobType (Git.LsTree.mode i) == Just Git.Types.FileBlob + add h i k = flip queueDb h $ + void $ insertUnique $ Associated + (toSKey k) + (getTopFilePath $ Git.LsTree.file i) {- Stats the files, and stores their InodeCaches. -} storeInodeCaches :: Key -> [FilePath] -> Annex () -- cgit v1.2.3