copy/move --from-anywhere --to remote
Implementation was simple because it's equivilant to --from=foo --to remote for each other remote, followed by --to remote when there's a local copy. (Or, in the edge case of --from-anywhere --to=here, it's the same as --to=here.) Note that, when the local repo does not have a copy, fromToPerform gets it from a remote, sends it to the destination, and drops the local copy. Another call to that for a second remote will notice that the dest now has a copy, and simply drop from the second remote, avoiding a second transfer. Also note that, when numcopies doesn't allow dropping it from everywhere, it will drop it from the cheapest remotes first (maybe not ideal) up to more expensive remotes, and finally from the local repo. So the local repo will generally end up holding a copy. Maybe not ideal in all cases either, but it seems no worse to do that than to end up with a copy undropped from a remote. And I'm not entirely happy with the output, eg: copy bigfile (from r3...) ok copy bigfile ok That makes sense if you think of the second line as being the same as what is output by `git-annex copy bigfile --to bar`, but it's less clear in this context. Maybe add "(from here...)"? Also the --json output doesn't have a machine-readable field for the "from" uuid, and maybe it should? Sponsored-by: Dartmouth College's DANDI project
This commit is contained in:
parent
1654572bc1
commit
1e31bf8122
7 changed files with 88 additions and 15 deletions
|
@ -162,40 +162,55 @@ parseToOption = strOption
|
|||
<> completeRemotes
|
||||
)
|
||||
|
||||
parseFromAnywhereOption :: Parser Bool
|
||||
parseFromAnywhereOption = switch
|
||||
( long "from-anywhere"
|
||||
<> help "from any remote"
|
||||
)
|
||||
|
||||
parseRemoteOption :: Parser RemoteName
|
||||
parseRemoteOption = strOption
|
||||
( long "remote" <> metavar paramRemote
|
||||
<> completeRemotes
|
||||
)
|
||||
|
||||
-- | From or to a remote, or both, or a special --to=here
|
||||
-- | --from or --to a remote, or both, or a special --to=here,
|
||||
-- or --from-anywhere --to remote.
|
||||
data FromToHereOptions
|
||||
= FromOrToRemote FromToOptions
|
||||
| ToHere
|
||||
| FromRemoteToRemote (DeferredParse Remote) (DeferredParse Remote)
|
||||
| FromAnywhereToRemote (DeferredParse Remote)
|
||||
|
||||
parseFromToHereOptions :: Parser (Maybe FromToHereOptions)
|
||||
parseFromToHereOptions = go
|
||||
<$> optional parseFromOption
|
||||
<*> optional parseToOption
|
||||
<*> parseFromAnywhereOption
|
||||
where
|
||||
go (Just from) (Just to) = Just $ FromRemoteToRemote
|
||||
go _ (Just to) True = Just $ FromAnywhereToRemote
|
||||
(mkParseRemoteOption to)
|
||||
go (Just from) (Just to) _ = Just $ FromRemoteToRemote
|
||||
(mkParseRemoteOption from)
|
||||
(mkParseRemoteOption to)
|
||||
go (Just from) Nothing = Just $ FromOrToRemote
|
||||
go (Just from) Nothing _ = Just $ FromOrToRemote
|
||||
(FromRemote $ mkParseRemoteOption from)
|
||||
go Nothing (Just to) = Just $ case to of
|
||||
go Nothing (Just to) _ = Just $ case to of
|
||||
"here" -> ToHere
|
||||
"." -> ToHere
|
||||
_ -> FromOrToRemote $ ToRemote $ mkParseRemoteOption to
|
||||
go Nothing Nothing = Nothing
|
||||
go Nothing Nothing _ = Nothing
|
||||
|
||||
instance DeferredParseClass FromToHereOptions where
|
||||
finishParse (FromOrToRemote v) = FromOrToRemote <$> finishParse v
|
||||
finishParse (FromOrToRemote v) =
|
||||
FromOrToRemote <$> finishParse v
|
||||
finishParse ToHere = pure ToHere
|
||||
finishParse (FromRemoteToRemote v1 v2) = FromRemoteToRemote
|
||||
<$> finishParse v1
|
||||
<*> finishParse v2
|
||||
finishParse (FromRemoteToRemote v1 v2) =
|
||||
FromRemoteToRemote
|
||||
<$> finishParse v1
|
||||
<*> finishParse v2
|
||||
finishParse (FromAnywhereToRemote v) =
|
||||
FromAnywhereToRemote <$> finishParse v
|
||||
|
||||
-- Options for acting on keys, rather than work tree files.
|
||||
data KeyOptions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue