aboutsummaryrefslogtreecommitdiff
path: root/Annex/Difference.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-01-27 17:38:06 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-01-27 17:38:06 -0400
commitdf81023501e2b0d930ec90cc6f5a6c6735f84818 (patch)
tree5bd3b9d8f91464bd27c9d86f700b975a76067147 /Annex/Difference.hs
parent1e07d61b9669f85a02551d7858177bd33ffaea6f (diff)
Repository tuning parameters can now be passed when initializing a repository for the first time.
* init: Repository tuning parameters can now be passed when initializing a repository for the first time. For details, see http://git-annex.branchable.com/tuning/ * merge: Refuse to merge changes from a git-annex branch of a repo that has been tuned in incompatable ways.
Diffstat (limited to 'Annex/Difference.hs')
-rw-r--r--Annex/Difference.hs60
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