diff --git a/Annex.hs b/Annex.hs index 582ffd644d..84b2bda0ad 100644 --- a/Annex.hs +++ b/Annex.hs @@ -197,6 +197,7 @@ data AnnexState = AnnexState , checkignorehandle :: Maybe (ResourcePool CheckIgnoreHandle) , globalnumcopies :: Maybe (Maybe NumCopies) , globalmincopies :: Maybe (Maybe MinCopies) + , nummincopiesattrcache :: Maybe (OsPath, (Maybe NumCopies, Maybe MinCopies)) , limit :: ExpandableMatcher Annex , timelimit :: Maybe (Duration, POSIXTime) , sizelimit :: Maybe (TVar Integer) @@ -253,6 +254,7 @@ newAnnexState c r = do , checkignorehandle = Nothing , globalnumcopies = Nothing , globalmincopies = Nothing + , nummincopiesattrcache = Nothing , limit = BuildingMatcher [] , timelimit = Nothing , sizelimit = Nothing diff --git a/Annex/NumCopies.hs b/Annex/NumCopies.hs index a3885415c5..83a957cec9 100644 --- a/Annex/NumCopies.hs +++ b/Annex/NumCopies.hs @@ -1,6 +1,6 @@ {- git-annex numcopies configuration and checking - - - Copyright 2014-2024 Joey Hess + - Copyright 2014-2025 Joey Hess - - Licensed under the GNU AGPL version 3 or higher. -} @@ -181,12 +181,18 @@ getGlobalFileNumCopies f = fromSourcesOr defaultNumCopies ] getNumMinCopiesAttr :: OsPath -> Annex (Maybe NumCopies, Maybe MinCopies) -getNumMinCopiesAttr file = - checkAttrs ["annex.numcopies", "annex.mincopies"] file >>= \case - (n:m:[]) -> return - ( configuredNumCopies <$> readish n - , configuredMinCopies <$> readish m - ) +getNumMinCopiesAttr file = Annex.getState Annex.nummincopiesattrcache >>= \case + Just (cfile, v) | cfile == file -> return v + _ -> checkAttrs ["annex.numcopies", "annex.mincopies"] file >>= \case + (n:m:[]) -> do + let v = + ( configuredNumCopies <$> readish n + , configuredMinCopies <$> readish m + ) + Annex.changeState $ \s -> s + { Annex.nummincopiesattrcache = Just (file, v) + } + return v _ -> error "internal" {- Checks if numcopies are satisfied for a file by running a comparison