diff --git a/CHANGELOG b/CHANGELOG index 5f5d3f034b..edd05ef07d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,7 +10,7 @@ git-annex (10.20230803) UNRELEASED; urgency=medium * Stop bundling curl in the OSX dmg and linux standalone image. * sync, assist, push, pull: Skip more types of remotes when they are not present due to eg being on a drive that is offline. - (directory, borg, bup, ddar, rsync) + (directory, borg, bup, ddar, gcrypt, rsync) * info: Added available to the info displayed for a remote. * Added AVAILABILITY UNAVAILABLE and the UNAVAILABLERESPONSE extension to the external special remote protocol. diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs index bf8f01ed3e..213265dfa2 100644 --- a/Remote/GCrypt.hs +++ b/Remote/GCrypt.hs @@ -158,7 +158,7 @@ gen' r u c gc rs = do , readonly = Git.repoIsHttp r , appendonly = False , untrustworthy = False - , availability = pure (availabilityCalc r) + , availability = repoAvail r , remotetype = remote , mkUnavailable = return Nothing , getInfo = gitRepoInfo this diff --git a/Remote/Git.hs b/Remote/Git.hs index d4708e40fa..56d85a01c3 100644 --- a/Remote/Git.hs +++ b/Remote/Git.hs @@ -231,26 +231,6 @@ unavailable r = gen r' Nothing -> r { Git.location = Git.Unknown } _ -> r -- already unavailable -{- Checks relatively inexpensively if a repository is available for use. -} -repoAvail :: Git.Repo -> Annex Availability -repoAvail r - | Git.repoIsHttp r = return GloballyAvailable - | Git.GCrypt.isEncrypted r = do - g <- gitRepo - liftIO $ do - er <- Git.GCrypt.encryptedRemote g r - if Git.repoIsLocal er || Git.repoIsLocalUnknown er - then checklocal er - else return GloballyAvailable - | Git.repoIsUrl r = return GloballyAvailable - | Git.repoIsLocalUnknown r = return Unavailable - | otherwise = checklocal r - where - checklocal r' = ifM (liftIO $ isJust <$> catchMaybeIO (Git.Config.read r')) - ( return LocallyAvailable - , return Unavailable - ) - {- Tries to read the config for a specified remote, updates state, and - returns the updated repo. -} tryGitConfigRead :: Bool -> Git.Repo -> Bool -> Annex Git.Repo diff --git a/Remote/Helper/Git.hs b/Remote/Helper/Git.hs index 8df181297f..ccefb231ea 100644 --- a/Remote/Helper/Git.hs +++ b/Remote/Helper/Git.hs @@ -9,9 +9,11 @@ module Remote.Helper.Git where import Annex.Common import qualified Git +import qualified Git.GCrypt import Types.Availability import qualified Types.Remote as Remote import qualified Utility.RawFilePath as R +import qualified Git.Config import Data.Time.Clock.POSIX import System.PosixCompat.Files (modificationTime) @@ -24,10 +26,25 @@ localpathCalc r | not (Git.repoIsLocal r) && not (Git.repoIsLocalUnknown r) = Nothing | otherwise = Just $ fromRawFilePath $ Git.repoPath r -availabilityCalc :: Git.Repo -> Availability -availabilityCalc r - | (Git.repoIsLocal r || Git.repoIsLocalUnknown r) = LocallyAvailable - | otherwise = GloballyAvailable +{- Checks relatively inexpensively if a repository is available for use. -} +repoAvail :: Git.Repo -> Annex Availability +repoAvail r + | Git.repoIsHttp r = return GloballyAvailable + | Git.GCrypt.isEncrypted r = do + g <- gitRepo + liftIO $ do + er <- Git.GCrypt.encryptedRemote g r + if Git.repoIsLocal er || Git.repoIsLocalUnknown er + then checklocal er + else return GloballyAvailable + | Git.repoIsUrl r = return GloballyAvailable + | Git.repoIsLocalUnknown r = return Unavailable + | otherwise = checklocal r + where + checklocal r' = ifM (liftIO $ isJust <$> catchMaybeIO (Git.Config.read r')) + ( return LocallyAvailable + , return Unavailable + ) {- Avoids performing an action on a local repository that's not usable. - Does not check that the repository is still available on disk. -}