From 5a62e8132d3f36697fd4c510d91cba4a3d3be338 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 13 Apr 2020 13:45:40 -0400 Subject: [PATCH] When parsing git configs, support all the documented ways to write true and false, including "yes", "on", "1", etc. This change does impact git-annex config eg "git annex config --set annex.addunlocked on" will store "on" and new git-annex will understand that value, while old git-annex will error: git-annex: bad annex.addunlocked configuration in git annex config: Parse failure: near "on" That seems acceptable. Not special remote configs that are only documented as =true or =false however. Having git-annex support other values for those would break backwards compatability when used with old versions of git-annex. And older versions ignore invalid special remote configs.. That would not be a good combination. --- Annex/SpecialRemote.hs | 3 +-- Annex/SpecialRemote/Config.hs | 11 +++++++++-- CHANGELOG | 2 ++ Git/Config.hs | 9 +++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Annex/SpecialRemote.hs b/Annex/SpecialRemote.hs index 4e55c399b6..165f2f8ea1 100644 --- a/Annex/SpecialRemote.hs +++ b/Annex/SpecialRemote.hs @@ -22,7 +22,6 @@ import Config import Remote.List import Logs.Remote import Logs.Trust -import qualified Git.Config import qualified Types.Remote as Remote import Git.Types (RemoteName) @@ -99,7 +98,7 @@ autoEnable = do _ -> return () where configured rc = fromMaybe False $ - Git.Config.isTrueFalse . fromProposedAccepted + trueFalseParser' . fromProposedAccepted =<< M.lookup autoEnableField rc canenable u = (/= DeadTrusted) <$> lookupTrust u getenabledremotes = M.fromList diff --git a/Annex/SpecialRemote/Config.hs b/Annex/SpecialRemote/Config.hs index 5e0e85f2f4..df5eb11054 100644 --- a/Annex/SpecialRemote/Config.hs +++ b/Annex/SpecialRemote/Config.hs @@ -17,7 +17,6 @@ import Types.UUID import Types.ProposedAccepted import Types.RemoteConfig import Types.GitConfig -import qualified Git.Config import qualified Data.Map as M import qualified Data.Set as S @@ -242,9 +241,17 @@ yesNoParser f v fd = genParser yesno f v fd yesno _ = Nothing trueFalseParser :: RemoteConfigField -> Bool -> FieldDesc -> RemoteConfigFieldParser -trueFalseParser f v fd = genParser Git.Config.isTrueFalse f v fd +trueFalseParser f v fd = genParser trueFalseParser' f v fd (Just (ValueDesc "true or false")) +-- Not using Git.Config.isTrueFalse because git supports +-- a lot of other values for true and false in its configs, +-- and this is not a git config and we want to avoid that mess. +trueFalseParser' :: String -> Maybe Bool +trueFalseParser' "true" = Just True +trueFalseParser' "false" = Just False +trueFalseParser' _ = Nothing + genParser :: Typeable t => (String -> Maybe t) diff --git a/CHANGELOG b/CHANGELOG index 603ff20f7d..8b0d372eb0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,8 @@ git-annex (8.20200331) UNRELEASED; urgency=medium * Fix a potential failure to parse git config. * Support boolean git configs that are represented by the name of the setting with no value, eg "core.bare" is the same as "core.bare = true". + * When parsing git configs, support all the documented ways to write + true and false, including "yes", "on", "1", etc. -- Joey Hess Mon, 30 Mar 2020 15:58:34 -0400 diff --git a/Git/Config.hs b/Git/Config.hs index 54370865a0..f50d5eb534 100644 --- a/Git/Config.hs +++ b/Git/Config.hs @@ -166,8 +166,17 @@ isTrueFalse = isTrueFalse' . ConfigValue . encodeBS' isTrueFalse' :: ConfigValue -> Maybe Bool isTrueFalse' (ConfigValue s) + | s' == "yes" = Just True + | s' == "on" = Just True | s' == "true" = Just True + | s' == "1" = Just True + + | s' == "no" = Just False + | s' == "off" = Just False | s' == "false" = Just False + | s' == "0" = Just False + | s' == "" = Just False + | otherwise = Nothing where s' = S8.map toLower s