safer inannex checking
git-annex-shell inannex now returns always 0, 1, or 100 (the last when it's unclear if content is currently in the index due to it currently being moved or dropped). (Actual locking code still not yet written.)
This commit is contained in:
parent
2934a65ac5
commit
d3e1a3619f
14 changed files with 93 additions and 50 deletions
|
@ -139,17 +139,21 @@ remove _ = do
|
|||
- in a bup repository. One way it to check if the git repository has
|
||||
- a branch matching the name (as created by bup split -n).
|
||||
-}
|
||||
checkPresent :: Git.Repo -> Git.Repo -> Key -> Annex (Either IOException Bool)
|
||||
checkPresent :: Git.Repo -> Git.Repo -> Key -> Annex (Either String Bool)
|
||||
checkPresent r bupr k
|
||||
| Git.repoIsUrl bupr = do
|
||||
showAction $ "checking " ++ Git.repoDescribe r
|
||||
ok <- onBupRemote bupr boolSystem "git" params
|
||||
return $ Right ok
|
||||
| otherwise = liftIO $ try $ boolSystem "git" $ Git.gitCommandLine params bupr
|
||||
| otherwise = dispatch <$> localcheck
|
||||
where
|
||||
params =
|
||||
[ Params "show-ref --quiet --verify"
|
||||
, Param $ "refs/heads/" ++ show k]
|
||||
localcheck = liftIO $ try $
|
||||
boolSystem "git" $ Git.gitCommandLine params bupr
|
||||
dispatch (Left e) = Left $ show e
|
||||
dispatch (Right v) = Right v
|
||||
|
||||
{- Store UUID in the annex.uuid setting of the bup repository. -}
|
||||
storeBupUUID :: UUID -> BupRepo -> Annex ()
|
||||
|
|
|
@ -114,5 +114,9 @@ remove d k = liftIO $ catchBool $ do
|
|||
file = dirKey d k
|
||||
dir = parentDir file
|
||||
|
||||
checkPresent :: FilePath -> Key -> Annex (Either IOException Bool)
|
||||
checkPresent d k = liftIO $ try $ doesFileExist (dirKey d k)
|
||||
checkPresent :: FilePath -> Key -> Annex (Either String Bool)
|
||||
checkPresent d k = dispatch <$> check
|
||||
where
|
||||
check = liftIO $ try $ doesFileExist (dirKey d k)
|
||||
dispatch (Left e) = Left $ show e
|
||||
dispatch (Right v) = Right v
|
||||
|
|
|
@ -125,22 +125,38 @@ tryGitConfigRead r
|
|||
else old : exchange ls new
|
||||
|
||||
{- Checks if a given remote has the content for a key inAnnex.
|
||||
- If the remote cannot be accessed, returns a Left error.
|
||||
- If the remote cannot be accessed, or if it cannot determine
|
||||
- whether it has the content, returns a Left error message.
|
||||
-}
|
||||
inAnnex :: Git.Repo -> Key -> Annex (Either IOException Bool)
|
||||
inAnnex :: Git.Repo -> Key -> Annex (Either String Bool)
|
||||
inAnnex r key
|
||||
| Git.repoIsHttp r = safely checkhttp
|
||||
| Git.repoIsHttp r = checkhttp
|
||||
| Git.repoIsUrl r = checkremote
|
||||
| otherwise = safely checklocal
|
||||
| otherwise = checklocal
|
||||
where
|
||||
checklocal = onLocal r $ Annex.Content.inAnnex key
|
||||
checkhttp = dispatch <$> check
|
||||
where
|
||||
check = safely $ Url.exists $ keyUrl r key
|
||||
dispatch (Left e) = Left $ show e
|
||||
dispatch (Right v) = Right v
|
||||
checkremote = do
|
||||
showAction $ "checking " ++ Git.repoDescribe r
|
||||
inannex <- onRemote r (boolSystem, False) "inannex"
|
||||
[Param (show key)]
|
||||
return $ Right inannex
|
||||
checkhttp = Url.exists $ keyUrl r key
|
||||
safely a = liftIO (try a ::IO (Either IOException Bool))
|
||||
onRemote r (check, unknown) "inannex" [Param (show key)]
|
||||
where
|
||||
check c p = dispatch <$> safeSystem c p
|
||||
dispatch ExitSuccess = Right True
|
||||
dispatch (ExitFailure 1) = Right False
|
||||
dispatch _ = unknown
|
||||
checklocal = dispatch <$> check
|
||||
where
|
||||
check = safely $ onLocal r $
|
||||
Annex.Content.inAnnexSafe key
|
||||
dispatch (Left e) = Left $ show e
|
||||
dispatch (Right (Just b)) = Right b
|
||||
dispatch (Right Nothing) = unknown
|
||||
safely :: IO a -> Annex (Either IOException a)
|
||||
safely a = liftIO $ try a
|
||||
unknown = Left $ "unable to check " ++ Git.repoDescribe r
|
||||
|
||||
{- Runs an action on a local repository inexpensively, by making an annex
|
||||
- monad using that repository. -}
|
||||
|
|
|
@ -119,14 +119,16 @@ retrieveEncrypted h (cipher, enck) f = withTmp enck $ \tmp ->
|
|||
remove :: String -> Key -> Annex Bool
|
||||
remove h k = runHook h "remove" k Nothing $ return True
|
||||
|
||||
checkPresent :: Git.Repo -> String -> Key -> Annex (Either IOException Bool)
|
||||
checkPresent :: Git.Repo -> String -> Key -> Annex (Either String Bool)
|
||||
checkPresent r h k = do
|
||||
showAction $ "checking " ++ Git.repoDescribe r
|
||||
v <- lookupHook h "checkpresent"
|
||||
liftIO (try (check v) ::IO (Either IOException Bool))
|
||||
dispatch <$> liftIO (try (check v) ::IO (Either IOException Bool))
|
||||
where
|
||||
findkey s = show k `elem` lines s
|
||||
env = hookEnv k Nothing
|
||||
dispatch (Left e) = Left $ show e
|
||||
dispatch (Right v) = Right v
|
||||
check Nothing = error "checkpresent hook misconfigured"
|
||||
check (Just hook) = do
|
||||
(frompipe, topipe) <- createPipe
|
||||
|
|
|
@ -128,7 +128,7 @@ remove o k = withRsyncScratchDir $ \tmp -> do
|
|||
, Param $ rsyncKeyDir o k
|
||||
]
|
||||
|
||||
checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either IOException Bool)
|
||||
checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either String Bool)
|
||||
checkPresent r o k = do
|
||||
showAction $ "checking " ++ Git.repoDescribe r
|
||||
-- note: Does not currently differnetiate between rsync failing
|
||||
|
|
|
@ -172,7 +172,7 @@ remove r k = s3Action r False $ \(conn, bucket) -> do
|
|||
res <- liftIO $ deleteObject conn $ bucketKey r bucket k
|
||||
s3Bool res
|
||||
|
||||
checkPresent :: Remote Annex -> Key -> Annex (Either IOException Bool)
|
||||
checkPresent :: Remote Annex -> Key -> Annex (Either String Bool)
|
||||
checkPresent r k = s3Action r noconn $ \(conn, bucket) -> do
|
||||
showAction $ "checking " ++ name r
|
||||
res <- liftIO $ getObjectInfo conn $ bucketKey r bucket k
|
||||
|
|
|
@ -64,7 +64,7 @@ dropKey _ = do
|
|||
warning "removal from web not supported"
|
||||
return False
|
||||
|
||||
checkKey :: Key -> Annex (Either IOException Bool)
|
||||
checkKey :: Key -> Annex (Either String Bool)
|
||||
checkKey key = do
|
||||
us <- getUrls key
|
||||
if null us
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue