fix uninit to delete content from annex when it ended up hard linked back to the work tree

This commit is contained in:
Joey Hess 2013-07-18 13:30:12 -04:00
parent 4b16ffd9f1
commit 3e422cb5fa
2 changed files with 27 additions and 4 deletions

View file

@ -1,6 +1,6 @@
{- git-annex file content managing
-
- Copyright 2010,2012 Joey Hess <joey@kitenet.net>
- Copyright 2010-2013 Joey Hess <joey@kitenet.net>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@ -10,6 +10,7 @@
module Annex.Content (
inAnnex,
inAnnexSafe,
inAnnexCheck,
lockContent,
getViaTmp,
getViaTmpChecked,
@ -56,7 +57,11 @@ import Annex.ReplaceFile
{- Checks if a given key's content is currently present. -}
inAnnex :: Key -> Annex Bool
inAnnex = inAnnex' id False $ liftIO . doesFileExist
inAnnex key = inAnnexCheck key $ liftIO . doesFileExist
{- Runs an arbitrary check on a key's content. -}
inAnnexCheck :: Key -> (FilePath -> Annex Bool) -> Annex Bool
inAnnexCheck key check = inAnnex' id False check key
{- Generic inAnnex, handling both indirect and direct mode.
-

View file

@ -63,8 +63,8 @@ start :: CommandStart
start = next $ next $ do
annexdir <- fromRepo gitAnnexDir
annexobjectdir <- fromRepo gitAnnexObjectDir
present <- getKeysPresent
if null present
leftovers <- removeUnannexed =<< getKeysPresent
if null leftovers
then liftIO $ removeDirectoryRecursive annexdir
else error $ unlines
[ "Not fully uninitialized"
@ -89,3 +89,21 @@ start = next $ next $ do
inRepo $ Git.Command.run
[Param "branch", Param "-D", Param $ show Annex.Branch.name]
liftIO exitSuccess
{- Keys that were moved out of the annex have a hard link still in the
- annex, with > 1 link count, and those can be removed.
-
- Returns keys that cannot be removed. -}
removeUnannexed :: [Key] -> Annex [Key]
removeUnannexed = go []
where
go c [] = return c
go c (k:ks) = ifM (inAnnexCheck k $ liftIO . enoughlinks)
( do
removeAnnex k
go c ks
, go (k:c) ks
)
enoughlinks f = do
s <- getFileStatus f
return $ linkCount s > 1