--- a/Archiver.st Fri Jan 16 15:39:53 2004 +0100
+++ b/Archiver.st Tue Jan 20 15:21:33 2004 +0100
@@ -22,7 +22,28 @@
privateIn:Archiver
!
-Archiver subclass:#GZipArchive
+Archiver subclass:#CompressedFile
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ privateIn:Archiver
+!
+
+Archiver::CompressedFile subclass:#BZ2Compressed
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ privateIn:Archiver
+!
+
+Archiver subclass:#CompressedTarArchive
+ instanceVariableNames:'tarArchiver tarFile'
+ classVariableNames:''
+ poolDictionaries:''
+ privateIn:Archiver
+!
+
+Archiver::CompressedFile subclass:#GZipCompressed
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
@@ -43,8 +64,15 @@
privateIn:Archiver
!
-Archiver subclass:#TarGZipArchive
- instanceVariableNames:'tarArchiver tarFile'
+Archiver::CompressedTarArchive subclass:#TarBZ2Archive
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ privateIn:Archiver
+!
+
+Archiver::CompressedTarArchive subclass:#TarGZipArchive
+ instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
privateIn:Archiver
@@ -61,25 +89,58 @@
!Archiver class methodsFor:'instance creation'!
classForMimeType:aMimeType
+ ^ self classForMimeType:aMimeType fileName:nil
+
+ "
+ self classForMimeType:'application/x-tar'
+ self classForMimeType:'application/x-foo'
+ self classForMimeType:'application/x-squeak-archive'
+ self classForMimeType:'application/java-archive'
+ 'foo.sar' asFilename mimeTypeFromName
+ 'foo.jar' asFilename mimeTypeFromName
+ 'foo.a' asFilename mimeTypeFromName
+ "
+!
+
+classForMimeType:aMimeType fileName:aFileNameOrNil
|className|
aMimeType isNil ifTrue:[^ nil].
className := (
#(
- ('application/x-tar-compressed' TarGZipArchive )
- ('application/x-tar' TarArchive )
- ('application/x-gzip-compressed' GZipArchive )
- ('application/x-zip-compressed' ZipArchive )
- ('application/x-squeak-archive' ZipArchive )
- ('application/java-archive' ZipArchive )
+ ('application/x-tar-compressed' CompressedTarArchive ) "/ abstract - see below
+ ('application/x-tar-gzip-compressed' TarGZipArchive )
+ ('application/x-tar-bzip2-compressed' TarBZ2Archive )
+ ('application/x-tar' TarArchive )
+ ('application/x-gzip-compressed' GZipCompressed )
+ ('application/x-zip-compressed' ZipArchive )
+ ('application/x-bzip2-compressed' BZ2Compressed )
+ ('application/x-squeak-archive' ZipArchive )
+ ('application/java-archive' ZipArchive )
- ('application/x-ar-archive' ArArchive )
- ('application/x-ar-library' ArArchive )
- ('application/library' ArArchive )
+ ('application/x-ar-archive' ArArchive )
+ ('application/x-ar-library' ArArchive )
+ ('application/library' ArArchive )
+
+"/ ('application/x-rpm' RPMArchive )
+"/ ('application/x-rpm-archive' RPMArchive )
+"/ ('application/x-redhat packet manager' RPMArchive )
) detect:[:entry | entry first = aMimeType] ifNone:#(nil nil)
) last.
className isNil ifTrue:[^ nil].
+
+ className = CompressedTarArchive ifTrue:[
+ aFileNameOrNil isNil ifTrue:[
+ className := #TarGZipArchive
+ ] ifFalse:[
+ aFileNameOrNil suffix = 'bz2' ifTrue:[
+ className := #TarBZ2Archive
+ ] ifFalse:[
+ className := #TarGZipArchive
+ ]
+ ].
+ ].
^ self privateClassesAt:className.
"
@@ -94,10 +155,11 @@
!
newFor:aFilename
- |mimeType archiverClass|
+ |fn mimeType archiverClass|
- mimeType := aFilename asFilename mimeTypeFromName.
- archiverClass := self classForMimeType:mimeType.
+ fn := aFilename asFilename.
+ mimeType := fn mimeTypeFromName.
+ archiverClass := self classForMimeType:mimeType fileName:fn.
archiverClass isNil ifTrue:[^ nil].
^ archiverClass with:aFilename
!
@@ -119,8 +181,7 @@
!
gzipArchive
-
- ^ GZipArchive
+ ^ GZipCompressed
!
tarArchive
@@ -577,43 +638,56 @@
^ item
! !
-!Archiver::GZipArchive class methodsFor:'command strings'!
+!Archiver::CompressedFile class methodsFor:'command strings'!
-gunzipCommand
- ^ 'gunzip'
+compressCommand
+ self subclassResponsibility
!
-gzipCommand
- ^ 'gzip'
+uncompressCommand
+ self subclassResponsibility
! !
-!Archiver::GZipArchive class methodsFor:'queries'!
+!Archiver::CompressedFile class methodsFor:'queries'!
canViewFile
^ true
-!
-
-hasTitleLine
-
- ^ true
! !
-!Archiver::GZipArchive methodsFor:'actions'!
+!Archiver::CompressedFile methodsFor:'actions'!
+
+compressFile:aFile to:newFile
+ | cmd directory|
+
+ directory := newFile directory.
+ (directory exists) ifFalse:[
+ DialogBox warn:'cannot compress to non-existing directory ', directory asString.
+ ].
+ (directory isDirectory) ifFalse:[
+ DialogBox warn:'cannot compress to non-directory ', directory asString.
+ ].
+
+ cmd := self getCommandToCompress:aFile asNew:newFile.
+ self executeCommand:cmd directory:directory.
+ newFile exists ifTrue:[
+ self fileName:newFile.
+ ].
+!
extractFiles:aColOfFilesOrNil to:aDirectory
- self unzipTo:aDirectory
+ self uncompressTo:aDirectory
!
-unzipTo:aDirectory
+uncompressTo:aDirectory
| cmd file newFile|
- (aDirectory exists not) ifTrue:[
- DialogBox warn:'cant unzip to not existing directory ', aDirectory asString.
+ (aDirectory exists) ifFalse:[
+ DialogBox warn:'cannot uncompress to non-existing directory ', aDirectory asString.
^ self
].
- (aDirectory isDirectory not) ifTrue:[
- DialogBox warn:'cant unzip to file ', aDirectory asString.
+ (aDirectory isDirectory) ifFalse:[
+ DialogBox warn:'cannot uncompress to file ', aDirectory asString.
^ self
].
file := newFile := self fileName.
@@ -621,29 +695,191 @@
newFile := aDirectory construct:(file baseName).
file copyTo:newFile.
].
- cmd := self getCommandToGunzip:newFile.
+ cmd := self getCommandToUncompress:newFile.
self executeCommand:cmd directory:aDirectory.
+! !
+
+!Archiver::CompressedFile methodsFor:'actions private'!
+
+synchronize
+ |gzipArchiver|
+
+ gzipArchiver := Archiver::BZ2Compressed with:nil.
+ gzipArchiver compressFile:(tarArchiver fileName) to:(self fileName).
+! !
+
+!Archiver::CompressedFile methodsFor:'columns'!
+
+columns
+ self subclassResponsibility
+!
+
+isValidOutputLine:line
+ ^ line endsWith:self fileName withoutSuffix baseName.
+! !
+
+!Archiver::CompressedFile methodsFor:'command strings'!
+
+getCommandToCompress:aFile asNew:newFile
+ ^ '%1 -c %2 > %3'
+ bindWith:self class compressCommand
+ with:aFile asString
+ with:newFile asString
+!
+
+getCommandToListFiles:dummyArg
+ ^ 'gzip -l "' , self fileName baseName , '"'
+!
+
+getCommandToUncompress:aFileName
+ ^ '%1 %2'
+ bindWith:self class uncompressCommand
+ with:aFileName baseName
+! !
+
+!Archiver::BZ2Compressed class methodsFor:'command strings'!
+
+compressCommand
+ ^ 'bzip2'
+!
+
+uncompressCommand
+ ^ 'bunzip2'
+! !
+
+!Archiver::BZ2Compressed methodsFor:'columns'!
+
+columns
+ ^ #(
+ #(#fileName 1)
+ )
+!
+
+isValidOutputLine:line
+ ^ true
+! !
+
+!Archiver::BZ2Compressed methodsFor:'command strings'!
+
+getCommandToListFiles:dummyArg
+ ^ 'echo ' , self fileName withoutSuffix baseName
+"/ ^ 'bzip2 -t -v "' , self fileName baseName , '"'
+! !
+
+!Archiver::CompressedTarArchive class methodsFor:'queries'!
+
+canAddFiles
+ ^ Archiver tarArchive canAddFiles
+!
+
+canRemoveFiles
+ ^ Archiver tarArchive canRemoveFiles
+!
+
+canViewFile
+ ^ Archiver tarArchive canViewFile
!
-zipFile:aFile to:newFile
- | cmd directory|
+compressorClass
+ self subclassResponsibility
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'accessing'!
+
+fileName:aFile
+ |tempDir file compressor suffix tarFilename|
- directory := newFile directory.
- (directory exists) ifFalse:[
- DialogBox warn:'cannot gzip to non-existing directory ', directory asString.
+ super fileName:aFile.
+ " unzip file in tempDirectory and do all the things with tar file "
+ tempDir := self temporaryDirectory.
+ compressor := (self class compressorClass) with:(self fileName).
+ compressor uncompressTo:tempDir.
+ suffix := self fileName suffix.
+ file := self fileName withoutSuffix.
+ tarFilename := file baseName.
+ file suffix ~= 'tar' ifTrue:[
+ tarFilename := tarFilename , '.tar'
].
- (directory isDirectory) ifFalse:[
- DialogBox warn:'cannot gzip to non-directory ', directory asString.
- ].
-
- cmd := self getCommandToGZip:aFile asNew:newFile.
- self executeCommand:cmd directory:directory.
- newFile exists ifTrue:[
- self fileName:newFile.
- ].
+ tarFile := self temporaryDirectory construct:tarFilename.
+ tarArchiver := Archiver::TarArchive with:tarFile.
! !
-!Archiver::GZipArchive methodsFor:'columns'!
+!Archiver::CompressedTarArchive methodsFor:'actions'!
+
+addFilesToArchive:colOfFiles
+ self setCommandOptions.
+ tarArchiver addFilesToArchive:colOfFiles.
+ "/ synchronize the tar archive under temporary file with archiv file position
+ self synchronize.
+!
+
+extractFiles:aColOfFiles to:aDirectory
+ self setCommandOptions.
+ tarArchiver extractFiles:aColOfFiles to:aDirectory.
+!
+
+extractFiles:aColOfFiles withoutDirectoryTo:aDirectory
+ self setCommandOptions.
+ tarArchiver extractFiles:aColOfFiles withoutDirectoryTo:aDirectory.
+!
+
+listFiles:aColOfFiles
+ self setCommandOptions.
+ tarArchiver listFiles:aColOfFiles.
+!
+
+removeFilesFromArchive:aColOfFiles
+ self setCommandOptions.
+ tarArchiver removeFilesFromArchive:aColOfFiles.
+ self synchronize.
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'actions private'!
+
+setCommandOptions
+ tarArchiver outStream:(self outStream).
+ tarArchiver errorStream:(self errorStream).
+ tarArchiver synchron:(self synchron).
+!
+
+synchronize
+ self subclassResponsibility
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'columns'!
+
+columns
+ ^ tarArchiver columns
+!
+
+isValidOutputLine:line
+ ^ tarArchiver isValidOutputLine:line
+! !
+
+!Archiver::CompressedTarArchive methodsFor:'initialization & release'!
+
+release
+ super release.
+ tarArchiver release.
+! !
+
+!Archiver::GZipCompressed class methodsFor:'command strings'!
+
+compressCommand
+ ^ 'gzip'
+!
+
+uncompressCommand
+ ^ 'gunzip'
+! !
+
+!Archiver::GZipCompressed class methodsFor:'queries'!
+
+hasTitleLine
+ ^ true
+! !
+
+!Archiver::GZipCompressed methodsFor:'columns'!
columns
@@ -663,20 +899,7 @@
^ line endsWith:self fileName withoutSuffix baseName.
! !
-!Archiver::GZipArchive methodsFor:'command strings'!
-
-getCommandToGZip:aFile asNew:newFile
- ^ '%1 -c %2 > %3'
- bindWith:self class gzipCommand
- with:aFile asString
- with:newFile asString
-!
-
-getCommandToGunzip:aFileName
- ^ '%1 %2'
- bindWith:self class gunzipCommand
- with:aFileName baseName
-!
+!Archiver::GZipCompressed methodsFor:'command strings'!
getCommandToListFiles:dummyArg
^ 'gzip -l "' , self fileName baseName , '"'
@@ -864,6 +1087,36 @@
^ stream contents
! !
+!Archiver::TarBZ2Archive class methodsFor:'queries'!
+
+canAddFiles
+
+ ^ Archiver tarArchive canAddFiles
+!
+
+canRemoveFiles
+
+ ^ Archiver tarArchive canRemoveFiles
+!
+
+canViewFile
+
+ ^ Archiver tarArchive canViewFile
+!
+
+compressorClass
+ ^ Archiver::BZ2Compressed
+! !
+
+!Archiver::TarBZ2Archive methodsFor:'actions private'!
+
+synchronize
+ |gzipArchiver|
+
+ gzipArchiver := Archiver::BZ2Compressed with:nil.
+ gzipArchiver compressFile:(tarArchiver fileName) to:(self fileName).
+! !
+
!Archiver::TarGZipArchive class methodsFor:'queries'!
canAddFiles
@@ -879,96 +1132,19 @@
canViewFile
^ Archiver tarArchive canViewFile
-! !
-
-!Archiver::TarGZipArchive methodsFor:'accessing'!
-
-fileName:aFile
-
- | tempDir file gzipArchiver suffix|
-
- super fileName:aFile.
- " unzip file in tempDirectory and do all the things with tar file "
- tempDir := self temporaryDirectory.
- gzipArchiver := Archiver::GZipArchive with:(self fileName).
- gzipArchiver unzipTo:tempDir.
- suffix := self fileName suffix.
- file := self fileName withoutSuffix.
- file := file baseName.
- suffix = 'tgz' ifTrue:[
- file := file , '.tar'
- ].
- tarFile := self temporaryDirectory construct:file.
- tarArchiver := Archiver::TarArchive with:tarFile.
-! !
-
-!Archiver::TarGZipArchive methodsFor:'actions'!
-
-addFilesToArchive:colOfFiles
-
- self setCommandOptions.
- tarArchiver addFilesToArchive:colOfFiles.
- "/ synchronize the tar archive under temporary file with archiv file position
- self synchronize.
!
-extractFiles:aColOfFiles to:aDirectory
-
- self setCommandOptions.
- tarArchiver extractFiles:aColOfFiles to:aDirectory.
-!
-
-extractFiles:aColOfFiles withoutDirectoryTo:aDirectory
-
- self setCommandOptions.
- tarArchiver extractFiles:aColOfFiles withoutDirectoryTo:aDirectory.
-!
-
-listFiles:aColOfFiles
- self setCommandOptions.
- tarArchiver listFiles:aColOfFiles.
-!
-
-removeFilesFromArchive:aColOfFiles
-
- self setCommandOptions.
- tarArchiver removeFilesFromArchive:aColOfFiles.
- self synchronize.
+compressorClass
+ ^ Archiver::GZipCompressed
! !
!Archiver::TarGZipArchive methodsFor:'actions private'!
-setCommandOptions
-
- tarArchiver outStream:(self outStream).
- tarArchiver errorStream:(self errorStream).
- tarArchiver synchron:(self synchron).
-!
-
synchronize
-
|gzipArchiver|
- gzipArchiver := Archiver::GZipArchive with:nil.
- gzipArchiver zipFile:(tarArchiver fileName) to:(self fileName).
-! !
-
-!Archiver::TarGZipArchive methodsFor:'columns'!
-
-columns
- ^ tarArchiver columns
-!
-
-isValidOutputLine:line
- ^ tarArchiver isValidOutputLine:line
-! !
-
-!Archiver::TarGZipArchive methodsFor:'initialization & release'!
-
-release
-
- super release.
- tarArchiver release.
+ gzipArchiver := Archiver::GZipCompressed with:nil.
+ gzipArchiver compressFile:(tarArchiver fileName) to:(self fileName).
! !
!Archiver::ZipArchive class methodsFor:'command strings'!
@@ -1100,5 +1276,5 @@
!Archiver class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/Archiver.st,v 1.22 2004-01-08 11:03:21 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Archiver.st,v 1.23 2004-01-20 14:21:33 cg Exp $'
! !