Fix checking when content is present in a non-bare repository accessed via http.

I thought at first this was a Windows specific problem, but it's not;
this affects checking any non-bare repository exported via http. Which is
a potentially important use case!

The actual bug was the case where Right False was returned by the first url
short-curcuited later checks. But the whole method used felt like code
I'd no longer write, and the use of undefined was particularly disgusting.
So I rewrote it.

Also added an action display.

This commit was sponsored by Eric Hanchrow. Thanks!
This commit is contained in:
Joey Hess 2013-07-18 14:11:56 -04:00
parent 3e422cb5fa
commit d2f40d3d76
3 changed files with 12 additions and 10 deletions

View file

@ -228,17 +228,14 @@ inAnnex r key
| Git.repoIsUrl r = checkremote
| otherwise = checklocal
where
checkhttp headers = liftIO $ go undefined $ keyUrls r key
where
go e [] = return $ Left e
go _ (u:us) = do
res <- catchMsgIO $
Url.check u headers (keySize key)
case res of
Left e -> go e us
v -> return v
checkhttp headers = do
showchecking
liftIO $ ifM (anyM (\u -> Url.check u headers (keySize key)) (keyUrls r key))
( return $ Right True
, return $ Left "not found"
)
checkremote = do
showAction $ "checking " ++ Git.repoDescribe r
showchecking
onRemote r (check, unknown) "inannex" [Param (key2file key)] []
where
check c p = dispatch <$> safeSystem c p
@ -253,6 +250,7 @@ inAnnex r key
dispatch (Right (Just b)) = Right b
dispatch (Right Nothing) = unknown
unknown = Left $ "unable to check " ++ Git.repoDescribe r
showchecking = showAction $ "checking " ++ Git.repoDescribe r
{- Runs an action on a local repository inexpensively, by making an annex
- monad using that repository. -}

2
debian/changelog vendored
View file

@ -11,6 +11,8 @@ git-annex (4.20130710) UNRELEASED; urgency=low
are not deleted. Print a message with some suggested actions.
* When a transfer is already being run by another process,
proceed on to the next file, rather than dying.
* Fix checking when content is present in a non-bare repository
accessed via http.
-- Joey Hess <joeyh@debian.org> Tue, 09 Jul 2013 19:17:13 -0400

View file

@ -35,3 +35,5 @@ git-annex: drop: 1 failed
the given curl command fails with a 404, because the remote annex isn't using the 3-character hash directory scheme, but the 2-character one, and it seems that 'annex drop' doesn't check both schemes (unlike annex get).
> Ah, the http remote is a non-bare repository, that's why.
> Ok, [[fixed|done]]! --[[Joey]]