support chunking for all external special remotes!
Removing code and at the same time adding great features, including upload/download resuming. This commit was sponsored by Romain Lenglet.
This commit is contained in:
		
					parent
					
						
							
								bc9e4697b9
							
						
					
				
			
			
				commit
				
					
						c0dc134cde
					
				
			
		
					 3 changed files with 15 additions and 50 deletions
				
			
		| 
						 | 
					@ -15,14 +15,12 @@ import Types.CleanupActions
 | 
				
			||||||
import qualified Git
 | 
					import qualified Git
 | 
				
			||||||
import Config
 | 
					import Config
 | 
				
			||||||
import Remote.Helper.Special
 | 
					import Remote.Helper.Special
 | 
				
			||||||
import Remote.Helper.Encryptable
 | 
					import Remote.Helper.ChunkedEncryptable
 | 
				
			||||||
import Crypto
 | 
					 | 
				
			||||||
import Utility.Metered
 | 
					import Utility.Metered
 | 
				
			||||||
import Logs.Transfer
 | 
					import Logs.Transfer
 | 
				
			||||||
import Logs.PreferredContent.Raw
 | 
					import Logs.PreferredContent.Raw
 | 
				
			||||||
import Logs.RemoteState
 | 
					import Logs.RemoteState
 | 
				
			||||||
import Config.Cost
 | 
					import Config.Cost
 | 
				
			||||||
import Annex.Content
 | 
					 | 
				
			||||||
import Annex.UUID
 | 
					import Annex.UUID
 | 
				
			||||||
import Annex.Exception
 | 
					import Annex.Exception
 | 
				
			||||||
import Creds
 | 
					import Creds
 | 
				
			||||||
| 
						 | 
					@ -30,7 +28,6 @@ import Creds
 | 
				
			||||||
import Control.Concurrent.STM
 | 
					import Control.Concurrent.STM
 | 
				
			||||||
import System.Log.Logger (debugM)
 | 
					import System.Log.Logger (debugM)
 | 
				
			||||||
import qualified Data.Map as M
 | 
					import qualified Data.Map as M
 | 
				
			||||||
import qualified Data.ByteString.Lazy as L
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
remote :: RemoteType
 | 
					remote :: RemoteType
 | 
				
			||||||
