# HG changeset patch # User penk # Date 1031239993 -7200 # Node ID 96db619ea49e8065085ead488b9134c32c79b82b # Parent d71273e1fc2e05d2498aa4f87ed6734b894b522e new archive classes separated from ArchiveViewApplication diff -r d71273e1fc2e -r 96db619ea49e Archiver.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Archiver.st Thu Sep 05 17:33:13 2002 +0200 @@ -0,0 +1,693 @@ +"{ Package: 'stx:libtool2' }" + +Object subclass:#Archiver + instanceVariableNames:'process temporaryDirectory fileName outStream errorStream + synchron' + classVariableNames:'' + poolDictionaries:'' + category:'System-Support-FileFormats' +! + +Archiver subclass:#GZipArchive + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:Archiver +! + +Archiver subclass:#TarArchive + instanceVariableNames:'fileName' + classVariableNames:'' + poolDictionaries:'' + privateIn:Archiver +! + +Archiver subclass:#TarGZipArchive + instanceVariableNames:'tarArchiver tarFile' + classVariableNames:'' + poolDictionaries:'' + privateIn:Archiver +! + + +!Archiver class methodsFor:'instance creation'! + +with:aFilename + + | instance | + + instance := self new. + instance fileName:aFilename. + ^ instance +! ! + +!Archiver class methodsFor:'classAccess'! + +gzipArchive + + ^ GZipArchive +! + +tarArchive + + ^ TarArchive +! + +tarGZipArchive + + ^ TarGZipArchive +! ! + +!Archiver class methodsFor:'common options'! + +MinusSign + + ^ $- +! + +PipeSign + + ^ $> +! ! + +!Archiver methodsFor:'accessing'! + +errorStream + "return the value of the instance variable 'errorStream' (automatically generated)" + + ^ errorStream +! + +errorStream:something + "set the value of the instance variable 'errorStream' (automatically generated)" + + errorStream := something. +! + +fileName + "return the value of the instance variable 'fileName' (automatically generated)" + + ^ fileName +! + +fileName:something + "set the value of the instance variable 'fileName' (automatically generated)" + + fileName := something. +! + +outStream + "return the value of the instance variable 'outStream' (automatically generated)" + + ^ outStream +! + +outStream:something + "set the value of the instance variable 'outStream' (automatically generated)" + + outStream := something. +! + +process + "return the value of the instance variable 'process' (automatically generated)" + + ^ process +! + +process:something + "set the value of the instance variable 'process' (automatically generated)" + + process := something. +! + +synchron + "return the value of the instance variable 'synchron' (automatically generated)" + + ^ synchron +! + +synchron:something + "set the value of the instance variable 'synchron' (automatically generated)" + + synchron := something. +! + +temporaryDirectory + "return the value of the instance variable 'temporaryDirectory' (automatically generated)" + + temporaryDirectory isNil ifTrue:[ + temporaryDirectory := Filename newTemporary. + temporaryDirectory makeDirectory. + ]. + ^ temporaryDirectory +! ! + +!Archiver methodsFor:'actions'! + +addFilesToArchiv:colOfFiles + + self subclassResponsibility. +! + +extractTo:aColOfFiles + + self subclassResponsibility. +! + +listFilesFromArchiv + + self subclassResponsibility. +! + +removeFilesFromArchiv:aColOfFiles + + self subclassResponsibility. +! ! + +!Archiver methodsFor:'actions private'! + +removeTemporaryDirectory + + | tmp | + + temporaryDirectory notNil ifTrue:[ + tmp := self temporaryDirectory. + (FileDirectory directoryNamed:(tmp directory)) removeDirectory:tmp baseName. + temporaryDirectory := nil. + ]. +! + +stopProcess + + process notNil ifTrue:[ + process terminateWithAllSubprocesses. + process waitUntilTerminated. + ]. +! ! + +!Archiver methodsFor:'command execution'! + +executeCommand:cmd directory:aDirectory + + + synchron isNil ifTrue:[synchron := true]. + synchron ifTrue:[ + OperatingSystem + executeCommand:cmd + inputFrom:nil + outputTo:outStream + errorTo:errorStream + inDirectory:aDirectory + lineWise:true + onError:[:status| false]. + ] ifFalse:[ + process := Process for:[ + [ + OperatingSystem + executeCommand:cmd + inputFrom:nil + outputTo:outStream + errorTo:errorStream + inDirectory:aDirectory + lineWise:true + onError:[:status| false]. + ] + valueNowOrOnUnwindDo:[ + process := nil. + ]. + + ] priority:(Processor systemBackgroundPriority). + process name:('ArchivFileCommand command >', cmd). + process resume. + ] +! + +outStream:aOutStream errorStream:aErrorStream + + outStream := aOutStream. + errorStream := aErrorStream. +! + +outStream:aOutStream errorStream:aErrorStream synchron:aBoolean + + outStream := aOutStream. + errorStream := aErrorStream. + synchron := aBoolean +! ! + +!Archiver methodsFor:'initialization & release'! + +release + + self stopProcess. + self removeTemporaryDirectory. +! ! + +!Archiver::GZipArchive class methodsFor:'zip archiv command options'! + +GZipArchivFileOption + ^ 'f' +! + +GZipArchivUnzipCommand + ^ 'gunzip' +! + +GZipArchivWriteToStdioOption + ^ 'c' +! + +GZipArchivZipCommand + ^ 'gzip' +! ! + +!Archiver::GZipArchive methodsFor:'actions'! + +unzipTo:aDirectory + + | cmd file newFile| + + (aDirectory exists not) ifTrue:[ + DialogBox warn:'cant unzip to not existing directory ', aDirectory asString. + ]. + (aDirectory isDirectory not) ifTrue:[ + DialogBox warn:'cant unzip to file ', aDirectory asString. + ]. + file := self fileName. + (file directory asString = aDirectory asString) ifFalse:[ + file copyTo:(aDirectory construct:(file baseName)). + ]. + newFile := aDirectory construct:(file baseName). + cmd := self getUnzipCommandForFile:newFile. + self executeCommand:cmd directory:aDirectory. +! + +zipFile:aFile to:newFile + + | cmd directory| + + directory := newFile directory. + (directory exists not) ifTrue:[ + DialogBox warn:'cant unzip to not existing directory ', directory asString. + ]. + (directory isDirectory not) ifTrue:[ + DialogBox warn:'cant unzip to file ', directory asString. + ]. + cmd := self getZipCommandForFile:aFile to:newFile. + self executeCommand:cmd directory:directory. + newFile exists ifTrue:[ + self fileName:newFile. + ]. +! ! + +!Archiver::GZipArchive methodsFor:'command strings'! + +getUnzipCommand + + | stream cmd| + + stream := WriteStream on:''. + stream nextPutAll:self class GZipArchivUnzipCommand. + stream space. + stream nextPutAll:self fileName baseName. + cmd := stream contents. + stream close. + ^ cmd +! + +getUnzipCommandForFile:aFileName + + | stream cmd| + + stream := WriteStream on:''. + stream nextPutAll:self class GZipArchivUnzipCommand. + stream space. + stream nextPutAll:aFileName asString. + cmd := stream contents. + stream close. + ^ cmd +! + +getZipCommandForFile:aFileName + + | stream cmd| + + stream := WriteStream on:''. + stream nextPutAll:self class GZipArchivZipCommand. + stream space. + stream nextPutAll:aFileName asString. + cmd := stream contents. + stream close. + ^ cmd +! + +getZipCommandForFile:aFile to:newFile + | stream cmd| + + stream := WriteStream on:''. + stream nextPutAll:self class GZipArchivZipCommand. + stream space. + stream nextPut:self class MinusSign. + stream nextPutAll:self class GZipArchivWriteToStdioOption. + stream space. + stream nextPutAll:aFile asString. + stream space. + stream nextPut:self class PipeSign. + stream space. + stream nextPutAll:newFile asString. + cmd := stream contents. + stream close. + ^ cmd +! ! + +!Archiver::TarArchive class methodsFor:'command strings'! + +TarArchivAddOption + ^ 'r' +! + +TarArchivCommand + ^ 'tar' +! + +TarArchivDeleteOption + ^ '--delete' +! + +TarArchivFileOption + ^ 'f' +! + +TarArchivListContentsOption + ^ 't' +! + +TarArchivListOptions + ^ self TarArchivListContentsOption , self TarArchivVerboseOption + , self TarArchivFileOption +! + +TarArchivListZippedOptions + ^ self TarArchivListContentsOption , self TarArchivVerboseOption + , self TarArchivFileOption , self TarArchivZipOption +! + +TarArchivUnpackInDirectoryOption + ^ '-C ' +! + +TarArchivUnpackOption + ^ 'x' +! + +TarArchivVerboseOption + ^ 'v' +! + +TarArchivZipOption + ^ 'z' +! ! + +!Archiver::TarArchive methodsFor:'actions'! + +addFilesToArchiv:colOfFiles + + | cmd tempDir archivFile archivInTemp| + + tempDir := self temporaryDirectory. + archivFile := self fileName. + archivInTemp := tempDir construct:(archivFile baseName). + "/ copy files to be added to tempDir + colOfFiles do:[ :file | + file recursiveCopyTo:(tempDir construct:(file baseName)) + ]. + + "/ copy tar archiv to tempDir + archivFile copyTo:archivInTemp. + + "/ addFiles to the tar archive + cmd := self getAddFilesToTarArchiveCommandForArchiv:archivInTemp with:colOfFiles. + self executeCommand:cmd directory:tempDir. + + "/ copy tar archiv back + archivInTemp copyTo:(self fileName). +! + +extractTo:aDirectory + + ^ self extractTo:aDirectory with:nil +! + +extractTo:aDirectory with:files + + |execDir cmd| + + execDir := self fileName directory. + cmd := self getExtractSelectedFilesCommandForDirectory:aDirectory withSelection:files. + self executeCommand:cmd directory:execDir. +! + +extractWithOutDirectoryTo:aDirectory with:files + + |execDir tempDir tempFile| + + execDir := self fileName directory. + tempDir := self temporaryDirectory. + self extractTo:tempDir with:files. + files do:[ : aFileString | + tempFile := self temporaryDirectory construct:aFileString. + tempFile exists ifTrue:[ + tempFile recursiveCopyTo:(aDirectory construct:(aFileString fileName asFilename baseName)). + ]. + ]. +! + +listFilesFromArchiv + + self listFilesFromArchiv:nil +! + +listFilesFromArchiv:newColOfFiles + + | cmd dir| + + self fileName isNil ifTrue:[ ^ self]. + dir := self fileName directory. + cmd := self getFileListFromArchivCommand:newColOfFiles. + self executeCommand:cmd directory:dir +! + +removeFilesFromArchiv:aColOfFiles + + |cmd| + + cmd := self getRemoveFilesFromTarArchivFor:aColOfFiles. + self executeCommand:cmd directory:(self fileName directory). +! ! + +!Archiver::TarArchive methodsFor:'command strings'! + +getAddFilesToTarArchiveCommand:aColOfFiles + |filename cmd stream| + + filename := self fileName. + filename exists ifTrue:[ + stream := WriteStream on:''. + stream nextPutAll:self class TarArchivCommand. + stream space. + stream nextPutAll:self class TarArchivAddOption. + stream nextPutAll:self class TarArchivFileOption. + stream space. + stream nextPutAll:filename asString. + aColOfFiles do:[:el | + stream space. + stream nextPutAll:(el asString) + ]. + cmd := stream contents + ]. + ^ cmd +! + +getAddFilesToTarArchiveCommandForArchiv:archivFile with:aColOfFiles + | cmd stream| + + archivFile exists ifTrue:[ + stream := WriteStream on:''. + stream nextPutAll:self class TarArchivCommand. + stream space. + stream nextPutAll:self class TarArchivAddOption. + stream nextPutAll:self class TarArchivFileOption. + stream space. + stream nextPutAll:archivFile asString. + aColOfFiles do:[:el | + stream space. + stream nextPutAll:(el baseName) + ]. + cmd := stream contents + ]. + ^ cmd +! + +getExtractSelectedFilesCommandForDirectory:dir withSelection:sel + | stream cmd| + + stream := WriteStream on:''. + stream nextPutAll:self class TarArchivCommand. + stream space. + stream nextPutAll:self class TarArchivUnpackOption. + stream nextPutAll:self class TarArchivFileOption. + stream space. + stream nextPutAll:self fileName asString. + stream space. + stream nextPutAll:self class TarArchivUnpackInDirectoryOption. + stream space. + stream nextPutAll:dir asString. + sel notNil ifTrue:[ + sel do:[:el | + stream space. + stream nextPutAll:(el fileName asString) + ]. + ]. + cmd := stream contents. + stream close. + ^ cmd +! + +getFileListFromArchivCommand:aColOfFiles + + | stream cmd| + + stream := WriteStream on:''. + stream nextPutAll:self class TarArchivCommand. + stream space. + stream nextPutAll:self class TarArchivListOptions. + stream space. + stream nextPutAll:self fileName baseName. + aColOfFiles notNil ifTrue:[ + aColOfFiles do:[:el | + stream space. + stream nextPutAll:(el baseName) + ] + ]. + cmd := stream contents. + stream close. + ^ cmd +! + +getRemoveFilesFromTarArchivFor:sel + | stream filename| + + filename := self fileName. + filename exists ifTrue:[ + stream := WriteStream on:''. + stream nextPutAll:self class TarArchivCommand. + stream space. + stream nextPutAll:self class TarArchivDeleteOption. + stream space. + stream nextPut:self class MinusSign. + stream nextPutAll:self class TarArchivFileOption. + stream space. + stream nextPutAll:filename asString. + sel do:[:el | + stream space. + stream nextPutAll:el + ]. + ^ stream contents + ] +! ! + +!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 := TarArchive with:tarFile. +! ! + +!Archiver::TarGZipArchive methodsFor:'actions'! + +addFilesToArchiv:colOfFiles + + self setCommandOptions. + tarArchiver addFilesToArchiv:colOfFiles. + self synchronize. +! + +extractTo:aDirectory + + self extractTo:aDirectory with:nil. +! + +extractTo:aDirectory with:col + + self setCommandOptions. + tarArchiver extractTo:aDirectory with:col. +! + +extractWithOutDirectoryTo:aDirectory with:files + + self setCommandOptions. + tarArchiver extractWithOutDirectoryTo:aDirectory with:files. +! + +listFilesFromArchiv + + self listFilesFromArchiv:nil +! + +listFilesFromArchiv:newColOfFiles + + self setCommandOptions. + ^ tarArchiver listFilesFromArchiv:newColOfFiles. +! + +removeFilesFromArchiv:aColOfFiles + + self setCommandOptions. + tarArchiver removeFilesFromArchiv:aColOfFiles. + self synchronize. +! ! + +!Archiver::TarGZipArchive methodsFor:'actions private'! + +setCommandOptions + + tarArchiver outStream:(self outStream). + tarArchiver errorStream:(self errorStream). + tarArchiver synchron:(self synchron). +! + +synchronize + + |gzipArchiver| + + gzipArchiver := GZipArchive with:nil. + gzipArchiver zipFile:(tarArchiver fileName) to:(self fileName). +! ! + +!Archiver::TarGZipArchive methodsFor:'initialization & release'! + +release + + super release. + tarArchiver release. +! ! + +!Archiver class methodsFor:'documentation'! + +version + ^ '$Header$' +! !