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.
This commit is contained in:
Joey Hess 2024-06-24 10:13:13 -04:00
parent 0c111fc96a
commit b8016eeb65
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
7 changed files with 31 additions and 14 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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)
]

View file

@ -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"

View file

@ -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.<name>.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.<name>.annex-cluster-node`
Set to the name of a cluster to make this remote be part of

View file

@ -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