unannex: New, much slower, but more safe behavior

Copies files out of the annex. This avoids an unannex of one file breaking
other files that link to the same content. Also, it means that the content
remains in the annex using up space until cleaned up with  "git annex
unused".

(The behavior of unannex --fast has not changed; it still hard
links to content in the annex. --fast was not made the default because it
is potentially unsafe; editing such a hard linked file can unexpectedly
change content stored in the annex.)
This commit is contained in:
Joey Hess 2013-10-28 16:56:01 -04:00
parent d16d71ce86
commit 0eff0dd910
6 changed files with 41 additions and 31 deletions

View file

@ -13,11 +13,11 @@ import Common.Annex
import Command
import Config
import qualified Annex
import Logs.Location
import Annex.Content
import Annex.Content.Direct
import qualified Git.Command
import qualified Git.LsFiles as LsFiles
import Utility.CopyFile
def :: [Command]
def = [command "unannex" paramPaths seek SectionUtility
@ -60,28 +60,24 @@ performIndirect file key = do
cleanupIndirect :: FilePath -> Key -> CommandCleanup
cleanupIndirect file key = do
src <- calcRepo $ gitAnnexLocation key
ifM (Annex.getState Annex.fast)
( goFast
, go
( hardlinkfrom src
, copyfrom src
)
return True
where
#ifdef mingw32_HOST_OS
goFast = go
#else
goFast = do
-- fast mode: hard link to content in annex
src <- calcRepo $ gitAnnexLocation key
-- creating a hard link could fall; fall back to non fast mode
copyfrom src =
thawContent file `after` liftIO (copyFileExternal src file)
hardlinkfrom src =
#ifndef mingw32_HOST_OS
-- creating a hard link could fall; fall back to copying
ifM (liftIO $ catchBoolIO $ createLink src file >> return True)
( thawContent file
, go
( return True
, copyfrom src
)
#else
copyfrom src
#endif
go = do
fromAnnex key file
logStatus key InfoMissing
performDirect :: FilePath -> Key -> CommandPerform
performDirect file key = do

View file

@ -38,7 +38,7 @@ check = do
seek :: [CommandSeek]
seek =
[ withFilesNotInGit $ whenAnnexed startCheckIncomplete
, withFilesInGit $ whenAnnexed startUnannex
, withFilesInGit $ whenAnnexed Command.Unannex.start
, withNothing start
]
@ -51,14 +51,6 @@ startCheckIncomplete file _ = error $ unlines
, "Not continuing with uninit; either delete or git annex add the file and retry."
]
startUnannex :: FilePath -> (Key, Backend) -> CommandStart
startUnannex file info = do
-- Force fast mode before running unannex. This way, if multiple
-- files link to a key, it will be left in the annex and hardlinked
-- to by each.
Annex.changeState $ \s -> s { Annex.fast = True }
Command.Unannex.start file info
start :: CommandStart
start = next $ next $ do
annexdir <- fromRepo gitAnnexDir