summaryrefslogtreecommitdiff
path: root/Git
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2013-10-20 19:42:17 -0400
committerGravatar Joey Hess <joey@kitenet.net>2013-10-20 19:42:17 -0400
commit1f7604f7d9df831012893a9ee2b4a8be20fe02ab (patch)
treeaff7a76077e7b888e6b479348a8480fc3f89c6f9 /Git
parent953dc1432c7eb1eb778766d0f17876428ced14d4 (diff)
avoid redundant fsck when no changes are made
Diffstat (limited to 'Git')
-rw-r--r--Git/RecoverRepository.hs52
1 files changed, 33 insertions, 19 deletions
diff --git a/Git/RecoverRepository.hs b/Git/RecoverRepository.hs
index 53fbf0ce7..aad78d0dd 100644
--- a/Git/RecoverRepository.hs
+++ b/Git/RecoverRepository.hs
@@ -45,20 +45,24 @@ cleanCorruptObjects r = do
check =<< findBroken r
where
check Nothing = do
- notice "git fsck found a problem but no specific broken objects. Perhaps a corrupt pack file? Unpacking all pack files."
- explodePacks r
- retry S.empty
+ notice "git fsck found a problem but no specific broken objects. Perhaps a corrupt pack file?"
+ ifM (explodePacks r)
+ ( retry S.empty
+ , return S.empty
+ )
check (Just bad)
| S.null bad = return S.empty
| otherwise = do
notice $ unwords
[ "git fsck found"
, show (S.size bad)
- , "broken objects. Unpacking all pack files."
+ , "broken objects."
]
- explodePacks r
- removeLoose r bad
- retry bad
+ exploded <- explodePacks r
+ removed <- removeLoose r bad
+ if exploded || removed
+ then retry bad
+ else return bad
retry oldbad = do
notice "Re-running git fsck to see if it finds more problems."
v <- findBroken r
@@ -69,26 +73,36 @@ cleanCorruptObjects r = do
, "corrupt objects."
]
Just newbad -> do
- removeLoose r newbad
+ removed <- removeLoose r newbad
let s = S.union oldbad newbad
- if s == oldbad
+ if not removed || s == oldbad
then return s
else retry s
-removeLoose :: Repo -> S.Set Sha -> IO ()
+removeLoose :: Repo -> S.Set Sha -> IO Bool
removeLoose r s = do
let fs = map (looseObjectFile r) (S.toList s)
count <- length <$> filterM doesFileExist fs
- when (count > 0) $ do
- notice $ unwords
- [ "removing"
- , show count
- , "corrupt loose objects"
- ]
- mapM_ nukeFile fs
+ if (count > 0)
+ then do
+ notice $ unwords
+ [ "removing"
+ , show count
+ , "corrupt loose objects"
+ ]
+ mapM_ nukeFile fs
+ return True
+ else return False
-explodePacks :: Repo -> IO ()
-explodePacks r = mapM_ go =<< listPackFiles r
+explodePacks :: Repo -> IO Bool
+explodePacks r = do
+ packs <- listPackFiles r
+ if null packs
+ then return False
+ else do
+ notice "Unpacking all pack files."
+ mapM_ go packs
+ return True
where
go packfile = do
-- May fail, if pack file is corrupt.