2013-10-23 16:21:59 +00:00
{- git - annex command
-
- Copyright 2013 Joey Hess < joey @ kitenet . net >
-
- Licensed under the GNU GPL version 3 or higher .
- }
module Command.Repair where
import Common.Annex
import Command
import qualified Annex
2013-10-23 16:58:01 +00:00
import qualified Git.Repair
import qualified Annex.Branch
2013-10-23 17:13:40 +00:00
import Git.Types
2013-10-23 19:07:55 +00:00
import Annex.Version
2013-10-23 16:21:59 +00:00
def :: [ Command ]
def = [ noCommit $ dontCheck repoExists $
command " repair " paramNothing seek SectionMaintenance " recover broken git repository " ]
seek :: [ CommandSeek ]
seek = [ withNothing start ]
start :: CommandStart
2013-10-23 16:58:01 +00:00
start = next $ next $ runRepair =<< Annex . getState Annex . force
runRepair :: Bool -> Annex Bool
runRepair forced = do
2013-12-10 19:40:01 +00:00
( ok , modifiedbranches ) <- inRepo $
2013-12-10 20:17:49 +00:00
Git . Repair . runRepair isAnnexSyncBranch forced
2013-10-23 19:07:55 +00:00
-- This command can be run in git repos not using git-annex,
-- so avoid git annex branch stuff in that case.
whenM ( isJust <$> getVersion ) $
2013-12-10 19:40:01 +00:00
repairAnnexBranch modifiedbranches
2013-10-23 16:58:01 +00:00
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 .
-
2013-10-23 17:13:40 +00:00
- Otherwise , if the git - annex branch was modified by the repair ,
- commit the index file to the git - annex branch .
2013-10-23 16:58:01 +00:00
- 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
2013-10-23 17:13:40 +00:00
- branch was rewound to a state that , had new changes from elsewhere not
- yet reflected in the index , this does properly merge those into the
- index before committing .
2013-10-23 16:58:01 +00:00
- }
2013-12-10 19:40:01 +00:00
repairAnnexBranch :: [ Branch ] -> Annex ()
repairAnnexBranch modifiedbranches
2013-10-23 17:13:40 +00:00
| Annex . Branch . fullname ` elem ` modifiedbranches = ifM okindex
( commitindex
, do
nukeindex
liftIO $ putStrLn " Had to delete the .git/annex/index file as it was corrupt. Since the git-annex branch is not up-to-date anymore. It would be a very good idea to run: git annex fsck --fast "
)
| otherwise = ifM okindex
( noop
, nukeindex
)
2013-10-23 16:58:01 +00:00
where
2013-12-10 19:40:01 +00:00
okindex = Annex . Branch . withIndex $ inRepo $ Git . Repair . checkIndex
2013-10-23 17:13:40 +00:00
commitindex = do
Annex . Branch . forceCommit " committing index after git repository repair "
liftIO $ putStrLn " Successfully recovered the git-annex branch using .git/annex/index "
nukeindex = inRepo $ nukeFile . gitAnnexIndex
2013-12-10 20:17:49 +00:00
trackingOrSyncBranch :: Ref -> Bool
trackingOrSyncBranch b = Git . Repair . isTrackingBranch b || isAnnexSyncBranch b
isAnnexSyncBranch :: Ref -> Bool
isAnnexSyncBranch b = " refs/synced/ " ` isPrefixOf ` show b