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.
This commit is contained in:
Joey Hess 2020-04-13 13:45:40 -04:00
parent 9cb69dbb76
commit 5a62e8132d
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 21 additions and 4 deletions

View file

@ -22,7 +22,6 @@ import Config
import Remote.List import Remote.List
import Logs.Remote import Logs.Remote
import Logs.Trust import Logs.Trust
import qualified Git.Config
import qualified Types.Remote as Remote import qualified Types.Remote as Remote
import Git.Types (RemoteName) import Git.Types (RemoteName)
@ -99,7 +98,7 @@ autoEnable = do
_ -> return () _ -> return ()
where where
configured rc = fromMaybe False $ configured rc = fromMaybe False $
Git.Config.isTrueFalse . fromProposedAccepted trueFalseParser' . fromProposedAccepted
=<< M.lookup autoEnableField rc =<< M.lookup autoEnableField rc
canenable u = (/= DeadTrusted) <$> lookupTrust u canenable u = (/= DeadTrusted) <$> lookupTrust u
getenabledremotes = M.fromList getenabledremotes = M.fromList

View file

@ -17,7 +17,6 @@ import Types.UUID
import Types.ProposedAccepted import Types.ProposedAccepted
import Types.RemoteConfig import Types.RemoteConfig
import Types.GitConfig import Types.GitConfig
import qualified Git.Config
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.Set as S import qualified Data.Set as S
@ -242,9 +241,17 @@ yesNoParser f v fd = genParser yesno f v fd
yesno _ = Nothing yesno _ = Nothing
trueFalseParser :: RemoteConfigField -> Bool -> FieldDesc -> RemoteConfigFieldParser 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")) (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 genParser
:: Typeable t :: Typeable t
=> (String -> Maybe t) => (String -> Maybe t)

View file

@ -9,6 +9,8 @@ git-annex (8.20200331) UNRELEASED; urgency=medium
* Fix a potential failure to parse git config. * Fix a potential failure to parse git config.
* Support boolean git configs that are represented by the name of the * 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". 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 <id@joeyh.name> Mon, 30 Mar 2020 15:58:34 -0400 -- Joey Hess <id@joeyh.name> Mon, 30 Mar 2020 15:58:34 -0400

View file

@ -166,8 +166,17 @@ isTrueFalse = isTrueFalse' . ConfigValue . encodeBS'
isTrueFalse' :: ConfigValue -> Maybe Bool isTrueFalse' :: ConfigValue -> Maybe Bool
isTrueFalse' (ConfigValue s) isTrueFalse' (ConfigValue s)
| s' == "yes" = Just True
| s' == "on" = Just True
| s' == "true" = Just True | s' == "true" = Just True
| s' == "1" = Just True
| s' == "no" = Just False
| s' == "off" = Just False
| s' == "false" = Just False | s' == "false" = Just False
| s' == "0" = Just False
| s' == "" = Just False
| otherwise = Nothing | otherwise = Nothing
where where
s' = S8.map toLower s s' = S8.map toLower s