fixes for enabling and autoenabling mask special remotes

This commit is contained in:
Joey Hess 2025-04-11 13:11:21 -04:00
parent f553cf411b
commit 9024d8e2d1
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
2 changed files with 23 additions and 11 deletions

View file

@ -104,8 +104,13 @@ maskSetup setupstage mu _ c gc = do
(M.lookup remoteField c) (M.lookup remoteField c)
setupremote =<< findnamed maskremotename setupremote =<< findnamed maskremotename
_ -> case M.lookup remoteField c of _ -> case M.lookup remoteField c of
Just (Proposed maskremotename) -> -- enableremote with remote= overrides the remote
setupremote =<< findnamed maskremotename -- name that was used with initremote.
Just (Proposed maskremotename) -> do
r <- findnamed maskremotename
unless (uuid r == maskremoteuuid) $
giveup $ "Remote \"" ++ maskremotename ++ "\" does not have the expected uuid (" ++ fromUUID maskremoteuuid ++ ")"
setupremote r
_ -> enableremote remotelist _ -> enableremote remotelist
where where
setupremote r = do setupremote r = do
@ -117,18 +122,20 @@ maskSetup setupstage mu _ c gc = do
u <- maybe (liftIO genUUID) return mu u <- maybe (liftIO genUUID) return mu
gitConfigSpecialRemote u c'' [ ("mask", name r) ] gitConfigSpecialRemote u c'' [ ("mask", name r) ]
return (c'', u) return (c'', u)
maskremoteuuid = fromMaybe NoUUID $
toUUID . fromProposedAccepted
<$> M.lookup remoteUUIDField c
enableremote remotelist = do enableremote remotelist = do
let maskremoteuuid = fromMaybe NoUUID $
toUUID . fromProposedAccepted
<$> M.lookup remoteUUIDField c
case filter (\r -> uuid r == maskremoteuuid) remotelist of case filter (\r -> uuid r == maskremoteuuid) remotelist of
(r:_) -> setupremote r (r:_) -> setupremote r
[] -> case setupstage of [] -> case setupstage of
Enable _ -> Enable _ ->
missingMaskedRemote maskremoteuuid missingMaskedRemote maskremoteuuid
-- When autoenabling, the masked remote may -- When autoenabling, the masked remote may
-- get autoenabled later. -- get autoenabled later, or need to be
-- manually enabled.
_ -> do _ -> do
(c', _) <- encryptionSetup c gc (c', _) <- encryptionSetup c gc
u <- maybe (liftIO genUUID) return mu u <- maybe (liftIO genUUID) return mu
@ -170,14 +177,17 @@ findMaskedRemote c gc myuuid = case remoteAnnexMask gc of
Just "true" -> Just "true" ->
case getmaskedremoteuuid of case getmaskedremoteuuid of
Just maskremoteuuid -> Just maskremoteuuid ->
selectremote maskremoteuuid selectremote maskremoteuuid $ \r ->
(\r -> uuid r == maskremoteuuid) uuid r == maskremoteuuid
Nothing -> missingMaskedRemote NoUUID Nothing -> missingMaskedRemote NoUUID
Just maskremotename -> Just maskremotename ->
selectremote NoUUID (\r -> name r == maskremotename) selectremote (fromMaybe NoUUID getmaskedremoteuuid) $ \r ->
name r == maskremotename
&& Just (uuid r) == getmaskedremoteuuid
Nothing -> missingMaskedRemote NoUUID Nothing -> missingMaskedRemote NoUUID
where where
getmaskedremoteuuid = toUUID . fromProposedAccepted <$> M.lookup remoteField c getmaskedremoteuuid = toUUID . fromProposedAccepted
<$> M.lookup remoteUUIDField c
selectremote u f = do selectremote u f = do
remotelist <- Annex.getState Annex.remotes remotelist <- Annex.getState Annex.remotes
case filter f remotelist of case filter f remotelist of

View file

@ -2053,7 +2053,9 @@ Remotes are configured using these settings in `.git/config`.
* `remote.<name>.annex-mask` * `remote.<name>.annex-mask`
Used by mask special remotes. Used by mask special remotes, this is set to the name of the remote
that is masked. If this is set to "true", then any remote with the
right UUID will be used.
Normally this is automatically set up by `git annex initremote`. Normally this is automatically set up by `git annex initremote`.
* `remote.<name>.annex-externaltype` * `remote.<name>.annex-externaltype`