diff options
Diffstat (limited to 'Annex/Difference.hs')
-rw-r--r-- | Annex/Difference.hs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/Annex/Difference.hs b/Annex/Difference.hs new file mode 100644 index 000000000..cb363e80c --- /dev/null +++ b/Annex/Difference.hs @@ -0,0 +1,60 @@ +{- git-annex repository differences + - + - Copyright 2015 Joey Hess <id@joeyh.name> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Difference ( + module Types.Difference, + setDifferences, +) where + +import Common.Annex +import Types.Difference +import Logs.Difference +import Config +import Annex.UUID +import Logs.UUID +import Annex.Version +import qualified Annex + +import qualified Data.Map as M + +-- Differences are only allowed to be tweaked when initializing a +-- repository for the first time, and then only if there is not another +-- known uuid. If the repository was cloned from elsewhere, it inherits +-- the existing settings. +-- +-- Must be called before setVersion, so it can check if this is the first +-- time the repository is being initialized. +setDifferences :: Annex () +setDifferences = do + u <- getUUID + otherds <- either error return + =<< sanityCheckDifferences . allDifferences + <$> recordedDifferences + ds <- mappend otherds . annexDifferences <$> Annex.getGitConfig + when (ds /= mempty) $ do + ds'@(Differences l) <- ifM (isJust <$> getVersion) + ( do + oldds <- recordedDifferencesFor u + when (ds /= oldds) $ + warning $ "Cannot change tunable parameters in already initialized repository." + return oldds + , if otherds == mempty + then ifM (not . null . filter (/= u) . M.keys <$> uuidMap) + ( do + warning "Cannot change tunable parameters in a clone of an existing repository." + return mempty + , return ds + ) + else if otherds /= ds + then do + warning "The specified tunable parameters differ from values being used in other clones of this repository." + return otherds + else return ds + ) + forM_ l $ \d -> + setConfig (ConfigKey $ differenceConfigKey d) (differenceConfigVal d) + recordDifferences ds' u |