stop using remote.name.annex-readonly for two distinct things
This commit is contained in:
parent
cd1676d604
commit
9f3c2dfeda
5 changed files with 98 additions and 12 deletions
|
@ -23,6 +23,12 @@ git-annex (8.20200331) UNRELEASED; urgency=medium
|
||||||
to silently skip files that the location log thought were present on the
|
to silently skip files that the location log thought were present on the
|
||||||
remote, when the remote actually no longer contained them. Since that
|
remote, when the remote actually no longer contained them. Since that
|
||||||
behavior could be surprising, now instead display a warning.
|
behavior could be surprising, now instead display a warning.
|
||||||
|
* external special remotes: remote.name.annex-readonly=true no longer
|
||||||
|
disables running the external special remote program. Instead, it just
|
||||||
|
makes the remote operate in a readonly mode, same as any remote.
|
||||||
|
To disable running the external special remote program, now need to set
|
||||||
|
remote.name.annex-externaltype=readonly. That is done when
|
||||||
|
git-annex enableremote is passed readonly=true.
|
||||||
|
|
||||||
-- Joey Hess <id@joeyh.name> Mon, 30 Mar 2020 15:58:34 -0400
|
-- Joey Hess <id@joeyh.name> Mon, 30 Mar 2020 15:58:34 -0400
|
||||||
|
|
||||||
|
|
|
@ -65,7 +65,7 @@ readonlyField = Accepted "readonly"
|
||||||
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> RemoteStateHandle -> Annex (Maybe Remote)
|
gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> RemoteStateHandle -> Annex (Maybe Remote)
|
||||||
gen r u rc gc rs
|
gen r u rc gc rs
|
||||||
-- readonly mode only downloads urls; does not use external program
|
-- readonly mode only downloads urls; does not use external program
|
||||||
| remoteAnnexReadOnly gc = do
|
| externaltype == "readonly" = do
|
||||||
c <- parsedRemoteConfig remote rc
|
c <- parsedRemoteConfig remote rc
|
||||||
cst <- remoteCost gc expensiveRemoteCost
|
cst <- remoteCost gc expensiveRemoteCost
|
||||||
mk c cst GloballyAvailable
|
mk c cst GloballyAvailable
|
||||||
|
@ -165,15 +165,22 @@ externalSetup :: SetupStage -> Maybe UUID -> Maybe CredPair -> RemoteConfig -> R
|
||||||
externalSetup _ mu _ c gc = do
|
externalSetup _ mu _ c gc = do
|
||||||
u <- maybe (liftIO genUUID) return mu
|
u <- maybe (liftIO genUUID) return mu
|
||||||
pc <- either giveup return $ parseRemoteConfig c lenientRemoteConfigParser
|
pc <- either giveup return $ parseRemoteConfig c lenientRemoteConfigParser
|
||||||
let externaltype = fromMaybe (giveup "Specify externaltype=") $
|
let readonlyconfig = getRemoteConfigValue readonlyField pc == Just True
|
||||||
|
let externaltype = if readonlyconfig
|
||||||
|
then "readonly"
|
||||||
|
else fromMaybe (giveup "Specify externaltype=") $
|
||||||
getRemoteConfigValue externaltypeField pc
|
getRemoteConfigValue externaltypeField pc
|
||||||
(c', _encsetup) <- encryptionSetup c gc
|
(c', _encsetup) <- encryptionSetup c gc
|
||||||
|
|
||||||
c'' <- case getRemoteConfigValue readonlyField pc of
|
c'' <- if readonlyconfig
|
||||||
Just True -> do
|
then do
|
||||||
|
-- Setting annex-readonly is not really necessary
|
||||||
|
-- anymore, but older versions of git-annex used
|
||||||
|
-- this, not externaltype=readonly, so still set
|
||||||
|
-- it.
|
||||||
setConfig (remoteAnnexConfig (fromJust (lookupName c)) "readonly") (boolConfig True)
|
setConfig (remoteAnnexConfig (fromJust (lookupName c)) "readonly") (boolConfig True)
|
||||||
return c'
|
return c'
|
||||||
_ -> do
|
else do
|
||||||
pc' <- either giveup return $ parseRemoteConfig c' lenientRemoteConfigParser
|
pc' <- either giveup return $ parseRemoteConfig c' lenientRemoteConfigParser
|
||||||
external <- newExternal externaltype (Just u) pc' (Just gc) Nothing
|
external <- newExternal externaltype (Just u) pc' (Just gc) Nothing
|
||||||
-- Now that we have an external, ask it to LISTCONFIGS,
|
-- Now that we have an external, ask it to LISTCONFIGS,
|
||||||
|
@ -200,7 +207,9 @@ checkExportSupported :: ParsedRemoteConfig -> RemoteGitConfig -> Annex Bool
|
||||||
checkExportSupported c gc = do
|
checkExportSupported c gc = do
|
||||||
let externaltype = fromMaybe (giveup "Specify externaltype=") $
|
let externaltype = fromMaybe (giveup "Specify externaltype=") $
|
||||||
remoteAnnexExternalType gc <|> getRemoteConfigValue externaltypeField c
|
remoteAnnexExternalType gc <|> getRemoteConfigValue externaltypeField c
|
||||||
checkExportSupported'
|
if externaltype == "readonly"
|
||||||
|
then return False
|
||||||
|
else checkExportSupported'
|
||||||
=<< newExternal externaltype Nothing c (Just gc) Nothing
|
=<< newExternal externaltype Nothing c (Just gc) Nothing
|
||||||
|
|
||||||
checkExportSupported' :: External -> Annex Bool
|
checkExportSupported' :: External -> Annex Bool
|
||||||
|
@ -649,7 +658,16 @@ startExternal external = do
|
||||||
giveup $ "Cannot run " ++ cmd ++ " -- Make sure it's executable and that its dependencies are installed."
|
giveup $ "Cannot run " ++ cmd ++ " -- Make sure it's executable and that its dependencies are installed."
|
||||||
runerr Nothing _ = do
|
runerr Nothing _ = do
|
||||||
path <- intercalate ":" <$> getSearchPath
|
path <- intercalate ":" <$> getSearchPath
|
||||||
giveup $ "Cannot run " ++ basecmd ++ " -- It is not installed in PATH (" ++ path ++ ")"
|
let err = "Cannot run " ++ basecmd ++ " -- It is not installed in PATH (" ++ path ++ ")"
|
||||||
|
case (lookupName (unparsedRemoteConfig (externalDefaultConfig external)), remoteAnnexReadOnly <$> externalGitConfig external) of
|
||||||
|
(Just rname, Just True) -> giveup $ unlines
|
||||||
|
[ err
|
||||||
|
, "This remote has annex-readonly=true, and previous versions of"
|
||||||
|
, "git-annex would tried to download from it without"
|
||||||
|
, "installing " ++ basecmd ++ ". If you want that, you need to set:"
|
||||||
|
, "git config remote." ++ rname ++ ".annex-externaltype readonly"
|
||||||
|
]
|
||||||
|
_ -> giveup err
|
||||||
|
|
||||||
stopExternal :: External -> Annex ()
|
stopExternal :: External -> Annex ()
|
||||||
stopExternal external = liftIO $ do
|
stopExternal external = liftIO $ do
|
||||||
|
|
|
@ -8,3 +8,4 @@ In an external special remote, if I set annex-readonly=true, I get
|
||||||
|
|
||||||
Removing the annex-readonly setting lets checkpresentkey work. But isn't checkpresentkey a read-only operation?
|
Removing the annex-readonly setting lets checkpresentkey work. But isn't checkpresentkey a read-only operation?
|
||||||
|
|
||||||
|
> [[fixed|done]] --[[Joey]]
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 3"""
|
||||||
|
date="2020-04-23T17:13:42Z"
|
||||||
|
content="""
|
||||||
|
So, enableremote readonly=true sets remote.name.annex-readonly
|
||||||
|
in git config. And it assumes that, if that is set, you don't want to use
|
||||||
|
the external special remote program at all, but instead a previous use of
|
||||||
|
it elsewhere should have stored the urls where git-annex can download content
|
||||||
|
stored in that remote.
|
||||||
|
|
||||||
|
The use case for enableremote readonly=true is that you want to provide a
|
||||||
|
way for users to get content you have stored in your remote without the
|
||||||
|
bother of installing a third-party program to access it. While you could
|
||||||
|
set remote.name.annex-readonly in git config after enableremote,
|
||||||
|
you would need to have the program installed for the enableremote step,
|
||||||
|
and readonly=true avoids that.
|
||||||
|
|
||||||
|
It's the same as `git annex copy --to s3` registering the content as stored
|
||||||
|
in the s3 remote, not the web remote, even if git-annex knows there's a
|
||||||
|
publically available url that can be used to access it.
|
||||||
|
|
||||||
|
If git-annex treated that as also storing the content to the web remote,
|
||||||
|
then it would be maintaining two sets of books for the same copy of the file.
|
||||||
|
So instead the user needs to enable use of the s3 remote
|
||||||
|
(even if without any S3 creds in a necessarily read-only mode) in order for
|
||||||
|
git-annex to access files stored on it. And same with these external
|
||||||
|
special remotes, except their code is not built into git-annex, so
|
||||||
|
readonly=true provides a way to not need to run their code at all.
|
||||||
|
|
||||||
|
Now, you did not pass readonly=true to enableremote from what I
|
||||||
|
understand, but instead came along later and set
|
||||||
|
remote.name.annex-readonly=true in git config. And I think your goal was to
|
||||||
|
keep using the special remote program for eg downloads, but prevent
|
||||||
|
writing to the remote.
|
||||||
|
|
||||||
|
So yes, it would be better if enableremote readonly=true set some other
|
||||||
|
config than remote.name.annex-readonly. As it is, there's no way to
|
||||||
|
distinguish between the two use cases.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Ok, I'm gonna make remote.name.annex-externaltype=readonly be a special
|
||||||
|
case that avoids running the external special remote program.
|
||||||
|
|
||||||
|
In the case where no program is available, it will check if
|
||||||
|
remote.name.annex-readonly is set, and if so when it fails it will
|
||||||
|
suggest the user might want to set annex-externaltype=readonly to deal with
|
||||||
|
this change.
|
||||||
|
"""]]
|
|
@ -1527,10 +1527,21 @@ Remotes are configured using these settings in `.git/config`.
|
||||||
|
|
||||||
It is set to "true" if this is a git-lfs remote.
|
It is set to "true" if this is a git-lfs remote.
|
||||||
|
|
||||||
* `remote.<name>.annex-hooktype`, `remote.<name>.annex-externaltype`
|
* `remote.<name>.annex-externaltype`
|
||||||
|
|
||||||
Used by hook special remotes and external special remotes to record
|
Used external special remotes to record the type of the remote.
|
||||||
the type of the remote.
|
|
||||||
|
Eg, if this is set to "foo", git-annex will run a "git-annex-remote-foo"
|
||||||
|
program to communicate with the external special remote.
|
||||||
|
|
||||||
|
If this is set to "readonly", then git-annex will not run any external
|
||||||
|
special remote program, but will try to access things stored in the
|
||||||
|
remote using http. That only works for some external special remotes,
|
||||||
|
so consult the documentation of the one you are using.
|
||||||
|
|
||||||
|
* `remote.<name>.annex-hooktype`
|
||||||
|
|
||||||
|
Used by hook special remotes to record the type of the remote.
|
||||||
|
|
||||||
* `annex.web-options`
|
* `annex.web-options`
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue