git-remote-annex: support importrree=yes remotes
When exporttree=yes is also set. Probably it would also be possible to support ones with only importtree=yes, by enabling exporttree=yes for the remote only when using git-remote-annex, but let's keep this simple... I'm not sure what gets recorded in .git/annex/ state differently in the two cases that might cause a problem when doing that. Note that the full annex:: urls generated and displayed for such a remote omit the importree=yes. Which is ok, cloning from such an url uses an exporttree=remote, but the git-annex branch doesn't get written by this program, so once the real config is available from the git-annex branch, it will still function as an importree=yes remote.
This commit is contained in:
parent
126d188812
commit
e64add7cdf
3 changed files with 32 additions and 11 deletions
|
@ -22,7 +22,6 @@ import qualified Git.Remote
|
|||
import qualified Git.Remote.Remove
|
||||
import qualified Git.Version
|
||||
import qualified Annex.SpecialRemote as SpecialRemote
|
||||
import qualified Annex.SpecialRemote.Config as SpecialRemote
|
||||
import qualified Annex.Branch
|
||||
import qualified Annex.BranchState
|
||||
import qualified Types.Remote as Remote
|
||||
|
@ -576,7 +575,7 @@ getEnabledSpecialRemoteByName remotename =
|
|||
| unparsedRemoteConfig (Remote.config rmt) == mempty ->
|
||||
return Nothing
|
||||
| otherwise ->
|
||||
maybe (return (Just rmt)) giveup
|
||||
maybe (Just <$> importTreeWorkAround rmt) giveup
|
||||
(checkSpecialRemoteProblems rmt)
|
||||
|
||||
checkSpecialRemoteProblems :: Remote -> Maybe String
|
||||
|
@ -586,9 +585,6 @@ checkSpecialRemoteProblems rmt
|
|||
| Remote.thirdPartyPopulated (Remote.remotetype rmt) =
|
||||
Just $ "Cannot use this thirdparty-populated special"
|
||||
++ " remote as a git remote."
|
||||
| importTree (Remote.config rmt) =
|
||||
Just $ "Using importtree=yes special remotes as git remotes"
|
||||
++ " is not yet supported."
|
||||
| parseEncryptionMethod (unparsedRemoteConfig (Remote.config rmt)) /= Right NoneEncryption
|
||||
&& not (remoteAnnexAllowEncryptedGitRepo (Remote.gitconfig rmt)) =
|
||||
Just $ "Using an encrypted special remote as a git"
|
||||
|
@ -600,6 +596,27 @@ checkSpecialRemoteProblems rmt
|
|||
where
|
||||
ConfigKey allowencryptedgitrepo = remoteAnnexConfig rmt "allow-encrypted-gitrepo"
|
||||
|
||||
-- Using importTree remotes needs the content identifier database to be
|
||||
-- populated, but it is not when cloning, and cannot be updated when
|
||||
-- pushing since git-annex branch updates by this program are prevented.
|
||||
--
|
||||
-- So, generate instead a version of the remote that uses exportTree actions,
|
||||
-- which do not need content identifiers. Since Remote.Helper.exportImport
|
||||
-- replaces the exportActions in exportActionsForImport with ones that use
|
||||
-- import actions, have to instantiate a new remote with a modified config.
|
||||
importTreeWorkAround :: Remote -> Annex Remote
|
||||
importTreeWorkAround rmt
|
||||
| not (importTree (Remote.config rmt)) = pure rmt
|
||||
| not (exportTree (Remote.config rmt)) = giveup "Using special remotes with importtree=yes but without exporttree=yes as git remotes is not supported."
|
||||
| otherwise = do
|
||||
m <- Logs.Remote.remoteConfigMap
|
||||
r <- Remote.getRepo rmt
|
||||
remoteGen' adjustconfig m (Remote.remotetype rmt) r >>= \case
|
||||
Just rmt' -> return rmt'
|
||||
Nothing -> giveup "Failed to use importtree=yes remote."
|
||||
where
|
||||
adjustconfig = M.delete importTreeField
|
||||
|
||||
-- Downloads the Manifest when present in the remote. When not present,
|
||||
-- returns an empty Manifest.
|
||||
downloadManifestWhenPresent :: Remote -> Annex Manifest
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue