[Pkg] Rio: File-Base-kph.3.mcz

squeak-dev-noreply at lists.squeakfoundation.org squeak-dev-noreply at lists.squeakfoundation.org
Tue Nov 25 05:13:59 UTC 2008


A new version of File-Base was added to project Rio:
http://www.squeaksource.com/Rio/File-Base-kph.3.mcz

==================== Summary ====================

Name: File-Base-kph.3
Author: kph
Time: 25 November 2008, 5:13:56 am
UUID: 86b85984-2283-48b6-8229-00a4dade4f75
Ancestors: File-Base-kph.2

+ multithreaded ftp now working up/down
- archive is broken

=============== Diff against File-Base-kph.2 ===============

Item was changed:
  FileRemoteExecutive subclass: #FileFtpExecutive
+ 	instanceVariableNames: 'home isKeepAlive rw'
- 	instanceVariableNames: 'home isKeepAlive rw ftpClient'
  	classVariableNames: ''
  	poolDictionaries: ''
  	category: 'File-Base'!

Item was changed:
  ----- Method: Directory>>addAll: (in category 'directory/container actions') -----
  addAll: someFD
  	
+ 	self addAll: someFD relativeTo: nil!
- 	self addAll: someFD fromBase: nil!

Item was added:
+ ----- Method: Directory>>addAll:relativeTo: (in category 'directory/container actions') -----
+ addAll: someFD relativeTo: aBaseDir
+ 	
+ 	"someFd must all have the same executor"
+ 	
+ 	"we could perform a sort here to handle the other case"
+ 	
+ 	someFD isEmpty ifTrue: [ ^ self ].
+ 	
+ 	someFD first executive addAll: someFD relativeTo: aBaseDir toDir: self.!

Item was added:
+ ----- Method: FileRemoteExecutive>>initialize (in category 'as yet unclassified') -----
+ initialize
+ 
+ 	client := nil.!

Item was added:
+ ----- Method: FileFtpExecutive>>toDirLocal:addAllRemote:relativeTo: (in category 'local/remote file copy') -----
+ toDirLocal: aDir addAllRemote: someFD relativeTo: aBaseDir
+ 
+ 	self toDirRemote: aDir addAllLocal: someFD relativeTo: aBaseDir 
+ 		copySelector: #copyRemoteFile:toLocalFile:!

Item was added:
+ ----- Method: FileFtpExecutive>>toDir:addAllLocal:relativeTo: (in category 'local/remote file copy') -----
+ toDir: aDir addAllLocal: someFD relativeTo: aBaseDir
+ 
+ 	^ self toDirRemote: aDir addAllLocal: someFD relativeTo: aBaseDir!

Item was changed:
  ----- Method: FileFtpExecutive>>copyRemoteFile:toLocalFile: (in category 'external ftp') -----
  copyRemoteFile: aFile toLocalFile: bFile
  
  	self class OSProcessOrNil ifNil: [ ^ aFile copyTo: bFile ].
  		
   	self class OSProcessOrNil waitForCommand:
  	
  	'ftp -o "', bFile asVmPathName, '" "' ,  url asString ,  aFile, '"'!

Item was changed:
  ----- Method: FileFtpExecutive>>copyRemoteFile:toRemoteFile: (in category 'external ftp') -----
  copyRemoteFile: aFile toRemoteFile: bFile
  
+ 	"we copy the executives to enable multi threaded copying and because we cant read and write with the same executive"
+ 	
+ 	^ (aFile executive: aFile executive copy initialize) copyTo: (bFile executive: bFile executive copy initialize)!
- 	^ aFile copyTo: bFile!

Item was added:
+ ----- Method: FileFtpExecutive>>toDir:addAllRemote:relativeTo: (in category 'local/remote file copy') -----
+ toDir: aDir addAllRemote: someFD relativeTo: aBaseDir
+ 	
+ 	^ self toDirRemote: aDir addAllRemote: someFD relativeTo: aBaseDir!

Item was changed:
  ----- Method: FileFtpExecutive>>initialize (in category 'initialization') -----
  initialize
  
+ 	super initialize.
  	isKeepAlive := false.!

Item was added:
+ ----- Method: FileFtpExecutive>>toDirRemote:addAllLocal:relativeTo: (in category 'local/remote file copy') -----
+ toDirRemote: aDir addAllLocal: someFD relativeTo: aBaseDir
+ 
+ 	self toDirRemote: aDir addAllLocal: someFD relativeTo: aBaseDir 
+ 		copySelector: #copyLocalFile:toRemoteFile:!

Item was added:
+ ----- Method: FileFtpExecutive>>toDirRemote:addAllLocal:relativeTo:copySelector: (in category 'local/remote file copy') -----
+ toDirRemote: aDir addAllLocal: someFD relativeTo: aBaseDir copySelector: aSelector
+ 
+ 	"here we do two passes, first we ensure that all of the needed directories exist.
+ 	 for this we use our ususal ftp client.
+ 	
+ 	for the file transfers themselves we run n threads feeding from a shared queue
+ 	
+ 	"
+ 
+ 	| queue map done delay |
+ 	
+ 	self ftpDo: [ :ftp |
+ 	
+ 		map := self toDir: aDir mkpathAll: someFD relativeTo: aBaseDir.
+ 
+ 	].
+ 
+ 	delay := Delay forMilliseconds: 100.
+ 	queue := SharedQueue2 new setItems: map copy.
+ 	done :=  SharedQueue2 new.
+  	
+ 	self class prefFtpParallel timesRepeat: [
+ 			[
+ 				[ queue isEmpty ] whileFalse: [ 
+ 					queue nextOrNil ifNotNilDo: [ :ea | 
+ 						[ self perform: aSelector withArguments: ea ] ensure: [ done nextPut: ea ].
+ 					]
+ 				]
+ 			] fork.
+ 		].
+ 	
+ 	[ done size < map size ] whileTrue: [ delay wait ]. 
+  
+ 	^ map!

