avoid beware of the leopard situation
* Display a warning message when a remote uses a protocol, such as git://, that git-annex does not support. Silently skipping such a remote was confusing behavior. It sets annex-ignore, so the warning is only displayed once. * Also display a warning message when a remote, without a known uuid, is located in a directory that does not currently exist, to avoid silently skipping such a remote. This is a bit more debatable, since git-annex get will say, try making repository available. And since it does not set annex-ignore, the warning will be displayed repeatedly. It's also an extreme edge case, I don't think I've ever seen it happen in real life.
This commit is contained in:
parent
5d407aa5a4
commit
f9ed30de3b
4 changed files with 61 additions and 11 deletions
11
CHANGELOG
11
CHANGELOG
|
@ -1,3 +1,14 @@
|
||||||
|
git-annex (8.20200502) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* Display a warning message when a remote uses a protocol, such as
|
||||||
|
git://, that git-annex does not support. Silently skipping such a
|
||||||
|
remote was confusing behavior.
|
||||||
|
* Also display a warning message when a remote, without a known uuid,
|
||||||
|
is located in a directory that does not currently exist, to avoid
|
||||||
|
silently skipping such a remote.
|
||||||
|
|
||||||
|
-- Joey Hess <id@joeyh.name> Mon, 04 May 2020 12:46:11 -0400
|
||||||
|
|
||||||
git-annex (8.20200501) upstream; urgency=medium
|
git-annex (8.20200501) upstream; urgency=medium
|
||||||
|
|
||||||
* Improve git-annex's ability to find the path to its program,
|
* Improve git-annex's ability to find the path to its program,
|
||||||
|
|
|
@ -149,15 +149,15 @@ gitSetup (Enable _) Nothing _ _ _ = error "unable to enable git remote with no s
|
||||||
configRead :: Bool -> Git.Repo -> Annex Git.Repo
|
configRead :: Bool -> Git.Repo -> Annex Git.Repo
|
||||||
configRead autoinit r = do
|
configRead autoinit r = do
|
||||||
gc <- Annex.getRemoteGitConfig r
|
gc <- Annex.getRemoteGitConfig r
|
||||||
u <- getRepoUUID r
|
hasuuid <- (/= NoUUID) <$> getRepoUUID r
|
||||||
annexignore <- liftIO $ getDynamicConfig (remoteAnnexIgnore gc)
|
annexignore <- liftIO $ getDynamicConfig (remoteAnnexIgnore gc)
|
||||||
case (repoCheap r, annexignore, u) of
|
case (repoCheap r, annexignore, hasuuid) of
|
||||||
(_, True, _) -> return r
|
(_, True, _) -> return r
|
||||||
(True, _, _)
|
(True, _, _)
|
||||||
| remoteAnnexCheckUUID gc -> tryGitConfigRead autoinit r
|
| remoteAnnexCheckUUID gc -> tryGitConfigRead autoinit r hasuuid
|
||||||
| otherwise -> return r
|
| otherwise -> return r
|
||||||
(False, _, NoUUID) -> configSpecialGitRemotes r >>= \case
|
(False, _, False) -> configSpecialGitRemotes r >>= \case
|
||||||
Nothing -> tryGitConfigRead autoinit r
|
Nothing -> tryGitConfigRead autoinit r False
|
||||||
Just r' -> return r'
|
Just r' -> return r'
|
||||||
_ -> return r
|
_ -> return r
|
||||||
|
|
||||||
|
@ -244,8 +244,8 @@ repoAvail r
|
||||||
|
|
||||||
{- Tries to read the config for a specified remote, updates state, and
|
{- Tries to read the config for a specified remote, updates state, and
|
||||||
- returns the updated repo. -}
|
- returns the updated repo. -}
|
||||||
tryGitConfigRead :: Bool -> Git.Repo -> Annex Git.Repo
|
tryGitConfigRead :: Bool -> Git.Repo -> Bool -> Annex Git.Repo
|
||||||
tryGitConfigRead autoinit r
|
tryGitConfigRead autoinit r hasuuid
|
||||||
| haveconfig r = return r -- already read
|
| haveconfig r = return r -- already read
|
||||||
| Git.repoIsSsh r = storeUpdatedRemote $ do
|
| Git.repoIsSsh r = storeUpdatedRemote $ do
|
||||||
v <- Ssh.onRemote NoConsumeStdin r
|
v <- Ssh.onRemote NoConsumeStdin r
|
||||||
|
@ -258,9 +258,12 @@ tryGitConfigRead autoinit r
|
||||||
Left _ -> configlist_failed
|
Left _ -> configlist_failed
|
||||||
| Git.repoIsHttp r = storeUpdatedRemote geturlconfig
|
| Git.repoIsHttp r = storeUpdatedRemote geturlconfig
|
||||||
| Git.GCrypt.isEncrypted r = handlegcrypt =<< getConfigMaybe (remoteAnnexConfig r "uuid")
|
| Git.GCrypt.isEncrypted r = handlegcrypt =<< getConfigMaybe (remoteAnnexConfig r "uuid")
|
||||||
| Git.repoIsUrl r = return r
|
| Git.repoIsUrl r = do
|
||||||
| otherwise = storeUpdatedRemote $ liftIO $
|
set_ignore "uses a protocol not supported by git-annex" False
|
||||||
readlocalannexconfig `catchNonAsync` (const $ return r)
|
return r
|
||||||
|
| otherwise = storeUpdatedRemote $
|
||||||
|
liftIO readlocalannexconfig
|
||||||
|
`catchNonAsync` const failedreadlocalconfig
|
||||||
where
|
where
|
||||||
haveconfig = not . M.null . Git.config
|
haveconfig = not . M.null . Git.config
|
||||||
|
|
||||||
|
@ -339,6 +342,13 @@ tryGitConfigRead autoinit r
|
||||||
s <- Annex.new r
|
s <- Annex.new r
|
||||||
Annex.eval s $ check `finally` stopCoProcesses
|
Annex.eval s $ check `finally` stopCoProcesses
|
||||||
|
|
||||||
|
failedreadlocalconfig = do
|
||||||
|
unless hasuuid $ case Git.remoteName r of
|
||||||
|
Nothing -> noop
|
||||||
|
Just n -> do
|
||||||
|
warning $ "Remote " ++ n ++ " cannot currently be accessed."
|
||||||
|
return r
|
||||||
|
|
||||||
configlistfields = if autoinit
|
configlistfields = if autoinit
|
||||||
then [(Fields.autoInit, "1")]
|
then [(Fields.autoInit, "1")]
|
||||||
else []
|
else []
|
||||||
|
@ -898,7 +908,7 @@ mkState r u gc = do
|
||||||
rv <- liftIO newEmptyMVar
|
rv <- liftIO newEmptyMVar
|
||||||
let getrepo = ifM (liftIO $ isEmptyMVar rv)
|
let getrepo = ifM (liftIO $ isEmptyMVar rv)
|
||||||
( do
|
( do
|
||||||
r' <- tryGitConfigRead False r
|
r' <- tryGitConfigRead False r True
|
||||||
let t = (r', extractGitConfig FromGitConfig r')
|
let t = (r', extractGitConfig FromGitConfig r')
|
||||||
void $ liftIO $ tryPutMVar rv t
|
void $ liftIO $ tryPutMVar rv t
|
||||||
return t
|
return t
|
||||||
|
|
|
@ -175,3 +175,6 @@ Already posted above
|
||||||
### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
|
### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)
|
||||||
|
|
||||||
Well... it did work for git's local protocol...
|
Well... it did work for git's local protocol...
|
||||||
|
|
||||||
|
> [[done]], this was not really a bug, but I have added a warning message
|
||||||
|
> --[[Joey]]
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 2"""
|
||||||
|
date="2020-05-04T16:13:02Z"
|
||||||
|
content="""
|
||||||
|
git-annex cannot possibly support operation over the git protocol, because
|
||||||
|
that protocol does not have any way to add an extension such as git-annex
|
||||||
|
to it.
|
||||||
|
|
||||||
|
So git-annex currently completely ignores git:// repositories, the same as
|
||||||
|
it would any git repository using some other foreign protocol.
|
||||||
|
(eg rsync or a protocol added by a git extension)
|
||||||
|
|
||||||
|
This is actually identical behavior to if the remote had "url =
|
||||||
|
/media/whatever" and the drive was unmounted after the repo was cloned.
|
||||||
|
git-annex is not able to discover a uuid for the remote, and so it does
|
||||||
|
not know the remote contains the content, and so it does not say anything
|
||||||
|
about not being able to get the content from the remote, because it
|
||||||
|
never tried. IOW, this is a "beware of the leopard" situation.
|
||||||
|
|
||||||
|
So, it would better for this to be handled the same way that a ssh remote
|
||||||
|
that lacks git-annex-shell is handled, by explicitly setting annex-ignore
|
||||||
|
on first use and displaying a warning. (Although it should not set
|
||||||
|
annex-ignore for the /media/whatever case, because the drive may later get
|
||||||
|
mounted again.)
|
||||||
|
"""]]
|
Loading…
Add table
Add a link
Reference in a new issue