summaryrefslogtreecommitdiff
path: root/Annex/Difference.hs
blob: 23448192a80ff7f66cd76590b4b0350d86b25370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{- 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 Annex.Common
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 <- allDifferences <$> recordedDifferences
	ds <- mappend otherds . annexDifferences <$> Annex.getGitConfig
	when (ds /= mempty) $ do
		ds' <- 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 (any (/= 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_ (listDifferences ds') $ \d ->
			setConfig (ConfigKey $ differenceConfigKey d) (differenceConfigVal d)
		recordDifferences ds' u