From 9ed8dd6be036e79e3ec7f5781b9f7b8864e1bc0e Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 23 Oct 2013 13:13:40 -0400 Subject: minor --- Git/Repair.hs | 109 +++++++++++++++++++++++++++++++--------------------------- 1 file changed, 59 insertions(+), 50 deletions(-) (limited to 'Git') diff --git a/Git/Repair.hs b/Git/Repair.hs index bb540fbd7..cc54e49dc 100644 --- a/Git/Repair.hs +++ b/Git/Repair.hs @@ -421,64 +421,73 @@ displayList items header | otherwise = items {- Put it all together. -} -runRepair :: Bool -> Repo -> IO (Bool, MissingObjects) +runRepair :: Bool -> Repo -> IO (Bool, MissingObjects, [Branch]) runRepair forced g = do putStrLn "Running git fsck ..." fsckresult <- findBroken False g - missing <- cleanCorruptObjects fsckresult g - stillmissing <- retrieveMissingObjects missing g - if S.null stillmissing - then successfulfinish stillmissing + if foundBroken fsckresult + then makerepairs fsckresult else do + putStrLn "No problems found." + return (True, S.empty, []) + where + makerepairs fsckresult = do + missing <- cleanCorruptObjects fsckresult g + stillmissing <- retrieveMissingObjects missing g + if S.null stillmissing + then successfulfinish stillmissing [] + else do + putStrLn $ unwords + [ show (S.size stillmissing) + , "missing objects could not be recovered!" + ] + if forced + then continuerepairs stillmissing + else unsuccessfulfinish stillmissing + continuerepairs stillmissing = do + (remotebranches, goodcommits) <- removeTrackingBranches stillmissing emptyGoodCommits g + unless (null remotebranches) $ putStrLn $ unwords - [ show (S.size stillmissing) - , "missing objects could not be recovered!" + [ "removed" + , show (length remotebranches) + , "remote tracking branches that referred to missing objects" ] - if forced - then do - (remotebranches, goodcommits) <- removeTrackingBranches stillmissing emptyGoodCommits g - unless (null remotebranches) $ - putStrLn $ unwords - [ "removed" - , show (length remotebranches) - , "remote tracking branches that referred to missing objects" - ] - (resetbranches, deletedbranches, _) <- resetLocalBranches stillmissing goodcommits g - displayList (map show resetbranches) - "Reset these local branches to old versions before the missing objects were committed:" - displayList (map show deletedbranches) - "Deleted these local branches, which could not be recovered due to missing objects:" - deindexedfiles <- rewriteIndex stillmissing g - displayList deindexedfiles - "Removed these missing files from the index. You should look at what files are present in your working tree and git add them back to the index when appropriate." - if null resetbranches && null deletedbranches - then successfulfinish stillmissing - else do - unless (repoIsLocalBare g) $ do - mcurr <- Branch.currentUnsafe g - case mcurr of - Nothing -> return () - Just curr -> when (any (== curr) (resetbranches ++ deletedbranches)) $ do - putStrLn $ unwords - [ "You currently have" - , show curr - , "checked out. You may have staged changes in the index that can be committed to recover the lost state of this branch!" - ] - putStrLn "Successfully recovered repository!" - putStrLn "Please carefully check that the changes mentioned above are ok.." - return (True, stillmissing) - else do - if repoIsLocalBare g - then do - putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and re-run git-recover-repository." - putStrLn "If there are no clones of this repository, you can instead run git-recover-repository with the --force parameter to force recovery to a possibly usable state." - else putStrLn "To force a recovery to a usable state, run this command again with the --force parameter." - return (False, stillmissing) - where - successfulfinish stillmissing = do + (resetbranches, deletedbranches, _) <- resetLocalBranches stillmissing goodcommits g + displayList (map show resetbranches) + "Reset these local branches to old versions before the missing objects were committed:" + displayList (map show deletedbranches) + "Deleted these local branches, which could not be recovered due to missing objects:" + deindexedfiles <- rewriteIndex stillmissing g + displayList deindexedfiles + "Removed these missing files from the index. You should look at what files are present in your working tree and git add them back to the index when appropriate." + let modifiedbranches = resetbranches ++ deletedbranches + if null resetbranches && null deletedbranches + then successfulfinish stillmissing modifiedbranches + else do + unless (repoIsLocalBare g) $ do + mcurr <- Branch.currentUnsafe g + case mcurr of + Nothing -> return () + Just curr -> when (any (== curr) modifiedbranches) $ do + putStrLn $ unwords + [ "You currently have" + , show curr + , "checked out. You may have staged changes in the index that can be committed to recover the lost state of this branch!" + ] + putStrLn "Successfully recovered repository!" + putStrLn "Please carefully check that the changes mentioned above are ok.." + return (True, stillmissing, modifiedbranches) + successfulfinish stillmissing modifiedbranches = do mapM_ putStrLn [ "Successfully recovered repository!" , "You should run \"git fsck\" to make sure, but it looks like" , "everything was recovered ok." ] - return (True, stillmissing) + return (True, stillmissing, modifiedbranches) + unsuccessfulfinish stillmissing = do + if repoIsLocalBare g + then do + putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and re-run git-recover-repository." + putStrLn "If there are no clones of this repository, you can instead run git-recover-repository with the --force parameter to force recovery to a possibly usable state." + else putStrLn "To force a recovery to a usable state, run this command again with the --force parameter." + return (False, stillmissing, []) -- cgit v1.2.3