remote = RemoteType {
 | 
					remote = RemoteType {
 | 
				
			||||||
| 
						 | 
					@ -46,15 +43,15 @@ gen r u c gc = do
 | 
				
			||||||
	Annex.addCleanup (RemoteCleanup u) $ stopExternal external
 | 
						Annex.addCleanup (RemoteCleanup u) $ stopExternal external
 | 
				
			||||||
	cst <- getCost external r gc
 | 
						cst <- getCost external r gc
 | 
				
			||||||
	avail <- getAvailability external r gc
 | 
						avail <- getAvailability external r gc
 | 
				
			||||||
	return $ Just $ encryptableRemote c
 | 
						return $ Just $ chunkedEncryptableRemote c
 | 
				
			||||||
		(storeEncrypted external $ getGpgEncParams (c,gc))
 | 
							(simplyPrepare $ store external)
 | 
				
			||||||
		(retrieveEncrypted external)
 | 
							(simplyPrepare $ retrieve external)
 | 
				
			||||||
		Remote {
 | 
							Remote {
 | 
				
			||||||
			uuid = u,
 | 
								uuid = u,
 | 
				
			||||||
			cost = cst,
 | 
								cost = cst,
 | 
				
			||||||
			name = Git.repoDescribe r,
 | 
								name = Git.repoDescribe r,
 | 
				
			||||||
			storeKey = store external,
 | 
								storeKey = storeKeyDummy,
 | 
				
			||||||
			retrieveKeyFile = retrieve external,
 | 
								retrieveKeyFile = retreiveKeyFileDummy,
 | 
				
			||||||
			retrieveKeyFileCheap = \_ _ -> return False,
 | 
								retrieveKeyFileCheap = \_ _ -> return False,
 | 
				
			||||||
			removeKey = remove external,
 | 
								removeKey = remove external,
 | 
				
			||||||
			hasKey = checkPresent external,
 | 
								hasKey = checkPresent external,
 | 
				
			||||||
| 
						 | 
					@ -90,25 +87,8 @@ externalSetup mu _ c = do
 | 
				
			||||||
	gitConfigSpecialRemote u c'' "externaltype" externaltype
 | 
						gitConfigSpecialRemote u c'' "externaltype" externaltype
 | 
				
			||||||
	return (c'', u)
 | 
						return (c'', u)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
store :: External -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool
 | 
					store :: External -> Storer
 | 
				
			||||||
store external k _f p = sendAnnex k rollback $ \f ->
 | 
					store external = fileStorer $ \k f p ->
 | 
				
			||||||
	metered (Just p) k $
 | 
					 | 
				
			||||||
		storeHelper external k f
 | 
					 | 
				
			||||||
  where
 | 
					 | 
				
			||||||
	rollback = void $ remove external k
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
storeEncrypted :: External -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool
 | 
					 | 
				
			||||||
storeEncrypted external gpgOpts (cipher, enck) k p = withTmp enck $ \tmp ->
 | 
					 | 
				
			||||||
	sendAnnex k rollback $ \src -> do
 | 
					 | 
				
			||||||
		metered (Just p) k $ \meterupdate -> do
 | 
					 | 
				
			||||||
			liftIO $ encrypt gpgOpts cipher (feedFile src) $
 | 
					 | 
				
			||||||
				readBytes $ L.writeFile tmp
 | 
					 | 
				
			||||||
			storeHelper external enck tmp meterupdate
 | 
					 | 
				
			||||||
  where
 | 
					 | 
				
			||||||
	rollback = void $ remove external enck
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
storeHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool
 | 
					 | 
				
			||||||
storeHelper external k f p = safely $
 | 
					 | 
				
			||||||
	handleRequest external (TRANSFER Upload k f) (Just p) $ \resp ->
 | 
						handleRequest external (TRANSFER Upload k f) (Just p) $ \resp ->
 | 
				
			||||||
		case resp of
 | 
							case resp of
 | 
				
			||||||
			TRANSFER_SUCCESS Upload k' | k == k' ->
 | 
								TRANSFER_SUCCESS Upload k' | k == k' ->
 | 
				
			||||||
| 
						 | 
					@ -119,31 +99,15 @@ storeHelper external k f p = safely $
 | 
				
			||||||
					return False
 | 
										return False
 | 
				
			||||||
			_ -> Nothing
 | 
								_ -> Nothing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
retrieve :: External -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool
 | 
					retrieve :: External -> Retriever
 | 
				
			||||||
retrieve external k _f d p = metered (Just p) k $
 | 
					retrieve external = fileRetriever $ \d k p -> 
 | 
				
			||||||
	retrieveHelper external k d
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
retrieveEncrypted :: External -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool
 | 
					 | 
				
			||||||
retrieveEncrypted external (cipher, enck) k f p = withTmp enck $ \tmp ->
 | 
					 | 
				
			||||||
	metered (Just p) k $ \meterupdate -> 
 | 
					 | 
				
			||||||
		ifM (retrieveHelper external enck tmp meterupdate)
 | 
					 | 
				
			||||||
			( liftIO $ catchBoolIO $ do
 | 
					 | 
				
			||||||
				decrypt cipher (feedFile tmp) $
 | 
					 | 
				
			||||||
					readBytes $ L.writeFile f
 | 
					 | 
				
			||||||
				return True
 | 
					 | 
				
			||||||
			, return False
 | 
					 | 
				
			||||||
			)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
retrieveHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool
 | 
					 | 
				
			||||||
retrieveHelper external k d p = safely $
 | 
					 | 
				
			||||||
	handleRequest external (TRANSFER Download k d) (Just p) $ \resp ->
 | 
						handleRequest external (TRANSFER Download k d) (Just p) $ \resp ->
 | 
				
			||||||
		case resp of
 | 
							case resp of
 | 
				
			||||||
			TRANSFER_SUCCESS Download k'
 | 
								TRANSFER_SUCCESS Download k'
 | 
				
			||||||
				| k == k' -> Just $ return True
 | 
									| k == k' -> Just $ return ()
 | 
				
			||||||
			TRANSFER_FAILURE Download k' errmsg
 | 
								TRANSFER_FAILURE Download k' errmsg
 | 
				
			||||||
				| k == k' -> Just $ do
 | 
									| k == k' -> Just $ do
 | 
				
			||||||
					warning errmsg
 | 
										error errmsg
 | 
				
			||||||
					return False
 | 
					 | 
				
			||||||
			_ -> Nothing
 | 
								_ -> Nothing
 | 
				
			||||||
 | 
					
 | 
				
			||||||
remove :: External -> Key -> Annex Bool
 | 
					remove :: External -> Key -> Annex Bool
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -295,7 +295,7 @@ retrieveChunks retriever u chunkconfig encryptor basek dest basep sink
 | 
				
			||||||
		return True
 | 
							return True
 | 
				
			||||||
	tosink h _ (FileContent f) = liftIO $ do
 | 
						tosink h _ (FileContent f) = liftIO $ do
 | 
				
			||||||
		sink h Nothing =<< L.readFile f
 | 
							sink h Nothing =<< L.readFile f
 | 
				
			||||||
		nukeFile h
 | 
							nukeFile f
 | 
				
			||||||
		return True
 | 
							return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{- Can resume when the chunk's offset is at or before the end of
 | 
					{- Can resume when the chunk's offset is at or before the end of
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								debian/changelog
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								debian/changelog
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
git-annex (5.20140718) UNRELEASED; urgency=medium
 | 
					git-annex (5.20140718) UNRELEASED; urgency=medium
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * New chunk= option to chunk files stored in directory remotes.
 | 
					  * New chunk= option to chunk files stored in special remotes.
 | 
				
			||||||
 | 
					    Currently supported by: directory, and all external special remotes.
 | 
				
			||||||
  * Partially transferred files are automatically resumed when using
 | 
					  * Partially transferred files are automatically resumed when using
 | 
				
			||||||
    chunked remotes!
 | 
					    chunked remotes!
 | 
				
			||||||
  * The old chunksize= option is deprecated. Do not use for new remotes.
 | 
					  * The old chunksize= option is deprecated. Do not use for new remotes.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue