2015-01-27 21:38:06 +00:00
|
|
|
{- git-annex repository differences
|
|
|
|
-
|
|
|
|
- Copyright 2015 Joey Hess <id@joeyh.name>
|
|
|
|
-
|
2019-03-13 19:48:14 +00:00
|
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
2015-01-27 21:38:06 +00:00
|
|
|
-}
|
|
|
|
|
filter out control characters in warning messages
Converted warning and similar to use StringContainingQuotedPath. Most
warnings are static strings, some do refer to filepaths that need to be
quoted, and others don't need quoting.
Note that, since quote filters out control characters of even
UnquotedString, this makes all warnings safe, even when an attacker
sneaks in a control character in some other way.
When json is being output, no quoting is done, since json gets its own
quoting.
This does, as a side effect, make warning messages in json output not
be indented. The indentation is only needed to offset warning messages
underneath the display of the file they apply to, so that's ok.
Sponsored-by: Brett Eisenberg on Patreon
2023-04-10 18:47:32 +00:00
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
|
|
|
2015-01-27 21:38:06 +00:00
|
|
|
module Annex.Difference (
|
|
|
|
module Types.Difference,
|
|
|
|
setDifferences,
|
|
|
|
) where
|
|
|
|
|
2016-01-20 20:36:33 +00:00
|
|
|
import Annex.Common
|
2015-01-27 21:38:06 +00:00
|
|
|
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
|
2015-01-28 17:47:41 +00:00
|
|
|
otherds <- allDifferences <$> recordedDifferences
|
2015-01-27 21:38:06 +00:00
|
|
|
ds <- mappend otherds . annexDifferences <$> Annex.getGitConfig
|
|
|
|
when (ds /= mempty) $ do
|
2015-01-28 22:17:10 +00:00
|
|
|
ds' <- ifM (isJust <$> getVersion)
|
2015-01-27 21:38:06 +00:00
|
|
|
( do
|
|
|
|
oldds <- recordedDifferencesFor u
|
|
|
|
when (ds /= oldds) $
|
2015-04-11 04:10:34 +00:00
|
|
|
warning "Cannot change tunable parameters in already initialized repository."
|
2015-01-27 21:38:06 +00:00
|
|
|
return oldds
|
|
|
|
, if otherds == mempty
|
2019-01-01 19:39:45 +00:00
|
|
|
then ifM (any (/= u) . M.keys <$> uuidDescMap)
|
2015-01-27 21:38:06 +00:00
|
|
|
( 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
|
|
|
|
)
|
2015-01-28 22:17:10 +00:00
|
|
|
forM_ (listDifferences ds') $ \d ->
|
2024-09-06 18:23:29 +00:00
|
|
|
case differenceConfigKey d of
|
|
|
|
Nothing -> noop
|
|
|
|
Just ck -> setConfig ck (differenceConfigVal d)
|
2015-01-27 21:38:06 +00:00
|
|
|
recordDifferences ds' u
|