From 66ccc37a99994f1206d308c0c0003ac2605d3c42 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 20 Oct 2013 17:50:51 -0400 Subject: git-recover-repository 1/2 done --- git-recover-repository.hs | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 git-recover-repository.hs (limited to 'git-recover-repository.hs') diff --git a/git-recover-repository.hs b/git-recover-repository.hs new file mode 100644 index 000000000..6654057fa --- /dev/null +++ b/git-recover-repository.hs @@ -0,0 +1,73 @@ +{- git-recover-repository program + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +import System.Environment +import System.Log.Logger +import System.Log.Formatter +import System.Log.Handler (setFormatter) +import System.Log.Handler.Simple +import qualified Data.Set as S + +import Common +import qualified Git.CurrentRepo +import qualified Git.RecoverRepository +import qualified Git.Config + +header :: String +header = "Usage: git-recover-repository" + +usage :: a +usage = error $ "bad parameters\n\n" ++ header + +parseArgs :: IO Bool +parseArgs = do + args <- getArgs + return $ or $ map parse args + where + parse "--force" = True + parse _ = usage + +enableDebugOutput :: IO () +enableDebugOutput = do + s <- setFormatter + <$> streamHandler stderr NOTICE + <*> pure (simpleLogFormatter "$msg") + updateGlobalLogger rootLoggerName (setLevel DEBUG . setHandlers [s]) + +main :: IO () +main = do + enableDebugOutput + forced <- parseArgs + + g <- Git.Config.read =<< Git.CurrentRepo.get + missing <- Git.RecoverRepository.cleanCorruptObjects g + stillmissing <- Git.RecoverRepository.retrieveMissingObjects missing g + if S.null stillmissing + then putStr $ unlines + [ "Successfully recovered repository!" + , "You should run \"git fsck\" to make sure, but it looks like" + , "everything was recovered ok." + ] + else do + putStrLn $ unwords + [ show (S.size stillmissing) + , "missing objects could not be recovered!" + ] + if forced + then do + remotebranches <- Git.RecoverRepository.removeTrackingBranches stillmissing g + unless (null remotebranches) $ + putStrLn $ unwords + [ "removed" + , show (length remotebranches) + , "remote tracking branches that referred to missing objects" + ] + localbranches <- Git.RecoverRepository.resetLocalBranches stillmissing g + unless (null localbranches) $ do + putStrLn "Reset these local branches to old versions before the missing objects were committed:" + putStr $ unlines $ map show localbranches + else putStrLn "To force a recovery to a usable state, run this command again with the --force parameter." -- cgit v1.2.3