convert checkAvailable to use availability rather than localpath

Every remote that sets localpath also implements an availability that
reutrns Unavailable when a local directory is not available.

This makes external remotes, and others that get support for
availability Unavailable to be used by checkAvailable. (Which is only
used by the assistant.)

Had to keep localpath though, since other parts of the assistant use it
to eg, sync with a remote when a removable drive is plugged in.

Sponsored-by: Jack Hill on Patreon
This commit is contained in:
Joey Hess 2023-08-16 15:57:30 -04:00
parent 7aac60769a
commit 83056e7b53
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
5 changed files with 11 additions and 8 deletions

View file

@ -59,11 +59,11 @@ import Control.Concurrent.Async
reconnectRemotes :: [Remote] -> Assistant ()
reconnectRemotes [] = recordExportCommit
reconnectRemotes rs = void $ do
rs' <- liftIO $ filterM (Remote.checkAvailable True) rs
rs' <- liftAnnex $ filterM (Remote.checkAvailable True) rs
unless (null rs') $ do
failedrs <- syncAction rs' (const go)
forM_ failedrs $ \r ->
whenM (liftIO $ Remote.checkAvailable False r) $
whenM (liftAnnex $ Remote.checkAvailable False r) $
repoHasProblem (Remote.uuid r) (syncRemote r)
mapM_ signal $ filter (`notElem` failedrs) rs'
recordExportCommit

View file

@ -51,7 +51,7 @@ exportThread = namedThread "Exporter" $ runEvery (Seconds 30) <~> do
- to avoid ugly messages when a removable drive is not attached.
-}
exportTargets :: Assistant [Remote]
exportTargets = liftIO . filterM (Remote.checkAvailable True)
exportTargets = liftAnnex . filterM (Remote.checkAvailable True)
=<< candidates <$> getDaemonStatus
where
candidates = filter (not . Remote.readonly) . exportRemotes

View file

@ -56,7 +56,7 @@ handleRemoteProblem urlrenderer rmt = do
handleRemoteProblem' :: Git.Repo -> UrlRenderer -> Remote -> Assistant Bool
handleRemoteProblem' repo urlrenderer rmt
| Git.repoIsLocal repo && not (Git.repoIsLocalUnknown repo) =
ifM (liftIO $ checkAvailable True rmt)
ifM (liftAnnex $ checkAvailable True rmt)
( do
fixedlocks <- repairStaleGitLocks repo
fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $

View file

@ -44,7 +44,7 @@ pushThread = namedThread "Pusher" $ runEvery (Seconds 2) <~> do
- to avoid ugly messages when a removable drive is not attached.
-}
pushTargets :: Assistant [Remote]
pushTargets = liftIO . filterM (Remote.checkAvailable True)
pushTargets = liftAnnex . filterM (Remote.checkAvailable True)
=<< candidates <$> getDaemonStatus
where
candidates = filter (not . Remote.readonly) . syncGitRemotes

View file

@ -411,9 +411,12 @@ byCost = map snd . sortBy (comparing fst) . M.toList . costmap
costmap = M.fromListWith (++) . map costpair
costpair r = (cost r, [r])
checkAvailable :: Bool -> Remote -> IO Bool
checkAvailable assumenetworkavailable =
maybe (return assumenetworkavailable) doesDirectoryExist . localpath
checkAvailable :: Bool -> Remote -> Annex Bool
checkAvailable assumenetworkavailable r = tryNonAsync (availability r) >>= \case
Left _e -> return assumenetworkavailable
Right LocallyAvailable -> return True
Right GloballyAvailable -> return assumenetworkavailable
Right Unavailable -> return False
hasKey :: Remote -> Key -> Annex (Either String Bool)
hasKey r k = either (Left . show) Right <$> tryNonAsync (checkPresent r k)