wip separate RemoteConfig parsing
Remote now contains a ParsedRemoteConfig. The parsing happens when the Remote is constructed, rather than when individual configs are used. This is more efficient, and it lets initremote/enableremote reject configs that have unknown fields or unparsable values. It also allows for improved type safety, as shown in Remote.Helper.Encryptable where things that used to match on string configs now match on data types. This is a work in progress, it does not build yet. The main risk in this conversion is forgetting to add a field to RemoteConfigParser. That will prevent using that field with initremote/enableremote, and will prevent remotes that already are set up from seeing that configuration. So will need to check carefully that every field that getRemoteConfigValue is called on has been added to RemoteConfigParser. (One such case I need to remember is that credPairRemoteField needs to be included in the RemoteConfigParser.)
This commit is contained in:
parent
4a135934ff
commit
71f78fe45d
10 changed files with 266 additions and 101 deletions
|
@ -1,6 +1,6 @@
|
|||
{- helpers for special remotes
|
||||
-
|
||||
- Copyright 2011-2019 Joey Hess <id@joeyh.name>
|
||||
- Copyright 2011-2020 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- Licensed under the GNU AGPL version 3 or higher.
|
||||
-}
|
||||
|
@ -28,6 +28,7 @@ module Remote.Helper.Special (
|
|||
retreiveKeyFileDummy,
|
||||
removeKeyDummy,
|
||||
checkPresentDummy,
|
||||
specialRemoteConfigParser,
|
||||
SpecialRemoteCfg(..),
|
||||
specialRemoteCfg,
|
||||
specialRemote,
|
||||
|
@ -149,7 +150,7 @@ checkPresentDummy :: Key -> Annex Bool
|
|||
checkPresentDummy _ = error "missing checkPresent implementation"
|
||||
|
||||
type RemoteModifier
|
||||
= RemoteConfig
|
||||
= ParsedRemoteConfig
|
||||
-> Preparer Storer
|
||||
-> Preparer Retriever
|
||||
-> Preparer Remover
|
||||
|
@ -157,12 +158,15 @@ type RemoteModifier
|
|||
-> Remote
|
||||
-> Remote
|
||||
|
||||
specialRemoteConfigParser :: [RemoteConfigParser]
|
||||
specialRemoteConfigParser = chunkConfigParser ++ encryptionConfigParser
|
||||
|
||||
data SpecialRemoteCfg = SpecialRemoteCfg
|
||||
{ chunkConfig :: ChunkConfig
|
||||
, displayProgress :: Bool
|
||||
}
|
||||
|
||||
specialRemoteCfg :: RemoteConfig -> SpecialRemoteCfg
|
||||
specialRemoteCfg :: ParsedRemoteConfig -> SpecialRemoteCfg
|
||||
specialRemoteCfg c = SpecialRemoteCfg (getChunkConfig c) True
|
||||
|
||||
-- Modifies a base Remote to support both chunking and encryption,
|
||||
|
@ -212,7 +216,7 @@ specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckp
|
|||
}
|
||||
}
|
||||
cip = cipherKey c (gitconfig baser)
|
||||
isencrypted = isJust (extractCipher c)
|
||||
isencrypted = isEncrypted c
|
||||
|
||||
safely a = catchNonAsync a (\e -> warning (show e) >> return False)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue