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:
parent
d16d71ce86
commit
0eff0dd910
6 changed files with 41 additions and 31 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue