From b8016eeb65a66cddd1002740c4b5ecaa528c0f96 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 24 Jun 2024 10:13:13 -0400 Subject: [PATCH] add annex-proxied This makes git-annex sync and similar not treat proxied remotes as git syncable remotes. Also, display in git-annex info remote when the remote is proxied. --- Command/Sync.hs | 4 ---- Remote.hs | 6 ++++-- Remote/Git.hs | 8 ++++++-- Remote/Helper/Git.hs | 2 ++ Types/GitConfig.hs | 4 ++++ doc/git-annex.mdwn | 9 +++++++++ doc/todo/git-annex_proxies.mdwn | 12 ++++++------ 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/Command/Sync.hs b/Command/Sync.hs index a0f9bc8147..62b557ccc7 100644 --- a/Command/Sync.hs +++ b/Command/Sync.hs @@ -1158,7 +1158,3 @@ splitRemoteAnnexTrackingBranchSubdir tb = (branch, subdir) subdir = if S.null p then Nothing else Just (asTopFilePath p) - -sameGitRepo :: Remote -> Remote -> Bool -sameGitRepo x y = - remoteUrl (Remote.gitconfig x) == remoteUrl (Remote.gitconfig y) diff --git a/Remote.hs b/Remote.hs index a57a929114..9038d2a767 100644 --- a/Remote.hs +++ b/Remote.hs @@ -449,11 +449,13 @@ claimingUrl' remotefilter url = do checkclaim = maybe (pure False) (`id` url) . claimUrl {- Is this a remote of a type that git pull and push work with? - - That includes special remotes with an annex:: url configured. -} + - That includes special remotes with an annex:: url configured. + - It does not include proxied remotes. -} gitSyncableRemote :: Remote -> Bool gitSyncableRemote r | gitSyncableRemoteType (remotetype r) - && isJust (remoteUrl (gitconfig r)) = True + && isJust (remoteUrl (gitconfig r)) = + not (remoteAnnexProxied (gitconfig r)) | otherwise = case remoteUrl (gitconfig r) of Just u | "annex::" `isPrefixOf` u -> True _ -> False diff --git a/Remote/Git.hs b/Remote/Git.hs index 6f7d4265c2..6e3906892f 100644 --- a/Remote/Git.hs +++ b/Remote/Git.hs @@ -827,7 +827,8 @@ listProxied proxies rs = concat <$> mapM go rs annexconfigadjuster r' = let c = adduuid (configRepoUUID renamedr) $ - addurl (remoteConfig renamedr "url") $ + addurl $ + addproxied $ inheritconfigs $ Git.fullconfig r' in r' { Git.config = M.map Prelude.head c @@ -837,8 +838,11 @@ listProxied proxies rs = concat <$> mapM go rs adduuid ck = M.insert ck [Git.ConfigValue $ fromUUID $ proxyRemoteUUID p] - addurl ck = M.insert ck + addurl = M.insert (remoteConfig renamedr "url") [Git.ConfigValue $ encodeBS $ Git.repoLocation r] + + addproxied = M.insert (remoteAnnexConfig renamedr "proxied") + [Git.ConfigValue $ Git.Config.boolConfig' True] inheritconfigs c = foldl' inheritconfig c proxyInheritedFields diff --git a/Remote/Helper/Git.hs b/Remote/Helper/Git.hs index ccefb231ea..b240ee0a2f 100644 --- a/Remote/Helper/Git.hs +++ b/Remote/Helper/Git.hs @@ -64,5 +64,7 @@ gitRepoInfo r = do repo <- Remote.getRepo r return [ ("repository location", Git.repoLocation repo) + , ("proxied", Git.Config.boolConfig + (remoteAnnexProxied (Remote.gitconfig r))) , ("last synced", lastsynctime) ] diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs index 2f8a4e3875..56eb25713b 100644 --- a/Types/GitConfig.hs +++ b/Types/GitConfig.hs @@ -388,6 +388,7 @@ data RemoteGitConfig = RemoteGitConfig , remoteAnnexMaxGitBundles :: Int , remoteAnnexAllowEncryptedGitRepo :: Bool , remoteAnnexProxy :: Bool + , remoteAnnexProxied :: Bool , remoteAnnexClusterNode :: Maybe [RemoteName] , remoteUrl :: Maybe String @@ -474,6 +475,7 @@ extractRemoteGitConfig r remotename = do , remoteAnnexAllowEncryptedGitRepo = getbool AllowEncryptedGitRepoField False , remoteAnnexProxy = getbool ProxyField False + , remoteAnnexProxied = getbool ProxiedField False , remoteAnnexClusterNode = (filter isLegalName . words) <$> getmaybe ClusterNodeField @@ -554,6 +556,7 @@ data RemoteGitConfigField | MaxGitBundlesField | AllowEncryptedGitRepoField | ProxyField + | ProxiedField | ClusterNodeField | UrlField | ShellField @@ -619,6 +622,7 @@ remoteGitConfigField = \case AllowEncryptedGitRepoField -> inherited "allow-encrypted-gitrepo" -- Allow proxy chains. ProxyField -> inherited "proxy" + ProxiedField -> uninherited "proxied" ClusterNodeField -> uninherited "cluster-node" UrlField -> uninherited "url" ShellField -> inherited "shell" diff --git a/doc/git-annex.mdwn b/doc/git-annex.mdwn index 06b2b63abd..428068f04e 100644 --- a/doc/git-annex.mdwn +++ b/doc/git-annex.mdwn @@ -1674,6 +1674,15 @@ Remotes are configured using these settings in `.git/config`. After configuring this, run [[git-annex-updateproxy](1) to store the new configuration in the git-annex branch. +* `remote..annex-proxied` + + Setting this to "true" indicates that a remote is proxied via the + git-annex repository that its remote points to. That prevents commands + like `git-annex sync` from pulling and pushing the remote. + + Usually this is used internally, when git-annex sets up proxied remotes, + and will not need to be set. + * `remote..annex-cluster-node` Set to the name of a cluster to make this remote be part of diff --git a/doc/todo/git-annex_proxies.mdwn b/doc/todo/git-annex_proxies.mdwn index 57f7ca5186..15637fe78a 100644 --- a/doc/todo/git-annex_proxies.mdwn +++ b/doc/todo/git-annex_proxies.mdwn @@ -26,17 +26,17 @@ In development on the `proxy` branch. For June's work on [[design/passthrough_proxy]], remaining todos: -* `git-annex sync` etc should not treat clusters as git syncable remotes. +* On upload to cluster, send to nodes where it's preferred content, and not + to other nodes. -* `git-annex sync` etc, when operating on clusters, should first +* `git-annex sync --content` etc, when operating on clusters, should first operate on the cluster as a whole, to take advantages of fanout on upload and mass drop. Only operate on individual cluster nodes afterwards, to handle cases such as a cluster containing a key, but some node wanting and lacking the key. Perhaps just setting cost for nodes slightly - higher than the cluster cost will be enough? - -* On upload to cluster, send to nodes where it's preferred content, and not - to other nodes. + higher than the cluster cost will be enough? Or should it even send a key + to a cluster node if the cluster contains the key? Perhaps that is + unnecessary work, the cluster should be able to rebalance itself. * Getting a key from a cluster currently always selects the lowest cost remote, and always the same remote if cost is the same. Should