diff --git a/Annex/Branch.hs b/Annex/Branch.hs index 16f5b6840c..2ee7c2fd18 100644 --- a/Annex/Branch.hs +++ b/Annex/Branch.hs @@ -20,6 +20,7 @@ module Annex.Branch ( updateTo, get, getHistorical, + getUnmergedRefs, RegardingUUID(..), change, maybeChange, @@ -281,6 +282,12 @@ get file = do bs <- forM refs $ \ref -> getRef ref file return (l <> mconcat bs) +{- When the git-annex branch is unable to be updated due to permissions, + - and there are other git-annex branches that have not been merged into + - it, this gets the refs of those branches. -} +getUnmergedRefs :: Annex [Git.Ref] +getUnmergedRefs = unmergedRefs <$> update + {- Used to cache the value of a file, which has been read from the branch - using some optimised method. The journal has to be checked, in case - it has a newer version of the file that has not reached the branch yet. diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs index 096c588485..87eb1e333b 100644 --- a/CmdLine/Seek.hs +++ b/CmdLine/Seek.hs @@ -361,13 +361,14 @@ seekFilteredKeys seeker listfs = do (process mi ofeeder mdfeeder mdcloser False l) mdprocessertid <- liftIO . async =<< forkState (mdprocess mi mdreader ofeeder ocloser) - if usesLocationLog seeker || matcherNeedsLocationLog mi - then catObjectStream g $ \lfeeder lcloser lreader -> do + ifM (precachell mi) + ( catObjectStream g $ \lfeeder lcloser lreader -> do precachertid <- liftIO . async =<< forkState (precacher mi config oreader lfeeder lcloser) precachefinisher mi lreader checktimelimit join (liftIO (wait precachertid)) - else finisher mi oreader checktimelimit + , finisher mi oreader checktimelimit + ) join (liftIO (wait mdprocessertid)) join (liftIO (wait processertid)) liftIO $ void cleanup @@ -467,6 +468,16 @@ seekFilteredKeys seeker listfs = do Just _ -> mdprocess mi mdreader ofeeder ocloser Nothing -> liftIO $ void ocloser + -- Precache location logs if it will speed things up. + -- + -- When there are git-annex branches that are not able to be + -- merged, the precaching is disabled, since it only looks at the + -- git-annex branch and not at those. + precachell mi + | usesLocationLog seeker || matcherNeedsLocationLog mi = + null <$> Annex.Branch.getUnmergedRefs + | otherwise = pure False + seekHelper :: (a -> RawFilePath) -> WarnUnmatchWhen -> ([LsFiles.Options] -> [RawFilePath] -> Git.Repo -> IO ([a], IO Bool)) -> WorkTreeItems -> Annex ([(SeekInput, a)], IO Bool) seekHelper c ww a (WorkTreeItems l) = do os <- seekOptions ww