assistant: When there are multiple remotes giving different ways to access the same repository, honor remote cost settings and use the cheapest available.
Note that TransferInfo does not always contain the Remote, although any transfer added to the TransferQueue does have a Remote in its TransferInfo. The transferkeys command still accepts a UUID, which is useful to handle upgrades, where an old assistant version runs the new transferkeys. This commit was sponsored by Kalle Svensson.
This commit is contained in:
parent
e5bebde345
commit
fed509fb3e
6 changed files with 31 additions and 17 deletions
|
@ -149,7 +149,7 @@ genTransfer t info = case transferRemote info of
|
|||
- usual cleanup. However, first check if something else is
|
||||
- running the transfer, to avoid removing active transfers.
|
||||
-}
|
||||
go remote transferrer = ifM (liftIO $ performTransfer transferrer t $ associatedFile info)
|
||||
go remote transferrer = ifM (liftIO $ performTransfer transferrer t info)
|
||||
( do
|
||||
maybe noop
|
||||
(void . addAlert . makeAlertFiller True
|
||||
|
|
|
@ -56,9 +56,9 @@ checkTransferrerPoolItem program batchmaker i = case i of
|
|||
|
||||
{- Requests that a Transferrer perform a Transfer, and waits for it to
|
||||
- finish. -}
|
||||
performTransfer :: Transferrer -> Transfer -> AssociatedFile -> IO Bool
|
||||
performTransfer transferrer t f = catchBoolIO $ do
|
||||
T.sendRequest t f (transferrerWrite transferrer)
|
||||
performTransfer :: Transferrer -> Transfer -> TransferInfo -> IO Bool
|
||||
performTransfer transferrer t info = catchBoolIO $ do
|
||||
T.sendRequest t info (transferrerWrite transferrer)
|
||||
T.readResponse (transferrerRead transferrer)
|
||||
|
||||
{- Starts a new git-annex transferkeys process, setting up handles
|
||||
|
|
|
@ -17,6 +17,7 @@ import Annex.Transfer
|
|||
import qualified Remote
|
||||
import Types.Key
|
||||
import Utility.SimpleProtocol (ioHandles)
|
||||
import Git.Types (RemoteName)
|
||||
|
||||
data TransferRequest = TransferRequest Direction Remote Key AssociatedFile
|
||||
|
||||
|
@ -56,13 +57,13 @@ runRequests readh writeh a = do
|
|||
fileEncoding writeh
|
||||
go =<< readrequests
|
||||
where
|
||||
go (d:u:k:f:rest) = do
|
||||
case (deserialize d, deserialize u, deserialize k, deserialize f) of
|
||||
(Just direction, Just uuid, Just key, Just file) -> do
|
||||
mremote <- Remote.remoteFromUUID uuid
|
||||
go (d:rn:k:f:rest) = do
|
||||
case (deserialize d, deserialize rn, deserialize k, deserialize f) of
|
||||
(Just direction, Just remotename, Just key, Just file) -> do
|
||||
mremote <- Remote.byName' remotename
|
||||
case mremote of
|
||||
Nothing -> sendresult False
|
||||
Just remote -> sendresult =<< a
|
||||
Left _ -> sendresult False
|
||||
Right remote -> sendresult =<< a
|
||||
(TransferRequest direction remote key file)
|
||||
_ -> sendresult False
|
||||
go rest
|
||||
|
@ -75,13 +76,15 @@ runRequests readh writeh a = do
|
|||
hPutStrLn writeh $ serialize b
|
||||
hFlush writeh
|
||||
|
||||
sendRequest :: Transfer -> AssociatedFile -> Handle -> IO ()
|
||||
sendRequest t f h = do
|
||||
sendRequest :: Transfer -> TransferInfo -> Handle -> IO ()
|
||||
sendRequest t info h = do
|
||||
hPutStr h $ intercalate fieldSep
|
||||
[ serialize (transferDirection t)
|
||||
, serialize (transferUUID t)
|
||||
, maybe (serialize (fromUUID (transferUUID t)))
|
||||
(serialize . Remote.name)
|
||||
(transferRemote info)
|
||||
, serialize (transferKey t)
|
||||
, serialize f
|
||||
, serialize (associatedFile info)
|
||||
, "" -- adds a trailing null
|
||||
]
|
||||
hFlush h
|
||||
|
@ -116,9 +119,9 @@ instance TCSerialized AssociatedFile where
|
|||
deserialize "" = Just Nothing
|
||||
deserialize f = Just $ Just f
|
||||
|
||||
instance TCSerialized UUID where
|
||||
serialize = fromUUID
|
||||
deserialize = Just . toUUID
|
||||
instance TCSerialized RemoteName where
|
||||
serialize n = n
|
||||
deserialize n = Just n
|
||||
|
||||
instance TCSerialized Key where
|
||||
serialize = key2file
|
||||
|
|
|
@ -25,6 +25,7 @@ module Remote (
|
|||
remoteMap',
|
||||
uuidDescriptions,
|
||||
byName,
|
||||
byName',
|
||||
byNameOnly,
|
||||
byNameWithUUID,
|
||||
byCost,
|
||||
|
|
8
debian/changelog
vendored
8
debian/changelog
vendored
|
@ -1,3 +1,11 @@
|
|||
git-annex (5.20140518) UNRELEASED; urgency=medium
|
||||
|
||||
* assistant: When there are multiple remotes giving different ways
|
||||
to access the same repository, honor remote cost settings and use
|
||||
the cheapest available.
|
||||
|
||||
-- Joey Hess <joeyh@debian.org> Mon, 19 May 2014 15:59:25 -0400
|
||||
|
||||
git-annex (5.20140517) unstable; urgency=medium
|
||||
|
||||
* webapp: Switched to bootstrap 3.
|
||||
|
|
|
@ -136,3 +136,5 @@ gpg: 68D8501429C42E01: skipped: public key already present
|
|||
"""]]
|
||||
|
||||
[[!meta title="transferkeys protocol needs to include remote name to deal with multiple remotes with same UUID"]]
|
||||
|
||||
> [[fixed|done]] --[[Joey]]
|
||||
|
|
Loading…
Reference in a new issue