support .git/annex on a different disk than the rest of the repo

The only fully supported thing is to have the main repository on one disk,
and .git/annex on another. Only commands that move data in/out of the annex
will need to copy it across devices.

There is only partial support for putting arbitrary subdirectories of
.git/annex on different devices. For one thing, but this can require more
copies to be done. For example, when .git/annex/tmp is on one device, and
.git/annex/journal on another, every journal write involves a call to
mv(1). Also, there are a few places that make hard links between various
subdirectories of .git/annex with createLink, that are not handled.

In the common case without cross-device, the new moveFile is actually
faster than renameFile, avoiding an unncessary stat to check that a file
(not a directory) is being moved. Of course if a cross-device move is
needed, it is as slow as mv(1) of the data.
This commit is contained in:
Joey Hess 2011-11-28 15:26:27 -04:00
parent ff2d9c8283
commit 6869e6023e
9 changed files with 81 additions and 11 deletions

View file

@ -113,7 +113,7 @@ logStatus key status = do
u <- getUUID
logChange key u status
{- Runs an action, passing it a temporary filename to download,
{- Runs an action, passing it a temporary filename to get,
- and if the action succeeds, moves the temp file into
- the annex as a key's content. -}
getViaTmp :: Key -> (FilePath -> Annex Bool) -> Annex Bool
@ -221,7 +221,7 @@ moveAnnex key src = do
else liftIO $ do
createDirectoryIfMissing True dir
allowWrite dir -- in case the directory already exists
renameFile src dest
moveFile src dest
preventWrite dest
preventWrite dir
@ -243,7 +243,7 @@ fromAnnex :: Key -> FilePath -> Annex ()
fromAnnex key dest = withObjectLoc key $ \(dir, file) -> liftIO $ do
allowWrite dir
allowWrite file
renameFile file dest
moveFile file dest
removeDirectory dir
{- Moves a key out of .git/annex/objects/ into .git/annex/bad, and
@ -256,7 +256,7 @@ moveBad key = do
liftIO $ do
createDirectoryIfMissing True (parentDir dest)
allowWrite (parentDir src)
renameFile src dest
moveFile src dest
removeDirectory (parentDir src)
logStatus key InfoMissing
return dest