fix bug involving local git remote and out of date location log

get --from, move --from: When used with a local git remote, these used to
silently skip files that the location log thought were present on the
remote, when the remote actually no longer contained them. Since that
behavior could be surprising, now instead display a warning.

I got very confused when I encountered this behavior, since it was silently
skipping a file I needed that whereis said was on the remote.

get without --from already displayed a "unable to access these remotes"
message, which while a bit misleading in that the remote is likely
accessible, but just doesn't contain the file, at least indicated something
went wrong.

Having get --from display a warning makes it in line with get
w/o --from, so seems certianly ok. It might be there are situations where
move --from is used, on eg a whole directory, and the user only wants to
move whatever is present in the remote, and is perfectly ok with files
that are not present being skipped. So I'm less sure about the new warning
being ok there. OTOH, only local git remotes avoiding displaying a warning
in that case too, so this just brings them into line with other remotes.

(Also note that this makes it a little bit faster when dealing with a lot of
files, since it avoids a redundant stat of the file.)
This commit is contained in:
Joey Hess 2020-04-21 12:36:58 -04:00
parent 2f87c6db79
commit cd1676d604
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
4 changed files with 13 additions and 11 deletions

View file

@ -19,6 +19,10 @@ git-annex (8.20200331) UNRELEASED; urgency=medium
with a large -J value.
* Avoid running with more git check-attr and check-ignore processes than
there are CPU cores when run with a large -J value.
* get --from, move --from: When used with a local git remote, these used
to silently skip files that the location log thought were present on the
remote, when the remote actually no longer contained them. Since that
behavior could be surprising, now instead display a warning.
-- Joey Hess <id@joeyh.name> Mon, 30 Mar 2020 15:58:34 -0400

View file

@ -187,16 +187,10 @@ fromStart removewhen afile key ai src = case removewhen of
fromPerform src removewhen key afile
fromOk :: Remote -> Key -> Annex Bool
fromOk src key
| Remote.hasKeyCheap src =
either (const checklog) return =<< haskey
| otherwise = checklog
where
haskey = Remote.hasKey src key
checklog = do
u <- getUUID
remotes <- Remote.keyPossibilities key
return $ u /= Remote.uuid src && elem src remotes
fromOk src key = do
u <- getUUID
remotes <- Remote.keyPossibilities key
return $ u /= Remote.uuid src && elem src remotes
fromPerform :: Remote -> RemoveWhen -> Key -> AssociatedFile -> CommandPerform
fromPerform src removewhen key afile = do

View file

@ -527,7 +527,9 @@ copyFromRemote'' repo forcersync r st@(State connpool _ _ _ _) key file dest met
onLocalFast st $ do
v <- Annex.Content.prepSendAnnex key
case v of
Nothing -> return (False, UnVerified)
Nothing -> do
warning "content is not present in remote"
return (False, UnVerified)
Just (object, checksuccess) -> do
copier <- mkCopier hardlink st params
runTransfer (Transfer Download u (fromKey id key))

View file

@ -5,3 +5,5 @@ anything.
(This happened with a git remote on a drive fwiw).
--[[Joey]]
> [[fixed|done]] --[[Joey]]