diff options
author | 2012-07-01 15:18:36 -0400 | |
---|---|---|
committer | 2012-07-01 17:15:11 -0400 | |
commit | e5fd8b67b7dc3321b13c9b01c36cc7f4d01e1ad8 (patch) | |
tree | aee277a551b775eb45eae79b858a040379908501 | |
parent | 72988bae34030295f029b36e859d28bd45f7dbc1 (diff) |
get, move, copy: Now refuse to do anything when the requested file transfer is already in progress by another process.
Note this is per-remote, so trying to get the same file from multiple
remotes can still let duplicate downloads run. (And uploading the same file
to multiple remotes is not duplicate at all of course.)
get, move, and copy are the only git-annex subcommands that transfer
files, but there's still git-annex-shell recvkey and sendkey to deal with too.
I considered modifying retrieveKeyFile or getViaTmp, but they are called
by other code that does not involve expensive file transfers (migrate)
or that does file transfers that should not be checked by this (fsck --from).
-rw-r--r-- | Command/Get.hs | 19 | ||||
-rw-r--r-- | Command/Move.hs | 17 | ||||
-rw-r--r-- | debian/changelog | 7 |
3 files changed, 26 insertions, 17 deletions
diff --git a/Command/Get.hs b/Command/Get.hs index c4ba48312..35e25d975 100644 --- a/Command/Get.hs +++ b/Command/Get.hs @@ -12,6 +12,7 @@ import Command import qualified Remote import Annex.Content import qualified Command.Move +import Logs.Transfer def :: [Command] def = [withOptions [Command.Move.fromOption] $ command "get" paramPaths seek @@ -25,24 +26,24 @@ start :: Maybe Remote -> FilePath -> (Key, Backend) -> CommandStart start from file (key, _) = stopUnless (not <$> inAnnex key) $ autoCopies file key (<) $ \_numcopies -> case from of - Nothing -> go $ perform key + Nothing -> go $ perform key file Just src -> -- get --from = copy --from stopUnless (Command.Move.fromOk src key) $ - go $ Command.Move.fromPerform src False key + go $ Command.Move.fromPerform src False key file where go a = do showStart "get" file - next a + next a -perform :: Key -> CommandPerform -perform key = stopUnless (getViaTmp key $ getKeyFile key) $ +perform :: Key -> FilePath -> CommandPerform +perform key file = stopUnless (getViaTmp key $ getKeyFile key file) $ next $ return True -- no cleanup needed {- Try to find a copy of the file in one of the remotes, - and copy it to here. -} -getKeyFile :: Key -> FilePath -> Annex Bool -getKeyFile key file = dispatch =<< Remote.keyPossibilities key +getKeyFile :: Key -> FilePath -> FilePath -> Annex Bool +getKeyFile key file dest = dispatch =<< Remote.keyPossibilities key where dispatch [] = do showNote "not available" @@ -64,7 +65,7 @@ getKeyFile key file = dispatch =<< Remote.keyPossibilities key | Remote.hasKeyCheap r = either (const False) id <$> Remote.hasKey r key | otherwise = return True - docopy r continue = do + docopy r continue = download r key file $ do showAction $ "from " ++ Remote.name r - ifM (Remote.retrieveKeyFile r key file) + ifM (Remote.retrieveKeyFile r key dest) ( return True , continue) diff --git a/Command/Move.hs b/Command/Move.hs index 6ec7cd90a..8bba46878 100644 --- a/Command/Move.hs +++ b/Command/Move.hs @@ -16,6 +16,7 @@ import qualified Remote import Annex.UUID import qualified Option import Logs.Presence +import Logs.Transfer def :: [Command] def = [withOptions options $ command "move" paramPaths seek @@ -68,9 +69,9 @@ toStart dest move file key = do then stop -- not here, so nothing to do else do showMoveAction move file - next $ toPerform dest move key -toPerform :: Remote -> Bool -> Key -> CommandPerform -toPerform dest move key = moveLock move key $ do + next $ toPerform dest move key file +toPerform :: Remote -> Bool -> Key -> FilePath -> CommandPerform +toPerform dest move key file = moveLock move key $ do -- Checking the remote is expensive, so not done in the start step. -- In fast mode, location tracking is assumed to be correct, -- and an explicit check is not done, when copying. When moving, @@ -88,7 +89,7 @@ toPerform dest move key = moveLock move key $ do stop Right False -> do showAction $ "to " ++ Remote.name dest - ok <- Remote.storeKey dest key + ok <- upload dest key file $ Remote.storeKey dest key if ok then finish else do @@ -118,7 +119,7 @@ fromStart src move file key where go = stopUnless (fromOk src key) $ do showMoveAction move file - next $ fromPerform src move key + next $ fromPerform src move key file fromOk :: Remote -> Key -> Annex Bool fromOk src key | Remote.hasKeyCheap src = @@ -129,11 +130,11 @@ fromOk src key u <- getUUID remotes <- Remote.keyPossibilities key return $ u /= Remote.uuid src && elem src remotes -fromPerform :: Remote -> Bool -> Key -> CommandPerform -fromPerform src move key = moveLock move key $ +fromPerform :: Remote -> Bool -> Key -> FilePath -> CommandPerform +fromPerform src move key file = moveLock move key $ ifM (inAnnex key) ( handle move True - , do + , download src key file $ do showAction $ "from " ++ Remote.name src ok <- getViaTmp key $ Remote.retrieveKeyFile src key handle move ok diff --git a/debian/changelog b/debian/changelog index 96d85da27..babd1786d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +git-annex (3.20120630) UNRELEASED; urgency=low + + * get, move, copy: Now refuse to do anything when the requested file + transfer is already in progress by another process. + + -- Joey Hess <joeyh@debian.org> Sun, 01 Jul 2012 15:04:37 -0400 + git-annex (3.20120629) unstable; urgency=low * cabal: Only try to use inotify on Linux. |