Item was changed:
  ----- Method: Directory>>add: (in category 'directory/container actions') -----
  add: aFD
  		 
+ 	^ self addAll: (Array with: aFD)	 !
- 	^ self add: aFD fromBase: nil
- 	 !

Item was added:
+ ----- Method: FileFtpExecutive>>toDirRemote:addAllRemote:relativeTo: (in category 'local/remote file copy') -----
+ toDirRemote: aDir addAllRemote: someFD relativeTo: aBaseDir
+ 
+ 	self toDirRemote: aDir addAllLocal: someFD relativeTo: aBaseDir 
+ 		 copySelector: #copyRemoteFile:toRemoteFile:!

Item was added:
+ ----- Method: FileFtpExecutive>>addAll:relativeTo:toDir: (in category 'local/remote file copy') -----
+ addAll: someFD relativeTo: aBaseDir toDir: aDir
+ 	
+ 	^ aDir executive toDir: aDir addAllRemote: someFD relativeTo: aBaseDir.!

Item was changed:
  ----- Method: Directory>>addTree: (in category 'directory/container actions') -----
  addTree: aDir
- 
- 	| base newAddition |
  	
  	self validateIsContainer.
  	aDir validateIsDirectory.
+ 		
+ 	^ self addAll: (aDir all entries addFirst: aDir; yourself) relativeTo: aDir parent.
- 	
- 	newAddition := self add: aDir fromBase: (base := aDir parent). 
- 	
- 	self addAll: (aDir all entries) fromBase: base.
  	
+  	 !
- 	^ newAddition
- 	 !

Item was removed:
- ----- Method: FileFtpExecutive>>dir:add:fromBase: (in category 'basic') -----
- dir: aDir add: aFileOrDir fromBase: aBaseDirectory
- 	self ftpDo: [ :ftp | super dir: aDir add: aFileOrDir fromBase: aBaseDirectory ]  !

Item was removed:
- ----- Method: Directory>>addAll:fromBase: (in category 'directory/container actions') -----
- addAll: someFD fromBase: aDirectory
- 
- 	executive dir: self addAll: someFD fromBase: aDirectory!

Item was removed:
- ----- Method: FileFtpExecutive>>dir:addAll:fromBase: (in category 'basic') -----
- dir: aDir addAll: someFD fromBase: aBaseDir
- 
- 	"here we do two passes, first we ensure that all of the needed directories exist.
- 	 for this we use our ususal ftp client.
- 	
- 	for the file transfers themselves we run n threads feeding from a shared queue
- 	
- 	"
- 
- 	| queue items done |
- 	
- 	self ftpDo: [ :ftp |
- 	
- 		self class OSProcessOrNil	ifNil: [^ super dir: aDir addAll: someFD fromBase: aBaseDir ].
- 	
- 		items := someFD collect: [ :aFileOrDir | (self dir: aDir mkpath: aFileOrDir fromBase: aBaseDir) -> aFileOrDir ].
- 		items := items select: [ :ea | ea value isFile ].
- 	].
- 
- 	queue := SharedQueue2 new setItems: items.
- 	done := SharedQueue2 new.
-  	
- 	self class prefFtpParallel timesRepeat: [
- 			[
- 				[ queue isEmpty ] whileFalse: [ 
- 					queue nextOrNil ifNotNilDo: [ :ea | 
- 						self dir: ea key addFile: ea value. 
- 						done nextPut: 1
- 					]
- 				]
- 			] fork.
- 		].
- 	
- 	[ done size < items size ] whileTrue: [ Delay forMilliseconds: 100 ]. 
-  !

Item was removed:
- ----- Method: Directory>>add:fromBase: (in category 'directory/container actions') -----
- add: aFileOrDir fromBase: aBaseDirectory
- 
- 	"I am a directory, add the file or create directory using aBaseDirectory 
- 	 as the base reference."
- 
- 	self validateIsDirectory.
- 		
- 	executive dir: self add: aFileOrDir fromBase: aBaseDirectory
- 	 
- 	
-  !

Item was removed:
- ----- Method: FileFtpExecutive>>copyFile:toLocalFile: (in category 'external ftp') -----
- copyFile: aFile toLocalFile: bFile
- 
- 	^ self copyRemoteFile: aFile toLocalFile: bFile!

Item was removed:
- ----- Method: FileFtpExecutive>>copyFile:toRemoteFile: (in category 'external ftp') -----
- copyFile: aFile toRemoteFile: aDir
- 
- 	^ self copyRemoteFile: aFile toRemoteFile: aDir!

Item was removed:
- ----- Method: FileArchive>>add: (in category 'public') -----
- add: aFD  
- 	 
- 	self validateIsContainer.
- 	
- 	executive dir: self add: aFD  !

Item was removed:
- ----- Method: FileArchive>>add:fromBase: (in category 'public') -----
- add: aFD fromBase: aBaseDirectory
- 
- 	"I am an archive, add the file or create directory using aBaseDirectory 
- 	 as the base reference."
- 
- 	self validateIsContainer.
- 	
- 	executive dir: self add: aFD fromBase: aBaseDirectory!



More information about the Packages mailing list