repair command: add handling of git-annex branch and index

This commit is contained in:
Joey Hess 2013-10-23 12:58:01 -04:00
parent d5eb85acf4
commit 435ea52f3c
6 changed files with 100 additions and 41 deletions

View file

@ -10,7 +10,9 @@ module Command.Repair where
import Common.Annex
import Command
import qualified Annex
import Git.RecoverRepository (runRecovery)
import qualified Git.Repair
import qualified Annex.Branch
import Git.Fsck (MissingObjects)
def :: [Command]
def = [noCommit $ dontCheck repoExists $
@ -20,6 +22,37 @@ seek :: [CommandSeek]
seek = [withNothing start]
start :: CommandStart
start = next $ next $ do
force <- Annex.getState Annex.force
inRepo $ runRecovery force
start = next $ next $ runRepair =<< Annex.getState Annex.force
runRepair :: Bool -> Annex Bool
runRepair forced = do
(ok, stillmissing) <- inRepo $ Git.Repair.runRepair forced
when ok $
repairAnnexBranch stillmissing
return ok
{- After git repository repair, the .git/annex/index file could
- still be broken, by pointing to bad objects, or might just be corrupt on
- its own. Since this index file is not used to stage things
- for long durations of time, it can safely be deleted if it is broken.
-
- Otherwise, commit the index file to the git-annex branch.
- This way, if the git-annex branch got rewound to an old version by
- the repository repair, or was completely deleted, this will get it back
- to a good state. Note that in the unlikely case where the git-annex
- branch is ok, and has new changes from elsewhere not yet reflected in
- the index, this does properly merge those into the index before
- committing.
-}
repairAnnexBranch :: MissingObjects -> Annex ()
repairAnnexBranch missing = ifM okindex
( do
Annex.Branch.forceCommit "committing index after git repository repair"
liftIO $ putStrLn "Successfully recovered the git-annex branch using .git/annex/index"
, do
inRepo $ nukeFile . gitAnnexIndex
liftIO $ putStrLn "Had to delete the .git/annex/index file as it was corrupt. It would be a very good idea to run: git annex fsck --fast"
)
where
okindex = Annex.Branch.withIndex $
inRepo $ Git.Repair.checkIndex missing