summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--Command/Copy.hs11
-rw-r--r--Command/Move.hs35
-rw-r--r--doc/git-annex-copy.mdwn4
-rw-r--r--doc/git-annex-move.mdwn13
5 files changed, 46 insertions, 18 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 1232b09f1..47628bdc2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
git-annex (6.20170520) UNRELEASED; urgency=medium
+ * move --to=here moves from all reachable remotes to the local repository.
* initremote, enableremote: Support gpg subkeys suffixed with an
exclamation mark, which forces gpg to use a specific subkey.
* Improve progress display when watching file size, in cases where
diff --git a/Command/Copy.hs b/Command/Copy.hs
index 1f35d9ce8..667f940f0 100644
--- a/Command/Copy.hs
+++ b/Command/Copy.hs
@@ -52,7 +52,10 @@ start o file key = stopUnless shouldCopy $
| autoMode o = want <||> numCopiesCheck file key (<)
| otherwise = return True
want = case Command.Move.fromToOptions (moveOptions o) of
- Right (ToRemote dest) -> (Remote.uuid <$> getParsed dest) >>=
- wantSend False (Just key) (AssociatedFile (Just file))
- Right (FromRemote _) ->
- wantGet False (Just key) (AssociatedFile (Just file))
+ Right (ToRemote dest) ->
+ (Remote.uuid <$> getParsed dest) >>= checkwantsend
+ Right (FromRemote _) -> checkwantget
+ Left Command.Move.ToHere -> checkwantget
+
+ checkwantsend = wantSend False (Just key) (AssociatedFile (Just file))
+ checkwantget = wantGet False (Just key) (AssociatedFile (Just file))
diff --git a/Command/Move.hs b/Command/Move.hs
index 787afd929..76b6c882a 100644
--- a/Command/Move.hs
+++ b/Command/Move.hs
@@ -1,6 +1,6 @@
{- git-annex command
-
- - Copyright 2010-2015 Joey Hess <id@joeyh.name>
+ - Copyright 2010-2017 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
@@ -75,6 +75,9 @@ start' o move afile key ai =
Right (ToRemote dest) ->
checkFailedTransferDirection ai Upload $
toStart move afile key ai =<< getParsed dest
+ Left ToHere ->
+ checkFailedTransferDirection ai Download $
+ toHereStart move afile key ai
showMoveAction :: Bool -> Key -> ActionItem -> Annex ()
showMoveAction move = showStart' (if move then "move" else "copy")
@@ -181,14 +184,15 @@ fromOk src key = go =<< Annex.getState Annex.force
return $ u /= Remote.uuid src && elem src remotes
fromPerform :: Remote -> Bool -> Key -> AssociatedFile -> CommandPerform
-fromPerform src move key afile = ifM (inAnnex key)
- ( dispatch move True
- , dispatch move =<< go
- )
+fromPerform src move key afile = do
+ showAction $ "from " ++ Remote.name src
+ ifM (inAnnex key)
+ ( dispatch move True
+ , dispatch move =<< go
+ )
where
go = notifyTransfer Download afile $
- download (Remote.uuid src) key afile forwardRetry $ \p -> do
- showAction $ "from " ++ Remote.name src
+ download (Remote.uuid src) key afile forwardRetry $ \p ->
getViaTmp (RemoteVerify src) key $ \t ->
Remote.retrieveKeyFile src key afile t p
dispatch _ False = stop -- failed
@@ -208,3 +212,20 @@ fromPerform src move key afile = ifM (inAnnex key)
ok <- Remote.removeKey src key
next $ Command.Drop.cleanupRemote key src ok
faileddropremote = giveup "Unable to drop from remote."
+
+{- Moves (or copies) the content of an annexed file from reachable remotes
+ - to the current repository.
+ -
+ - When moving, the content is removed from all the reachable remotes. -}
+toHereStart :: Bool -> AssociatedFile -> Key -> ActionItem -> CommandStart
+toHereStart move afile key ai
+ | move = go
+ | otherwise = stopUnless (not <$> inAnnex key) go
+ where
+ go = do
+ rs <- Remote.keyPossibilities key
+ forM_ rs $ \r ->
+ includeCommandAction $ do
+ showMoveAction move key ai
+ next $ fromPerform r move key afile
+ stop
diff --git a/doc/git-annex-copy.mdwn b/doc/git-annex-copy.mdwn
index 92eb1750b..50b407c3c 100644
--- a/doc/git-annex-copy.mdwn
+++ b/doc/git-annex-copy.mdwn
@@ -14,14 +14,14 @@ Copies the content of files from or to another remote.
* `--from=remote`
- Use this option to copy the content of files from the specified
+ Copy the content of files from the specified
remote to the local repository.
Any files that are not available on the remote will be silently skipped.
* `--to=remote`
- Use this option to copy the content of files from the local repository
+ Copy the content of files from the local repository
to the specified remote.
* `--jobs=N` `-JN`
diff --git a/doc/git-annex-move.mdwn b/doc/git-annex-move.mdwn
index d2595cfe8..6bf24309b 100644
--- a/doc/git-annex-move.mdwn
+++ b/doc/git-annex-move.mdwn
@@ -4,7 +4,7 @@ git-annex move - move content of files to/from another repository
# SYNOPSIS
-git annex move `[path ...] [--from=remote|--to=remote]`
+git annex move `[path ...] [--from=remote|--to=remote|--to=here]`
# DESCRIPTION
@@ -14,13 +14,16 @@ Moves the content of files from or to another remote.
* `--from=remote`
- Use this option to move the content of files from the specified
- remote to the local repository.
+ Move the content of files from the specified remote to the local repository.
* `--to=remote`
- Use this option to move the content of files from the local repository
- to the specified remote.
+ Move the content of files from the local repository to the specified remote.
+
+* `--to=here`
+
+ Move the content of files from all reachable remotes to the local
+ repository.
* `--jobs=N` `-JN`