From 9024d8e2d1883e982458d6bc8910ef6d8f79375c Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Fri, 11 Apr 2025 13:11:21 -0400 Subject: [PATCH] fixes for enabling and autoenabling mask special remotes --- Remote/Mask.hs | 30 ++++++++++++++++++++---------- doc/git-annex.mdwn | 4 +++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Remote/Mask.hs b/Remote/Mask.hs index b4b981fbe9..c17c370fda 100644 --- a/Remote/Mask.hs +++ b/Remote/Mask.hs @@ -104,8 +104,13 @@ maskSetup setupstage mu _ c gc = do (M.lookup remoteField c) setupremote =<< findnamed maskremotename _ -> case M.lookup remoteField c of - Just (Proposed maskremotename) -> - setupremote =<< findnamed maskremotename + -- enableremote with remote= overrides the remote + -- 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 where setupremote r = do @@ -117,18 +122,20 @@ maskSetup setupstage mu _ c gc = do u <- maybe (liftIO genUUID) return mu gitConfigSpecialRemote u c'' [ ("mask", name r) ] return (c'', u) + + maskremoteuuid = fromMaybe NoUUID $ + toUUID . fromProposedAccepted + <$> M.lookup remoteUUIDField c enableremote remotelist = do - let maskremoteuuid = fromMaybe NoUUID $ - toUUID . fromProposedAccepted - <$> M.lookup remoteUUIDField c case filter (\r -> uuid r == maskremoteuuid) remotelist of (r:_) -> setupremote r [] -> case setupstage of Enable _ -> missingMaskedRemote maskremoteuuid -- When autoenabling, the masked remote may - -- get autoenabled later. + -- get autoenabled later, or need to be + -- manually enabled. _ -> do (c', _) <- encryptionSetup c gc u <- maybe (liftIO genUUID) return mu @@ -170,14 +177,17 @@ findMaskedRemote c gc myuuid = case remoteAnnexMask gc of Just "true" -> case getmaskedremoteuuid of Just maskremoteuuid -> - selectremote maskremoteuuid - (\r -> uuid r == maskremoteuuid) + selectremote maskremoteuuid $ \r -> + uuid r == maskremoteuuid Nothing -> missingMaskedRemote NoUUID Just maskremotename -> - selectremote NoUUID (\r -> name r == maskremotename) + selectremote (fromMaybe NoUUID getmaskedremoteuuid) $ \r -> + name r == maskremotename + && Just (uuid r) == getmaskedremoteuuid Nothing -> missingMaskedRemote NoUUID where - getmaskedremoteuuid = toUUID . fromProposedAccepted <$> M.lookup remoteField c + getmaskedremoteuuid = toUUID . fromProposedAccepted + <$> M.lookup remoteUUIDField c selectremote u f = do remotelist <- Annex.getState Annex.remotes case filter f remotelist of diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 25fb8ec3b2..c3b1ea0745 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -2053,7 +2053,9 @@ Remotes are configured using these settings in `.git/config`. * `remote..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`. * `remote..annex-externaltype`